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 schließt sich nicht mit Close (https://www.delphipraxis.net/91813-form-schliesst-sich-nicht-mit-close.html)

messie 10. Mai 2007 11:21


Form schließt sich nicht mit Close
 
Hallo,

ich beschreibe ein Form im OnShow. Geht dabei etwas schief, soll das Form über einen Timer geschlossen werden. Habe ich schon häufig gemacht (ist nicht besonders schön aber einfach), jetzt funktioniert das nicht.

Was wird denn alles abgearbeitet beim FormClose ausser FormCloseQuery?

Danke, Messie

marabu 10. Mai 2007 11:43

Re: Form schließt sich nicht mit Close
 
Hallo,

warum nimmst du einen Timer? Kannst du nicht einfach die Methode Release() anstatt Close() aufrufen?

Grüße vom marabu

Matze 10. Mai 2007 11:46

Re: Form schließt sich nicht mit Close
 
Moin

um dennoch auf deine Frage zurückzukommen:
Zitat:

Zitat von messie
Was wird denn alles abgearbeitet beim FormClose ausser FormCloseQuery?

Siehe Ablauf der Events beim Erzeugen/Schliessen eines Formulares.

daddy 10. Mai 2007 11:51

Re: Form schließt sich nicht mit Close
 
Was prüfst Du denn im "OnShow"? Lässt sich das nicht auch schon im "OnCreate" prüfen? Falls ja, könntest Du für den Fall, dass Du das Formular gar nicht anzeigen möchtest, eine Exception auslösen. Die musst Du dann nur im aufrufenden Formular abfangen. Dies führt insgesamt zu einer ruhigeren Bildschirmndarstellung, da das Formular erst gar nicht erscheint.

Gruß Daddy

Phoenix 10. Mai 2007 12:03

Re: Form schließt sich nicht mit Close
 
Wenn Du ein MDI-Form hast, dann geht close nicht. Dann musst Du den DialogResult setzen und die Action im OnCloseQuery auf caFree.

messie 10. Mai 2007 15:04

Re: Form schließt sich nicht mit Close
 
Zitat:

Zitat von marabu
warum nimmst du einen Timer? Kannst du nicht einfach die Methode Release() anstatt Close() aufrufen?

Release kann ich auch nicht im OnShow aufrufen. Jedenfalls sagte mir das die Fehlermeldung, als ich es probiert habe. Danach wurde das Form gezeigt. Ausserdem hätte ich mit dem Befehl die Routinen aus OnClose nochmal ins OnShow kopieren müssen.
Zitat:

Zitat von daddy
Lässt sich das nicht auch schon im "OnCreate" prüfen?

Nee, die Daten werden direkt vor dem Aufruf des Forms festgelegt
Zitat:

Zitat von Phoenix
Wenn Du ein MDI-Form hast...

Habe ich nicht.

Zumal das mit dem timer schon häufig funktioniert hat, auch wenns nicht schön ist weil es doch kurz flackert. Aber ich zoome das Fenster sowieso im OnResize auf Bildschirmgröße, da flackerts gelegenlich sowieso. Vielleicht haut mir das auch dazwischen...
Eine Funktion Form.OnShowQuery wäre das richtige.

Grüße, Messie

Gremlin 10. Mai 2007 15:28

Re: Form schließt sich nicht mit Close
 
Warum schickst du dir nicht selbst im FormShow eine Message, die dann dein FormClose aufrufen kann, somit sparst du dir den Timer?

BTW: Eigentlich sollte vor dem Anzeigen der Form geprüft werden, ob alle Anforderungen erfüllt werden.
Ist dies nicht möglich, dann sollte dies wenigstens nach dem FormShow im Formular passieren und entsprechend
ein Hinweis auf mögliche Fehlerursachen angezeigt werden.

messie 10. Mai 2007 15:38

Re: Form schließt sich nicht mit Close
 
Zitat:

Zitat von Gremlin
Warum schickst du dir nicht selbst im FormShow eine Message, die dann dein FormClose aufrufen kann, somit sparst du dir den Timer?

Weil ich das noch nie gemacht habe....

daddy 10. Mai 2007 15:41

Re: Form schließt sich nicht mit Close
 
Was meinst Du mit:

Zitat:

Nee, die Daten werden direkt vor dem Aufruf des Forms festgelegt
Falls es im "Create" noch nicht geht, könntest Du ja evtl. auch "Loaded" überschreiben und dort bei Bedarf eine Exception auslösen. Wovon ist denn die Anzeige des Formulars abhängig?

Gruß Daddy

Gremlin 10. Mai 2007 15:58

Re: Form schließt sich nicht mit Close
 
Zitat:

Zitat von messie
Zitat:

Zitat von Gremlin
Warum schickst du dir nicht selbst im FormShow eine Message, die dann dein FormClose aufrufen kann, somit sparst du dir den Timer?

Weil ich das noch nie gemacht habe....


Delphi-Quellcode:
const
  WM_CloseMeNow = WM_USER+1;

type
  [...]
  private
    procedure FormCloseMeNow(var Msg:TMessage); message WM_CloseMeNow;
  public
  [...]

procedure TForm1.FormShow(Sender: TObject);
begin
  [...]
  PostMessage(Handle, WM_CloseMeNow, 0, 0);
end;

procedure TForm1.FormCloseMeNow(var Msg:TMessage);
begin
  Close;
end;

messie 11. Mai 2007 08:24

Re: Form schließt sich nicht mit Close
 
Ich habe jetzt mal die Message ausprobiert. Flackert ähnlich wie beim Timer in einem Testprojekt.
Mein Fenster schließt sich aber immer noch nicht. Ich habe herausgefunden, daß es am Form.Resize liegt. Dort wird ein TFormResizer zum Zoomen der Komponenten von kalmi01
dynform
verwendet. Wenn ich das deaktiviere, schließt auch mein Fenster.

Kann ich dieselbe Message dort auch verwenden um die Ausführung des FormResizers zu unterdrücken? Denn der scheint ja die vorhandenen Messages abzuschießen.

Grüße, Messie

OT: upps, warum sieht denn der Link so aus?

[edit=Luckie]Link repariert. Mfg, Luckie[/edit]

Luckie 11. Mai 2007 09:19

Re: Form schließt sich nicht mit Close
 
Zitat:

ich beschreibe ein Form im OnShow.
Was heiß das?

messie 11. Mai 2007 09:26

Re: Form schließt sich nicht mit Close
 
Zitat:

Zitat von Luckie
Zitat:

ich beschreibe ein Form im OnShow.
Was heiß das?

Das heißt, daß ich Daten aus einer Datei an ein Objekt übergebe. Im OnShow werden die Daten dann an die Steuerelemente übergeben. OnShow deshalb, weil das Form von unterschiedlichen Stellen mit unterschiedlichen Daten aufgerufen werden kann. Ich schaue gerade, ob ich das so auslagern kann, daß ich es vor dem Form.Show aufrufe ohne Redundanz zu erzeugen.

Es bleibt aber weiter für mich interessant, wie und wo die Message zum Schließen des Fensters eingefangen wird.

Grüße, Messie

Gremlin 11. Mai 2007 09:33

Re: Form schließt sich nicht mit Close
 
Ich hab jetzt mal die Resize-Componente installiert, verstehe aber
nicht wie man diese anwendet oder was diese bewirken soll.
Das Form schliesst sich trotzdem, wird aber kurz angezeigt (Flacker-Effekt),
was aber normal ist. Wie übergibst du die Werte an das Formular?

Beispiel:

Delphi-Quellcode:

with TEditForm.Create(self) do begin
  try
    <Properties aus Form> := <Deine Werte>;
    if BedingungenZurAnzeigeDerFormOK then begin
      if (ShowModal=mrOK) then...
    end;
  finally
    Free;
  end;
end;
Die Methode BedingungenZurAnzeigeDerFormOK prüft vor der Anzeige der Form
ob es überhaupt Sinn macht, diese mit den übergebenen Werten anzuzeigen.


Vielleicht könntest du deine Form als Anhang zur Ansicht hochladen?


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

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