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
oki

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

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

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

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.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
oki

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

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
Antwort Antwort


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 19:06 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