Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Form schließen in FormActivate funzt nicht (https://www.delphipraxis.net/151279-form-schliessen-formactivate-funzt-nicht.html)

devidespe 11. Mai 2010 10:15


Form schließen in FormActivate funzt nicht
 
Hallo,

ich rufe ein Formular aus einer Hauptanwendung auf, welches direkt innerhalb von FormActivate mit der Ausführung verschiedener Tätigkeiten beginnt. Nach Abschluss der Tätigkeiten möchte ich das Form automatisch schließen lassen. Alle Versuche, dies nach den Tätigkeiten am Ende von FormActivate durchzuführen, schlagen fehl. Das Formular bleibt weiter stehen.

Ausprobiert habe ich:
  • Close
  • Destroy
  • Free(Self)
  • FreeAndNil(Self)

Wie kann ich das Formular automatisch schließen lassen?

jaenicke 11. Mai 2010 10:28

Re: Form schließen in FormActivate funzt nicht
 
So ist das auch nicht gedacht. OnActivate wird ausgelöst, wenn das Fenster angeklickt wird, also den Fokus bekommt (jedesmal, wenn das passiert!). Und wozu soll es da direkt geschlossen werden?
Das hört sich nach einem ziemlich ungünstigen Konzept an.

Was hast du denn vor?
Soll auf dem Formular ein Fortschritt angezeigt und dieses dann geschlossen werden? Dann steuere das Formular von außen, also sowohl die Anzeige als auch die Aktualisierung auf dem Formular. Oder löse die Aktionen explizit aus. Sowas in OnActivate zu schreiben ist aua...

hoika 11. Mai 2010 10:58

Re: Form schließen in FormActivate funzt nicht
 
Hallo,

Delphi-Quellcode:
PostMessage(Handle, WM_CLOSE, 0, 0);

siehe dazu auch

1

#7 meiner ;)



Heiko

Andreas Schilling 11. Mai 2010 11:02

Re: Form schließen in FormActivate funzt nicht
 
Diese Tätigkeiten in extra Procedure und dann
Delphi-Quellcode:
try
  Form1.create;
  Form1.procedure; // Ausführen der Procedure
finally
  Form1.free;
  Form1 := nil;
end;
So mache ich es, wenn ich etwas von einer anderen Form ausführen lassen, dieses Formular aber nicht sehen will.

jaenicke 11. Mai 2010 12:57

Re: Form schließen in FormActivate funzt nicht
 
Zitat:

Zitat von Andreas Schilling
Delphi-Quellcode:
try
  Form1.create;
  Form1.procedure; // Ausführen der Procedure
finally
  Form1.free;
  Form1 := nil;
end;

Du meintest wohl:
Delphi-Quellcode:
Form1 := TForm1.Create(Self);
try
  Form1.MyProcedure; // Ausführen der Procedure
finally
  FreeAndNil(Form1); // richtig, nicht aufgepasst...
end;
;-)
So geht es im Grunde auch, wenn das Formular als Statusfenster dienen soll. Nur dass man dann den Status einfach an das Formular weitergibt statt dort eine Prozedur nur aufzurufen.

hoika 11. Mai 2010 13:36

Re: Form schließen in FormActivate funzt nicht
 
Hallo,

dazu braucht man dann aber "procedure" ein eigenes Form (ja ja, ginge auch mit mehreren Procs in einem Form).
Ich hatte mir das damals so gebastelt, dass ich ein semimodales Form habe (mit Label, Progressbar usw.)
und der eigentliche "Tuwas"-Code in den einzelnen Units/Forms bleibt.


Heiko

devidespe 11. Mai 2010 14:22

Re: Form schließen in FormActivate funzt nicht
 
Zitat:

Zitat von jaenicke
So ist das auch nicht gedacht. OnActivate wird ausgelöst, wenn das Fenster angeklickt wird, also den Fokus bekommt (jedesmal, wenn das passiert!). Und wozu soll es da direkt geschlossen werden?
Das hört sich nach einem ziemlich ungünstigen Konzept an.

Was hast du denn vor?
Soll auf dem Formular ein Fortschritt angezeigt und dieses dann geschlossen werden? Dann steuere das Formular von außen, also sowohl die Anzeige als auch die Aktualisierung auf dem Formular. Oder löse die Aktionen explizit aus. Sowas in OnActivate zu schreiben ist aua...

Das besagte Formular wird an 2 Stellen benutzt, und bei der 2. Stelle wird es nicht automatisch geschlossen. Der Anwender kann hier mittels Schließen-Schalter selbst das Formular schließen. Das funktioniert auch soweit ganz gut.

Für den 1. Aufruf allerdings soll das Formular nach der Abarbeitung der Tests selbst geschlossen werden. Dazu deaktiviere ich die Schalter im unteren Formularbereich und versuche den bereits genannten Schließen-Mechanismus. Bisher ohne Erfolg.

Die Verwendung der OnActivate-Eigenschaft kommt daher, weil das Formular nach der Darstellung auf dem Hauptformular verschiedene Tätigkeiten durchführt, deren Status in einer Listbox angezeigt werden. In OnCreate würde das Formular noch nicht sichtbar sein, deswegen die Verwendung von OnActivate.

devidespe 11. Mai 2010 14:41

Re: Form schließen in FormActivate funzt nicht
 
Zitat:

Zitat von jaenicke
Du meintest wohl:
Delphi-Quellcode:
Form1 := TForm1.Create(Self);
try
  Form1.MyProcedure; // Ausführen der Procedure
finally
  Form1.FreeAndNil;
end;

Das wäre auch eine Variante, aber ich muss nach dem Form1.Create immer Form1.Show bzw. Form1.ShowModal aufrufen, sonst erscheint das Formular nicht auf dem Bildschirm. Das ist mir schon mal schleierhaft...

jaenicke 11. Mai 2010 15:26

Re: Form schließen in FormActivate funzt nicht
 
Ja, er hatte jetzt ein Beispiel gemacht für nicht anzeigen. Aber das geht schon auch:
Delphi-Quellcode:
Form1 := TForm1.Create(Self);
try
  Form1.Show;
  Step1;
  Form1.UpdateStatus(20, 'Kopiere Daten...');
  Step2;
  Form1.UpdateStatus(40, 'Mache was anderes...');
  Step3;
  Form1.UpdateStatus(70, 'Fast fertig.');
  Step4;
  Form1.UpdateStatus(100, 'Fertig');
finally
  FreeAndNil(Form1); // richtig, nicht aufgepasst...
end;
So mache ich das immer. Erstens bekomme ich dann keine Probleme durch unübersichtliche Beziehungen zwischen den Formularen und Quelltext in beiden Richtungen und zweitens wird es so einfach nach der Anzeige usw. wieder geschlossen und gut ists.

DeddyH 11. Mai 2010 16:16

Re: Form schließen in FormActivate funzt nicht
 
Zitat:

Delphi-Quellcode:
Form1.FreeAndNil;

Seit wann gibt es denn diese Syntax (bzw. Methode)? Ich kenne nur
Delphi-Quellcode:
FreeAndNil(Form1);
:gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:09 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz