Dynamische Komponenten mit Parent

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Petermaennchen
Beiträge: 5
Registriert: Mo 27. Sep 2010, 19:16

Dynamische Komponenten mit Parent

Beitrag von Petermaennchen »

Hallo beisammen,

nun bin ich soweit, dass ich mich von Delphi verabschiede und auf Lazarus/FPC umschwenke. Ausschlaggebend sind dafür zwei Gründe:
- Open Source Compile und IDE
- erreichbare Plattformen.

Ich hab zwar zum Erhalt vorhandener Sourcen gerade Delphi enterprise 2010 gekauft, aber das soll mich nicht bremsen.

Nun kommt, was kommen muss, einige Fragen:

Im ersten Projekt mache ich kräftig Gebrauch von dynamisch erzeugten Komponenten, Typ TPanel. Diese werden auf dem ersten, ebenfalls dynamisch erzeugten Panel, als Parent abgelegt. Unter Delphi werden alle Komponenten welche den Parent haben beim zerstören dieser Komponente ebenfalls zerstört.

Dies ist unter FPC nicht so?

Ausweg bisher: Ich merke mir die Komponentennamen in einer Stringlist und arbeite diese nach dem Löschen des Parent ab.

Da die Beschreibung etwas kompliziert klingt, hier der Weg zum Handbuch mit kleinen Videos zur Verdeutlichung (Format wmv). Speziell in diesem Verweis wird das deutlich: klick.

Ich empfinde das als recht gefährlich, hängt es doch von der Sorgfalt des Programmierers (also meiner :oops: ) ab, ob das so sauber läuft.

Übrigens ist das gezeigte alles FPC/Lazarus unter Win.

So, hier Quelltext:

Erzeugen des Parent

Code: Alles auswählen

MainPanel := TPanel.Create(_FSMain);
  MainPanel.visible := false;
  MainPanel.Name := 'myPanel3';
  MainPanel.color := clwhite;
  MainPanel.Parent := _FSMain;
Erzeugen des abhängigen Panels

Code: Alles auswählen

myLabel := TPanel.create(self);
      myLabel.name := 'myName'+SL[0];
      Panellist.add(myLabel.name);
      mylabel.parent := MainPanel;
Freigeben des Parent und jetzt notgedrungen freigeben der abhängigen Komponenten

Code: Alles auswählen

if MainPanel <> NIL then
  begin
    MainPanel.free;
    MainPanel := NIL;
    while Panellist.count > 0 do
    begin
      TPanel(FindComponent(Panellist[0])).free;
      Panellist.delete(0);
    end;
  end;
Falls ihr wisst,woran das liegen kann? Vielen Dank und

Gruß

Peter

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Dynamische Komponenten mit Parent

Beitrag von Scotty »

Dies ist unter FPC nicht so?
Warum sollte es denn anders sein? Komponenten haben ansonsten eine Liste ihrer Objekte, auf die per ComponentCount / Components[] zugegriffen werden kann. Für TControl's gibt es ControlCount / Controls[].
An deinem Code sieht man übrigens, dass die Objekte entfernt werden: Du gibst zuerst MainPanel frei und greifst danach auf die enthaltenen Objekte zu, die dann aber nicht mehr existieren. Wenn schon, müsste zuerst eine Liste durchgegangen und dann der Parent gelöscht werden.

Petermaennchen
Beiträge: 5
Registriert: Mo 27. Sep 2010, 19:16

Re: Dynamische Komponenten mit Parent

Beitrag von Petermaennchen »

Scotty hat geschrieben:
Dies ist unter FPC nicht so?
Warum sollte es denn anders sein? Komponenten haben ansonsten eine Liste ihrer Objekte, auf die per ComponentCount / Components[] zugegriffen werden kann. Für TControl's gibt es ControlCount / Controls[].
An deinem Code sieht man übrigens, dass die Objekte entfernt werden: Du gibst zuerst MainPanel frei und greifst danach auf die enthaltenen Objekte zu, die dann aber nicht mehr existieren. Wenn schon, müsste zuerst eine Liste durchgegangen und dann der Parent gelöscht werden.
Ich habe den Original-Quelltext aus Delphi nach FPC portiert. In Delphi alles wie es soll, in FPC kommt es jedoch nach der Zerstörung des Mainpanels (Parent) und dem erneuten Erzeugen der Anzeige zu der Meldung, dass eine Komponente dieses Namens schon exisitert. Nicht des Mainpanels, sondern der kleineren Panels wie im Video gezeigt.

Das zumindest unterscheidet das Verhalten von D7 und FPC (Quelltext ohne Änderungen außer Portierung auf FPC).

Der Weg über die Abfrage der Komponentenliste ist sicherer als mein Weg. Danke dafür!

Gruß

Peter

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: Dynamische Komponenten mit Parent

Beitrag von theo »

Nicht der Parent zerstört das Objekt sondern der Owner, also das was du im Create Parameter mitgibst. Ist unter Delphi auch so.

Petermaennchen
Beiträge: 5
Registriert: Mo 27. Sep 2010, 19:16

Re: Dynamische Komponenten mit Parent

Beitrag von Petermaennchen »

theo hat geschrieben:Nicht der Parent zerstört das Objekt sondern der Owner, also das was du im Create Parameter mitgibst. Ist unter Delphi auch so.
Hallo Theo,

ich hab hier Delphi 7 und FPC 2.4.irgendwas laufen

Unter Delphi werden alle Komponenten, welche als Parent Mainpanel habe zerstört, wenn Mainpanel selbst zerstört wird.
Da bin ich mir ziemlich sicher,da ich das schon seit D2 so einsetze.

Nochmal:
Erzeuge Komponente Panel1,Parent Form1
Erzeuge Komponente Panel2, Parent Panel1

Zerstöre Panel1: Delphi= Panel2 ebenfalls zerstört
FPC nicht

Aber ich werde das Morgen ausprobieren. Achso, wie im Ausriss vom Quelltext zu sehen, hat die Komponente keinen Owner .create(self).

Gruß

Peter

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: Dynamische Komponenten mit Parent

Beitrag von theo »

Glaube ich nicht. Man sieht's nicht mehr, aber es ist noch da.

Teste mal:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender:TObject);
var p1,p2:TPanel;
begin
p1:=TPanel.Create(self);
p2:=TPanel.Create(self); //so ist es zugreifbar
//p2:=TPanel.Create(p1); //damit gibt's SIGSEGV beim "noch da" test
p1.Parent:=Self;
p2.Parent:=p1;
p1.Free;
p2.Caption:='test'; //noch da?
end;

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Dynamische Komponenten mit Parent

Beitrag von Socke »

Petermaennchen hat geschrieben:Achso, wie im Ausriss vom Quelltext zu sehen, hat die Komponente keinen Owner .create(self).
Das schöne an Pascal ist, dass die Spracheelmente unabhängig vom Kontext immer die gleiche Bedeutung haben. Self ist also nicht das gerade neu erzeugte Panel sondern das Objekt, welches dieses Panel erzeugt (in theos Code ist es eine Instanz von TForm1; bei dir dürfte es auch das übergeordnete Formular sein).
Eine Komponente kann also nie sich selbst als Owner haben, kein Owner (nil) ist aber dennoch möglich.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten