Einzelnen Beitrag anzeigen

Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: OnClose , action caFree oder caHide

  Alt 13. Jan 2016, 14:21
Hallo,
Von der Form1 werden je nach Stellung eines Drehschalters (OnChange)
proceduren von verschiedene Forms (z.Bsp Form2.man, Form3.Prog usw) )aufgerufen. Alle diese Forms beinhalten ein anderes Image. Das funktioniert soweit problemlos.
Das funktioniert nur deshalb, weil dein Projekt so eingestellt ist, beim Programmstart alle Formulare zu erzeugen und den Variablen Form1 .. FormX zuzuweisen.

Beim Starten des Programms wird standartmässig Form2.Man aufgerufen.
Beim Wechsel des Drehschalters wird dann z.Bsp Form3.Prog aufgerufen.
Da es 16 Stellungen des Drehschalters gibt, sind es auch 16 Formulare
die aktiviert werden können.

Im Form2 habe ich OnClose verwendet mit caFree oder caHide. Die Form2
wird aber nicht gelöscht nach dem Drehschalterwechsel(das Image wurde teilweise entfernt)also die Form2 offenbar nicht freigegeben.
In dieser Konstellation darfst du die Formulare auch nicht löschen (caHide ist Standardbelegung, caFree unzulässig). Ist das Formular "Form2" freigegeben, würde die Variable "Form2" auf einen ungültigen Speicherbereich verweisen. Der Aufruf von "Form2.man" kann dann schon zum Programmabsturz führen. Da der Speichermanager freigegebene Objekte nicht sofort löscht, fallen solche Fehler oft erst später auf. In diesem Fall scheint Form2 noch teilweise da zu sein, aber das Programm kann jederzeit abstürzen, wenn der Speichermanager diesen Speicher für etwas anderes braucht.

Bei jedem umschalten wird dann eine neue Form aufgerufen.
Gemäss verschiedene Forenbeiträge müsste OnClose funktionieren, es tut aber nicht. Woran liegt es ?
Formulare werden mit "Show" angezeigt und mit "Hide" ausgeblendet.
Individuelle Initialisation kannst du zum Beispiel im OnShow-Ereignis des jeweiligen Formulars aufrufen.
Beim Schalten deines Drehschalters sollte etwa das ablaufen:
Delphi-Quellcode:
  FAktivesForm.Hide;
  FAktivesForm := GetFormular(Drehschalter.Stellung);
  FAktivesForm.Show;
FAktivesForm ist eine Variable, in der du dir das jeweils aktive Formular merkst.
  Mit Zitat antworten Zitat