Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Dynamisch erstellte Formulare wieder freigeben (https://www.delphipraxis.net/161105-dynamisch-erstellte-formulare-wieder-freigeben.html)

torud 16. Jun 2011 19:25

Delphi-Version: 7

Dynamisch erstellte Formulare wieder freigeben
 
Hallo Wissende,

mit folgendem Code erstelle ich dynamisch SubForms auf einer Scrollbox.

Delphi-Quellcode:
procedure TForm1.list_playersDblClick(Sender: TObject);
var
  dt_pan : Tdt_panel;
begin
  if list_players.ItemIndex >= 0 then
    with list_players.Items.Objects[list_players.ItemIndex] as TPlayerData do
      begin
        dt_pan           := Tdt_panel.Create(form1);
        dt_panel.PlayerId := Id;
        dt_pan.Parent    := sc_box;
        dt_pan.Align     := alTop;
        dt_pan.Visible   := true;
        dt_pan.parseXMl_2_DataPanel(Name, XML_EV_Players.ChildNodes[1].ChildNodes,Idx);
      end;
end;
Bisher habe ich auf dem Panel, welches schon fertig exitsiert, nur eben zur Laufzeit mehrfach auf der Scrollbox erzeugt werden muss, immer mit

Delphi-Quellcode:
Self.close;
freigegeben. Der Button, der diesen Code aufruft, liegt auf dem Form selbst.

Nun muss ich aber das jeweilige Form zerstören. Wenn ich Self.Free aufrufe, passiert entweder gar nix, oder aber ich erhalte eine Exception mit div. SpeicherAdressen, die mir nicht weiterhelfen. Liegt es daran, dass der Button den Tod seines Parents aufruft und sich der Code selbst dabei überholt?

Wenn ich das Form vom MainForm aus freigebe, ist alles supi. Deshalb habe ich versucht, diese Routine (des MainForms) vom SubForm aus aufzurufen. Ich glaube aber, aufgrund weiterer Fehlermeldungen, dass das noch nicht des Rätsels Lösung ist.

Was ist Ursache für dieses Problem und wie kann ich es fixen?

mkinzler 16. Jun 2011 19:41

AW: Dynamisch erstellte Formulare wieder freigeben
 
Du musst durch die Components-Collection steppen und überprüfen, ob die Objekte vom entsprechende Typ ist und diese dann Freigeben

omata 16. Jun 2011 20:00

AW: Dynamisch erstellte Formulare wieder freigeben
 
Eine Form wird mit Form.Release freigegeben.

bcvs 21. Jun 2011 10:52

AW: Dynamisch erstellte Formulare wieder freigeben
 
Zitat:

Zitat von torud (Beitrag 1106853)
Nun muss ich aber das jeweilige Form zerstören. Wenn ich Self.Free aufrufe, passiert entweder gar nix, oder aber ich erhalte eine Exception mit div. SpeicherAdressen, die mir nicht weiterhelfen. Liegt es daran, dass der Button den Tod seines Parents aufruft und sich der Code selbst dabei überholt?

Wenn ich das Form vom MainForm aus freigebe, ist alles supi. Deshalb habe ich versucht, diese Routine (des MainForms) vom SubForm aus aufzurufen. Ich glaube aber, aufgrund weiterer Fehlermeldungen, dass das noch nicht des Rätsels Lösung ist.

Was ist Ursache für dieses Problem und wie kann ich es fixen?

Ich bin mir nicht sicher, ob ich verstanden habe, was Du da machst. Du erzeugst Objekte vom Typ Tdt_panel auf einer Scrollbox. Tdt_panel ist als class(TPanel) definiert, nehme ich mal an. Also erzeugst du keine Forms, sondern Panels. Das ist schon ein großer Unterschied, bitte korrekte Terminologie benutzen, sonst versteht dich hier keiner.

Du könntest beim Klick auf den Schließen-Button (der Teil der Klasse Tdt_panel ist, nehme ich an) lediglich ein Flag setzen (KannGeloeschtWerden:=true) und das MainForm mit SendMessage benachrichtigen dass ein Panel gelöscht werden soll. Das MainForm geht dann die Panels durch und löscht die mit dem Flag.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 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