Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

AW: Parent Problem bei eigener Komponente

  Alt 18. Mär 2015, 08: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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat