![]() |
AW: Parent Problem bei eigener Komponente
Außer bei TForms, welche über CreateForm erstellt werden, sind diese Property im Constructor niemals richtig befüllt. (man kann sie ja erst setzen, wenn die Komponente befüllt wurde :zwinker:)
|
AW: Parent Problem bei eigener Komponente
Wichtiger ist doch aber jetzt, ob Stegis Problem gelöst ist oder ob nicht
:witch: |
AW: Parent Problem bei eigener Komponente
Schon mal probiert die beiden Panels in den Container Controls der eigenen Komponente beim Construct zu packen?
|
AW: Parent Problem bei eigener Komponente
Hi,
sorry, konnte heute erst die Vorschläge versuchen auszuprobieren. Leider ohne Erfolg. Im Constructor von meiner Komponente werden bereits die zwei Panels erzeugt und der Parent der zwei Panels ist selbstverständlich die Kompononente selbst. Aber dennoch klappt es nicht. Man müsste irgendwie allen Komponenten die man in die eigenen Kompononete zieht die eigenen Komponente als Parent mitgeben. :gruebel: |
AW: Parent Problem bei eigener Komponente
So klappt es:
Delphi-Quellcode:
Gruß oki
unit PanelUnit;
interface uses ExtCtrls, Classes; type TMyPanel = class(TPanel) private Panel1 : TPanel; { private-Deklarationen } protected { protected-Deklarationen } procedure CreateWnd(); override; public { public-Deklarationen } Constructor Create(AOwner : TComponent); override; published { published-Deklarationen } end; procedure Register(); implementation procedure Register(); begin RegisterComponents('oki', [TMyPanel]); end; { TMyPanel } constructor TMyPanel.Create(AOwner: TComponent); begin inherited; end; procedure TMyPanel.CreateWnd; begin inherited; Panel1 := TPanel.Create(self); Panel1.Parent := self; self.Owner.InsertComponent(Panel1); end; end. |
AW: Parent Problem bei eigener Komponente
Und so hast du dir eine wunderschöne Endlosschleife gebastelt.
MyPanel hat Panel1 als Owner und Panel1 hat das MyPanel als Owner. Als Ergebnis halten sich beide gegenseitig im Speicher und am Ende hat man ein Speicherleck, genauso, als wenn MyPanel garkeinen Owner hätte und es Panel1 nicht gäbe. Außerdem wird/kann CreateWnd mehrmals zur Laufzeit aufgerufen werden, womit es mehrere Panel1 geben könnte. Die Variable Panel1 wird sonst nirgendwo anders verwendet und kann auch gut und gern einfach nur eine Lokale in CreateWnd sein. Wozu das Create hier im Beispiel sein soll, weiß wohl keiner.
Delphi-Quellcode:
Hab den Thread jetzt nicht mehr so ganz im Kopf, aber wozu soll das Panel1 jetzt eigentlich dienen?
unit PanelUnit;
interface uses ExtCtrls, Classes; type TMyPanel = class(TPanel) private { private-Deklarationen } protected { protected-Deklarationen } //procedure CreateWnd(); override; public { public-Deklarationen } constructor Create(AOwner: TComponent); override; published { published-Deklarationen } end; procedure Register(); implementation procedure Register(); begin RegisterComponents('oki', [TMyPanel]); end; { TMyPanel } //procedure TMyPanel.CreateWnd; constructor TMyPanel.Create(AOwner: TComponent); var Panel1: TPanel; begin inherited; Panel1 := TPanel.Create(self); Panel1.Parent := self; if Assigned(Owner) then Owner.InsertComponent(Panel1); end; end.
Delphi-Quellcode:
unit PanelUnit;
interface uses ExtCtrls, Classes; type TMyPanel = class(TPanel) private { private-Deklarationen } protected { protected-Deklarationen } //procedure CreateWnd(); override; public { public-Deklarationen } constructor Create(AOwner: TComponent); override; published { published-Deklarationen } end; procedure Register(); implementation procedure Register(); begin RegisterComponents('oki', [TMyPanel]); end; { TMyPanel } //procedure TMyPanel.CreateWnd; constructor TMyPanel.Create(AOwner: TComponent); begin inherited; if Assigned(Owner) then Owner.RemoveComponent(Panel1); end; end. |
AW: Parent Problem bei eigener Komponente
Hi himitsu.
Okay, hab ich alles etwas leichtfertig zusammengehackt :oops:. Ich entschuldige mich dafür und werde in Zukunft sorgsamer sein. Gleichfalls hast du aber auch nicht gründlich gelesen. Zitat:
Wo liegt eigentlich der Unterschied zwischen meinem und deinem Code-Beispiel, außer dass Panel1 nich private ist (seh ich ein, ist ein Fehler meinerseits) und dass du den Code von CreateWnd nach Create verschoben hast? (Das Assign ist eine vernünftige Ergänzung für den Fall, dass MyPanel per Code ohne Owner erzeugt wird). Zitat:
Das CreateWnd mehrfach aufgerufen wird ist mir neu. Dank für den Hinweis. Ist das schon immer so oder erst ab einer speziellen Delphi-Version? Deinen zweiten Code-Abschnitt verstehe ich nicht. Was soll das RemoveComponent? Gruß oki |
AW: Parent Problem bei eigener Komponente
CreateWnd wird jedesmal aufgerufen, wenn das interne Window (HWND) neu erstellt wird, das passiert z.B. beim Ändern des Parent, oder beim Umstellen des FormStyle usw.
Ups, mit dem Owner hab ich falschrum geguckt. :oops:
Delphi-Quellcode:
entspricht
procedure TMyPanel.CreateWnd;
begin inherited; Panel1 := TPanel.Create(self); Panel1.Parent := self; Self.Owner.InsertComponent(Panel1); end;
Delphi-Quellcode:
Demnach wäre das InsertComponent dann nur "nutzlos", da der Owner bereits gesetzt wurde.
procedure TMyPanel.CreateWnd;
begin inherited; //Panel1 := TPanel.Create(self); Panel1 := TPanel.Create(nil); Panel1.Owner := Self; Panel1.Parent := Self; //Self.Owner.InsertComponent(Panel1); Panel1.Owner := Self; // hatte das vorhin als Self.Owner := Panel1; übersetzt end; Hmmmmmmmmmmmmmmmm... :gruebel: Also der zweite Code, lies einfach nur den Owner weg, durch weglassen des Panel1 .... unter der Annahme der falschen Richtung des InsertComponent.
Delphi-Quellcode:
hätte man auch als
constructor TMyPanel.Create(AOwner: TComponent);
begin inherited; if Assigned(Owner) then Owner.RemoveComponent(Panel1); end;
Delphi-Quellcode:
schreiben können, aber ist ja nun doch falsch.
constructor TMyPanel.Create(AOwner: TComponent);
begin inherited Create(nil); end; |
AW: Parent Problem bei eigener Komponente
Delphi-Quellcode:
ist aber genau der Punkt, der zur Designzeit Zugriff auf das Panel1 liefert. Ohne gehts nicht. Bitte achte drauf, InsertComponent rufe ich nicht für MyPanel auf, sondern für dessen Owner!
self.Owner.InsertComponents(Panel1);
Das ist doch
Delphi-Quellcode:
gleich dem
Panel1 := TPanel.Create(self);
Panel1.Parent := self;
Delphi-Quellcode:
mit dem kleinen Problem, dass Owner eine nur-lese-Eigenschaft ist und so nicht gehen sollte. Führt aber alleine nicht dazu, dass man weitere Controls in Panel1 zur Designzeit legen kann.
Panel1 := TPanel.Create(nil);
Panel1.Owner := Self; Panel1.Parent := Self; CreateWnd hatte ich immer so verstanden, dass das nach dem Create aufgerufen wird wenn ein Handle verfügbar ist. Das ist beim Create noch nicht da. Das das bei einer vorhandenen Componente zur Lebenszeit wiederholt aufgerufen wird ist mir noch nie vorgekommen. Wenn ich in einer eigenen Komponente das Handle benötige habe ich den Code immer da platziert, auch für weitere Objekte. Hatte nie Probleme. :shock: Muss ich noch mal nachlesen. Gruß oki |
AW: Parent Problem bei eigener Komponente
Zitat:
Delphi-Quellcode:
Und daß sich Komponenten nur im OI bearbeiten lassen, wenn sie die Form als Owner besitzen, wurde gleich zu Beginn von jemandem erwähnt. :stupid:
constructor TMyPanel.Create(AOwner: TComponent);
begin inherited; Panel1 := TPanel.Create(Owner); // aka Self.Owner, anstatt nur Self Panel1.Parent := Self; end; (rate mal wer AOwner/Owner des MyPanel ist) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz