AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Abarbeitungsreihenfolge Modale Ereignisse

Ein Thema von DSCHUCH · begonnen am 26. Feb 2013 · letzter Beitrag vom 27. Feb 2013
Antwort Antwort
DSCHUCH

Registriert seit: 6. Jun 2007
Ort: Dresden
185 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

Abarbeitungsreihenfolge Modale Ereignisse

  Alt 26. Feb 2013, 11:20
Hallo,

ich habe eine Form, welche Modal geöffnet wird. Diese hat 2 Buttons mit mrOk und mrAbort. Es gibt ein Ereignis "OnClose" mit Action=caFree;

Wenn ich jetzt folgenden Code aufrufe:

Delphi-Quellcode:
If MyModalForm.ShowModal=mrOk then
   MyModalForm.GetUserinput;
Wird ja durch das ModalResult offenbar zuerst die Form geschlossen, mein Code weiterabgearbeitet und anschliessend erst das Close mit caFree aufgerufen. (durch Debugmessages soweit ausgetestet)

Wie ist das technisch gelöst? Das Close Ereignis scheint hier irgendwie zeitversetzt - nach dem eigenen Code aufgerufen zu werden? Wird dies über Messages gelöst?

Theoretisch könnte ich ja auch:

Delphi-Quellcode:
If MyModalForm.ShowModal=mrAbort then
   MyModalForm.Close; // Free????? => Unterschied?
aufrufen, wäre dies dann möglicherweise ein Doppelaufruf des Destruktors, da das eigentliche ModalResult auch noch versucht die Form zu Closen?

Geändert von DSCHUCH (26. Feb 2013 um 11:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.130 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Abarbeitungsreihenfolge Modale Ereignisse

  Alt 26. Feb 2013, 11:36
Das cafree im onClose ist eher für MDIClient-Fenster oder nicht modale Fesnter gedacht...

Modale Fenster würde ich immer selber mit einem .free ausstatten...


Delphi-Quellcode:

MyWin := TMyWin.Create(Application);

try
  if MyWin.Showmodal = MROK then
    MyWin.Foo;

finally
  MyWin.free;
end.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.168 Beiträge
 
Delphi 12 Athens
 
#3

AW: Abarbeitungsreihenfolge Modale Ereignisse

  Alt 26. Feb 2013, 12:35
Grundsätzlich darf sich das Fenster "niemals" selber freigeban (caFree oder Dergleichen) wenn nach dem ShowModal nochmal auf das Fenster, bzw. die Form-Variable zugegriffen wird!
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Abarbeitungsreihenfolge Modale Ereignisse

  Alt 26. Feb 2013, 15:10
Ich greife hier das Beispiel von Mavarik auf und habe dazu noch Ergänzungen:
Delphi-Quellcode:
var
  MyWin : TMyWin; // *1
begin
  MyWin := TMyWin.Create(nil {*2});
  try
    MyWin.Property1 := ...; // *3
    MyWin.Property2 := ...;
    if MyWin.Showmodal = MROK then /* 4
    begin
      x := MyWin.Property1; // *5
      y := MyWin.Property2;
    end;
  finally
    MyWin.free;
end.
*1) man sollte immer eine lokale Variable für das modale Formular verwenden
die globale Variable, die Delphi imer automatisch anlegt sollte man auskommentieren.
*2) immer nil als Owner übergeben. Übergibt man Application als Owner ist das messbar langsamer
weil unter Umständen mehrere 100 - 1000 Mal die Methode Notify aufgerufen wird.
*3) optional Werte vorbelegen
*4) Immer das modale Result abfragen
*5) Werte vom modalen Formular entgegennehmen und speichern
Bei sehr vielen Werten am Besten einen Record oder eine Klasse verwenden.
  Mit Zitat antworten Zitat
DSCHUCH

Registriert seit: 6. Jun 2007
Ort: Dresden
185 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#5

AW: Abarbeitungsreihenfolge Modale Ereignisse (ergänzung: aus DLL)

  Alt 26. Feb 2013, 18:43
Hallo, danke für die Antworten.

Theoretisch schön und gut. Praktisch fehlt mir die technische Validierung der Aussagen.

1) Ist irgendwo niedergeschrieben / technisch validiert, dass ich caFree in CloseAction nicht für Modale Formulare nehmen darf? Ich glaube das nämlich nicht, da es A) richtig funktioniert und B) ich erwarten würde, das dann eine Exception ala "eine sichtbare Form kann nicht modal gemacht werden" wirft.

2) Ist die frage, wieso es nachgewiesener maßen in der richtigen Reihenfolge abgearbeitet wird. Ein ModalResult löst ein Close (hier caFree), dieses aber kein direktes Destroy der Form aus. Der Code wird richtig abgearbeitet und erst anschliessend wird das Modale Form destroyed (siehe Bsp im Anhang)

2.1) Interessanterweise passiert etwas mergwürdiges, wenn man MessageBoxes einbaut: diese werden nämlich in der falschen Reihenfolge angezeigt. Bsp siehe Anhang: Vergleiche Ausgaben im DebugMemo und die MessageBoxes, bei aktivierter CheckBox "Bei Close und Free MessageBox"

3) zusäzlich habe ich das ganze im Bsp im Anhang nochmal in eine DLL gepackt. Über die beiden Buttons kann man das gleiche Form nun einmal innerhalb der Exe und einmal über DLL-Aufruf starten. Dabei fällt auf, dass das Verhalten komplett anders ist: Anwendungsicon der Form fehlt (soweit klar, keine Ressource) ABER: das Modale Form verhält sich anders: es blinkt nicht, wenn man auf das dahinterliegende Hauptform clickt, weiterhin passiert hier genau der effekt, dass die Anwendung plötzlich die Z-Reihenfolge verliert: klickt der Anwender jetzt einmal unten auf den falschen TaskbarIcon, ist die Anwendung geblockt da das modale Formular im Hintergrund verschwunden ist. (besonders interessant, wenn kein TaskbarIcon...)




*2) immer nil als Owner übergeben. Übergibt man Application als Owner ist das messbar langsamer
weil unter Umständen mehrere 100 - 1000 Mal die Methode Notify aufgerufen wird.
dazu gibt es einen sehr ausführlichen artikel auf about.com: http://delphi.about.com/od/kbcurt/ss...iccreateno.htm
Miniaturansicht angehängter Grafiken
modalimhintergrund.jpg  
Angehängte Dateien
Dateityp: zip TestModal.zip (1,19 MB, 5x aufgerufen)
  Mit Zitat antworten Zitat
DSCHUCH

Registriert seit: 6. Jun 2007
Ort: Dresden
185 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#6

AW: Abarbeitungsreihenfolge Modale Ereignisse

  Alt 26. Feb 2013, 22:56
Es ist wie vermutet: die Form wird durch das Modal nur Unsichtbar. Close mit caFree sendet nur ein CM_RELEASE wodurch die Form erhalten bleibt, bis die anwendung das nächste mal Idle wird (bzw Application.Process/Handle- Messages ?? => noch nicht geprüft)

http://stackoverflow.com/questions/2...rm-release-nil

wie Modal überhaupt abgebildet wird, sieht man ja in Forms.pas => "function TCustomForm.ShowModal: Integer;"

Ich kann zwar noch nicht finden, wodurch überhaupt das Close aufgerufen wird, da die Schleife ja nur ein Hide am Ende aufruft, nie ein Close.
aber wird es ja offensichtlich....
... ich kann somit keinen technischen Grund sehen, wieso caFree bei Modalen Formen nicht verwendet werden sollte.?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Abarbeitungsreihenfolge Modale Ereignisse

  Alt 27. Feb 2013, 00:21
Wenn man weiß, was man da macht, dann darf man alles mögliche.

with ist ok
caFree bei einer modalen Form ist ok

Allerdings gibt es hier implizierte Funktionalitäten, die Seiteneffekte nach sich ziehen können und dann ist das Geschrei groß.

Wenn du robusten und wartbaren (auch durch andere) Code schreiben möchtest, dann lässt man dieses einfach weg.

It's up to you
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#8

AW: Abarbeitungsreihenfolge Modale Ereignisse

  Alt 27. Feb 2013, 09:18
... ich kann somit keinen technischen Grund sehen, wieso caFree bei Modalen Formen nicht verwendet werden sollte.?
1.) Formular (lokal) erzeugen
2.) optional Werte voreinstellen
3.) Formular modal anzeigen
4.) Werte übernehmen und weiterverarbeiten (falls ModalResult= mrOK)
5.) Formular freigeben

Jede Abweichung von diesem Ablauf verschlechtert die Codequalität weil unerwünschte Effekte möglich werden.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:38 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