Entwickler-Ecke
Sonstiges (Delphi) - Close funktioniert nicht
Chatfix - Mi 19.10.05 11:49
Titel: Close funktioniert nicht
Hallo,
heute bin ich auf ein Problem gestoßen, das hat ich noch nie...
Ich habe ein Form das vom MainForm gleich am Anfang mit ShowModal aufgerufen wird. Auf dem Form ist ein Button mit der OnClick-Aktion "Close".
Das funktioniert auch, also das Form schliest sich und das MainForm macht weiter.
Wenn ich nun in dem zweiten Form im OnCreate oder OnActivate schon ein Close ausführe ignoriert der diesen Befehl einfach...
Wisst ihr woran das liegen könnte?!
jro - Mi 19.10.05 12:03
Hi,
im OnCreate bzw. im OnActivate ist das Formular noch gar nicht sichtbar (onShow wird erst danach ausgeführt), darum kann das Form auch nicht geschlossen werden.
D.h. entweder du führst close im OnShow aus oder machst ein destroy. ;)
Gruß
Jaqueline
Chatfix - Mi 19.10.05 12:08
Also im OnShow wird mein Close auch ignoriert.
Ein Destroy löst eine Exception aus.
Mir war aber so das ich Close schonmal im OnActivate hatte... Komisch komisch...
BenBE - Mi 19.10.05 19:39
Zwei Dinge:
Show und Hide (=Close, in groben Zügen) sind in OnCreate und OnDestroy verboten (Status-Konflikte; VCL ist Kacke ;-)) Daher das Problem:
Zwei Möglichkeiten:
1. Release
2. PostMessage(WM_CLOSE);
Ersteres weiß ich ATM nicht, ob es Probleme verursacht; sollte es aber eigentlich nicht.
Zweiteres wird Dir AUF JEDEN FALL die Form kurz anzeigen. Ein SendMessage funktioniert NICHT!
Christian S. - Mi 19.10.05 19:42
Wieso erzeugst Du eine Form, um sie im OnCreate wieder schließen zu wollen? :gruebel: Führe die Abfragen, die zum Schließen führen, vorher aus und erstelle die Form gar nicht erst.
AndyB - Mi 19.10.05 19:47
BenBE hat folgendes geschrieben: |
Status-Konflikte; VCL ist Kacke ;-) |
So. So. Ich denke eher, dass das ein Denkfehler von manchen ist. Wenn OnShow ausgeführt wird, dann wurde vorher ein Visible:=True, oder Show() ausgeführt. Warum sollte man es dann in OnShow verstecken wollen, wenn man es doch gerade anzeigen will?
Das einzige was mir an der VCL in diesem Zusammenhang abgeht, ist ein OnAfterShow Ereignis, in welchem man Autostart-Aktionen durchführen kann. Aber dem kann man sich mit OnPaint abhilfe schaffen:
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure TForm1.FormPain(Sender: TObject); begin OnPaint := nil; end; |
matze.de - Mi 19.10.05 20:20
Schonmal mit "CanClose" abgefragt? Ich kann BenBE nur zustimmen. Ach ja,
3. SendMessage(self.Handle, WM_CLOSE, 0, 0);
mfg matze
Lannes - Mi 19.10.05 20:47
Hallo,
OnAfterShow :?: :arrow:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| private procedure WmAfterShow(var Msg: TMessage); message WM_USER + 300; public end;
var Form1: TForm1;
implementation
{$R *.DFM} procedure TForm1.WmAfterShow(var Msg: TMessage); begin Showmessage('Abarbeitung von OnShow ist beendet'); end;
procedure TForm1.FormShow(Sender: TObject);
begin PostMessage(Self.Handle, WM_USER + 300, 0, 0); end; |
Amateur - Mi 19.10.05 23:27
im onactivate geht close auf jeden fall.... hab ich schon getestet... aber die frage ist ja ob du beide forms closen willst oder nur die zweite form... wenn das komplette programm musste form1.close machen. ansonsten im onactivate geht es sicher... im oncreate nicht
Chatfix - Do 20.10.05 07:55
Mir war eben auch so das Close im OnActivate geht, hier gehts allerdings nicht...
Nein ich will nur das zweite Fenster schliesen und ich habe es jetzt so gelöst wie Christian gesagt hat, ist zwar etwas umständlicher für mich aber geht.
Vielen Dank!
Amateur - Do 20.10.05 18:02
welche delphi version benutzt du? bei meinem delphi 6 geht es im onactivate....
Chatfix - Do 20.10.05 23:34
Delphi 7 und ich bin mir sicher das ich das auch schonmal gemacht habe...
Naja egal jeztt...
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!