AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Parent Problem bei eigener Komponente

Ein Thema von Stegi · begonnen am 11. Mär 2015 · letzter Beitrag vom 23. Mär 2015
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.178 Beiträge
 
Delphi 12 Athens
 
#11

AW: Parent Problem bei eigener Komponente

  Alt 12. Mär 2015, 08:53
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 )
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Chris211183

Registriert seit: 19. Sep 2013
Ort: Braunschweig
204 Beiträge
 
Delphi 6 Professional
 
#12

AW: Parent Problem bei eigener Komponente

  Alt 12. Mär 2015, 10:49
Wichtiger ist doch aber jetzt, ob Stegis Problem gelöst ist oder ob nicht

Christian
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#13

AW: Parent Problem bei eigener Komponente

  Alt 12. Mär 2015, 12:11
Schon mal probiert die beiden Panels in den Container Controls der eigenen Komponente beim Construct zu packen?
42
  Mit Zitat antworten Zitat
Stegi

Registriert seit: 11. Mär 2015
3 Beiträge
 
#14

AW: Parent Problem bei eigener Komponente

  Alt 17. Mär 2015, 13:33
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.
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#15

AW: Parent Problem bei eigener Komponente

  Alt 18. Mär 2015, 07:09
So klappt es:

Delphi-Quellcode:
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.
Gruß oki
42
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.178 Beiträge
 
Delphi 12 Athens
 
#16

AW: Parent Problem bei eigener Komponente

  Alt 18. Mär 2015, 07:27
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:
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.
Hab den Thread jetzt nicht mehr so ganz im Kopf, aber wozu soll das Panel1 jetzt eigentlich dienen?
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#17

AW: Parent Problem bei eigener Komponente

  Alt 18. Mär 2015, 07:54
Hi himitsu.

Okay, hab ich alles etwas leichtfertig zusammengehackt . Ich entschuldige mich dafür und werde in Zukunft sorgsamer sein.

Gleichfalls hast du aber auch nicht gründlich gelesen.
Zitat:
MyPanel hat Panel1 als Owner
und Panel1 hat das MyPanel als Owner.
Das ist so nicht korrekt. Panel1 hat MyPanel als Owner und Parent. Panel1 liegt im Componentskontainer der Parent-Komponente von MyPanel. Du hast recht, wenn jemand das Panel1 löscht ist Panel1 in MyPanel nicht mehr instanziiert, die Variable aber nicht null. Also eher Panel1 gar nicht als Member in der Komponente halten. Da geb ich dir in deinem Code-Beispiel recht. Von Endlosschleife sehe ich aber nichts. Hilf mir auf die Sprünge.
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:
Wozu das Create hier im Beispiel sein soll, weiß wohl keiner.
Naja, Create ist halt beim Testen übrig geblieben. Ist das jetzt so schlimm?

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
42
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.178 Beiträge
 
Delphi 12 Athens
 
#18

AW: Parent Problem bei eigener Komponente

  Alt 18. Mär 2015, 08:02
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.
Delphi-Quellcode:
procedure TMyPanel.CreateWnd;
begin
  inherited;
  Panel1 := TPanel.Create(self);
  Panel1.Parent := self;
  Self.Owner.InsertComponent(Panel1);
end;
entspricht
Delphi-Quellcode:
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;
Demnach wäre das InsertComponent dann nur "nutzlos", da der Owner bereits gesetzt wurde.

Hmmmmmmmmmmmmmmmm...
Also der zweite Code, lies einfach nur den Owner weg, durch weglassen des Panel1 .... unter der Annahme der falschen Richtung des InsertComponent.

Delphi-Quellcode:
constructor TMyPanel.Create(AOwner: TComponent);
begin
  inherited;
  if Assigned(Owner) then
    Owner.RemoveComponent(Panel1);
end;
hätte man auch als
Delphi-Quellcode:
constructor TMyPanel.Create(AOwner: TComponent);
begin
  inherited Create(nil);
end;
schreiben können, aber ist ja nun doch falsch.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (18. Mär 2015 um 08:07 Uhr)
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#19

AW: Parent Problem bei eigener Komponente

  Alt 18. Mär 2015, 08:15
self.Owner.InsertComponents(Panel1); 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!
Das ist doch
Delphi-Quellcode:
Panel1 := TPanel.Create(self);
  Panel1.Parent := self;
gleich dem
Delphi-Quellcode:
Panel1 := TPanel.Create(nil);
  Panel1.Owner := Self;

  Panel1.Parent := Self;
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.

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. Muss ich noch mal nachlesen.

Gruß oki
42
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.178 Beiträge
 
Delphi 12 Athens
 
#20

AW: Parent Problem bei eigener Komponente

  Alt 18. Mär 2015, 08:53
Zitat:
Delphi-Quellcode:
procedure TMyPanel.Create(AOwner: TComponent);
begin
  inherited;
  Panel1 := TPanel.Create(self);
  Panel1.Parent := self;
  Owner.InsertComponent(Panel1);
end;
Warum hinterher verbiegen, wenn man auch gleich den richtigen Owner übergeben könnte?
Delphi-Quellcode:
constructor TMyPanel.Create(AOwner: TComponent);
begin
  inherited;
  Panel1 := TPanel.Create(Owner); // aka Self.Owner, anstatt nur Self
  Panel1.Parent := Self;
end;
Und daß sich Komponenten nur im OI bearbeiten lassen, wenn sie die Form als Owner besitzen, wurde gleich zu Beginn von jemandem erwähnt.
(rate mal wer AOwner/Owner des MyPanel ist)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:47 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