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

user profile iconBenBE 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// OnPaint nicht erneut ausführen
  // hier den Autostart-Code einfügen
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, 00);

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;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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 + 30000);
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...