Formular sich selbst löschen lassen, beim beenden?
-
Also folgende Konstruktion: Programm auf Formularbasis. Aus diesem Programm wird über einen Menüpunkt ein zweites Formular mit new erzeugt und mit Show gezeigt.
Über den Menüpunkt kann man es auch deaktivieren. mit Close() und delete.Grund für das Speicher allokieren und freigeben ist, daß es sich hier um einen Logger handelt. Der soll nur aktiv loggen. Da mir bisher noch keine Möglichkeit in den Sinn kam ihn mit new beim Programmstart zu erzeugen und dann bei Belieben erst anzuwerfen, habe ich es halt so gelöst.
Problem ist, daß ich nun entweder Exit im Menü des Loggers löschen muss und das Kreuz zum Fenster schließen auch, oder eine Möglichkeit wie der Logger seinen Speicher selbst freigibt. Mit Close() scheint der Destruktor nicht aufgerufen zu werden, wenn ich das richtig sehe... Extern geht das ja mit delete. Aber wie mach ich das wenn sich das Formular selber schliesst oO Ich will FreeOnTerminate

Das Ding soll einfach aus Performance Gründen nur laufen, wenn es wirklich aktiviert ist. Die Threads die in der Hauptapplikation werkeln schicken ja Nachrichten an den Logger. Wäre das Logger Formular nur versteckt, würde es ja fröhlich weiterhin Nachrichten annehmen.
-
-Definiere ne eigene Botschaft
-schreibe einen Handler dazu (im Hauptformular)
-Sende die Botschaft an Hauptformular, wenn was passieren soll.
(z.B. bei Close)
- reagiere im Hauptformular passend.
z.B delete der 2. Form
-
Autsch. Erwischt.
-Definiere ne eigene Botschaft
-schreibe einen Handler dazu (im Hauptformular)
-Sende die Botschaft an Hauptformular, wenn was passieren soll.
(z.B. bei Close)Davor drück ich mich schon die ganze Zeit, weil ich es npch nie gemacht habe.
-
Hallo,
Du kannst im OnClose-Event deiner Form Action=caFree setzen, dann löscht sich die Form von selbst.
Du mußt aber noch irgendwie dein Hauptformular darüber informieren, damit es nicht versucht die From ein zweites mal zu schliessen. Dies kannst du, wie schon erwähnt, mit einer Message machen. Eine Alternative wäre hier eine Callback-Funktion, die du im Konstruktor deiner Nebenform mit übergibst.
-
Sollte da nicht einfach ein if != NULL reichen? So habe ichs schon im DEstructor der Anwendung.
Danke für den Tip Braunstein. Das probier ich auch mal aus. Das mit dem eigenen Message Handler hab ich auch schon gebastelt. Nur muss ich da ja das Handle des Hauptformulars haben für PostMessage.
-
Hallo
Sollte da nicht einfach ein if != NULL reichen? So habe ichs schon im DEstructor der Anwendung.
Ein delete setzt nicht den Pointer auf NULL.
bis bald
akari
-
Darauf habe ich irgendwie nie geachtet. Ok dann mache ich das über die Message und setze den selber auf NULL hinterher.
-
Hallo,
void __fastcall TForm2::FormHide(TObject *Sender) { Release(); Form2 = NULL; } //---------------------------------------------------------------------------...und beim erneuten Aufrufen testen, ob Form2 == NULL.
Nash
-
*kopfklatsch* auch ne Lösung. Wieso bin ich da nicht drauf gekommen.
Ok danke Nash. Das ist der Vorteil an einem Forum. Vervielfachen der Geister = vielfältige Ideen.