Delphi-PRAXiS

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 zur Laufzeit schließen (https://www.delphipraxis.net/36133-form-zur-laufzeit-schliessen.html)

LoL 16. Dez 2004 10:43


Form zur Laufzeit schließen
 
Folgendes:

Ich erzeuge ein Form zur Laufzeit:
Delphi-Quellcode:
frm_GraphEdit := TForm.Create(nil);
  with frm_GraphEdit do
    begin
      name := 'frm_GraphEdit';
      Position := poScreenCenter;
      BorderStyle := bsDialog;
      Width := 200;
      OnDestroy := frm_GraphEditClose;
    end;
frm_GraphEdit.ShowModal;
mit einem button drauf:
Delphi-Quellcode:
btbtn_abort := TBitBtn.Create(frm_GraphEdit);
  With btbtn_abort do
    begin
      Parent := frm_GraphEdit;
      Name := 'btbtn_abort';
      OnClick := CloseFrm_GraphEdit;
    end;
Folgendes Ereignis wird ausgelöst wenn man auf den Botton klickt:
Delphi-Quellcode:
procedure TFrm_main.CloseFrm_GraphEdit(Sender : TObject);
begin
  frm_GraphEdit.Destroy;
end;
....
procedure TFrm_main.frm_GraphEditClose(Sender : TObject);
begin
  frm_GraphEdit := nil;
end;
Wenn ich das Form mit ShowModal aufrufe und schließen möchte bekomme ich folgende Exception:
"Invalid Variant Operation"
Wenn ich aber das Form mit Show aufrufe nicht :wall: Woran kann das liegen?

LoL 16. Dez 2004 11:01

Re: Form zur Laufzeit schließen
 
ich habe eine Lösung weis aber noch nicht genau warum sie funktioniert:

ich rufe beim Drücken auf den Button nicht
Delphi-Quellcode:
  frm_GraphEdit.Destroy;
sondern
Delphi-Quellcode:
  frm_GraphEdit.Release;
Release gibt das Formular erst frei, nachdem die Ausführung der Ereignisbehandlungsroutinen des Formulars und seiner untergeordneten Komponenten beendet ist. Die Methode stellt auch sicher, daß alle Botschaften in der Ereigniswarteschlange des Formulars vor dessen Freigabe bearbeitet werden. In allen Ereignisbehandlungsroutinen sollte Release anstelle von Free verwendet werden, um Zugriffsverletzungen zu vermeiden.

Mist die Hilfe sollte man mal Lesen:
Rufen Sie Destroy nicht direkt auf. Verwenden Sie statt dessen die Methode Release, die eine CM_RELEASE-Botschaft an das Formular sendet. In der zugehörigen Behandlungsroutine wird dann die Methode Free aufgerufen, die ihrerseits Destroy aufruft.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:12 Uhr.

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