Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Problem im constructor einer Komponente (https://www.delphipraxis.net/208006-problem-im-constructor-einer-komponente.html)

runningsoft 26. Mai 2021 18:20

Problem im constructor einer Komponente
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,

ich bastele gerade an einer Komponente, abgeleitet von TCustomControl (siehe Grafik). Probleme bereitet mir momentan die Positionierung des als Schließsymbol vorgesehenen TImages. Ich habe keine Idee, wie die Syntax dafür lautet, im constructor der Komponente die soeben erzeugte Komponente dem ebenfalls im constructor erzeugten TImage als Parent zuzuweisen. Hier mein bisheriger Code:
Delphi-Quellcode:
constructor TSDTipPanel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);

//TArrowShape (Pfeildreieck)
FArrow := TArrowShape.Create;
FArrow.FArrHeight := 20;
FArrow.FArrLeft := 20;
FArrow.FArrWidth := 20;
FArrow.FArrType := atLeft;
FArrow.FArrPos := apTop;
FArrow.OnChange := StyleChanged;

//zusätzliche Initialisierungen
Self.Color := clWhite;
Self.Height := 100;
Self.Width := 200;
Self.Caption := '';
Parent := AOwner as TWinControl;
FRadius := 10;

FBrush := TBrush.Create;
FBrush.OnChange := StyleChanged;
FBorderBrush := TBrush.Create;
FBorderBrush.Style := bsSolid;
FBorderWidth := 1;
FBorderColor := clSilver;

//Image als Schließsymbol
FCloseImage := TImage.Create(Self);
FCloseImage.Parent := ???;        //<-- hier klemmts, was muss hier stehen
FCloseImage.Canvas.Pen.Color := clBlack;
FCloseImage.Canvas.Pen.Width := 1;
FCloseImage.Top := 35;
FCloseImage.Left := 60;
FCloseImage.Width := 20;
FCloseImage.Height := 20;

Visible := true;
end;
Danke für Eure Hinweise

DeddyH 26. Mai 2021 18:22

AW: Problem im constructor einer Komponente
 
Hast Du es mal mit self versucht?

runningsoft 26. Mai 2021 18:30

AW: Problem im constructor einer Komponente
 
Dachte ich auch erst, aber da hängt das Programm in einer Endlosschleife fest und lässt sich noch nicht mal compilieren.

DeddyH 26. Mai 2021 18:37

AW: Problem im constructor einer Komponente
 
Es lässt sich nicht kompilieren, hängt aber in einer Endlosschleife?

[edit] Ich kann das Problem nicht nachvollziehen, mein Testcode:
Delphi-Quellcode:
unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.ExtCtrls;

type
  TDingens = class(TCustomControl)
  private
    FImage: TImage;
  public
    constructor Create(AOwner: TComponent); override;
  end;

  TForm2 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    FDingens: TDingens;
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

{ TDingens }

constructor TDingens.Create(AOwner: TComponent);
begin
  inherited;
  Width := 400;
  Height := 300;
  FImage := TImage.Create(self);
  FImage.Parent := self;
  FImage.Left := 0;
  FImage.Top := 0;
  FImage.AutoSize := true;
  FImage.Picture.LoadFromFile(...); // Irgendeine Grafik, in meinem Fall ein Icon
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  FDingens := TDingens.Create(self);
  FDingens.Parent := self;
  FDingens.Left := 10;
  FDingens.Top := 10;
end;

end.
[/edit]

runningsoft 26. Mai 2021 18:47

AW: Problem im constructor einer Komponente
 
Die Komponente selbst lässt sich noch compilieren und auch installieren. Aber sobald ich sie in meinem Testprogramm auf der Form platziere, flackert die Grafik und die Testanwendung lässt sich nicht compilieren. Es lässt sich noch nicht mal die IDE beenden.

Ich hab spaßeshalber als Parent des TImages mal das gleiche wie für die Komponente selbst eingetragen
Delphi-Quellcode:
FCloseImage.Parent := AOwner as TWinControl;
, dann läuft es. Aber natürlich ist dann das TImage auf der Form platziert und nicht auf meinem Panel.

runningsoft 26. Mai 2021 19:09

AW: Problem im constructor einer Komponente
 
Das Problem hat sich wohl erledigt. Ich hatte die Grafik für das Schließsymbol nicht gleich beim Createn gezeichnet, sondern erst in der Paint-Prozedur der "Mutter"-Komponente. Da hing das ganze wohl dann in einer Endlosschleife fest.

Jetzt male ich gleich im constructor auf dem Canvas des TImages, dann funktionierts.

Danke für die Hilfe und den Beispielcode, der hat mich auf die richtige Spur gebracht :thumb:

DeddyH 26. Mai 2021 20:21

AW: Problem im constructor einer Komponente
 
Aber wenn Du sowieso selber zeichnest, wäre da eine TPaintBox nicht einem TImage vorzuziehen? Oder alternativ die Unterkomponente ganz weglassen und die Paint-Methode Deines TCustomControl benutzen.

himitsu 26. Mai 2021 20:22

AW: Problem im constructor einer Komponente
 
Lass mal probehalber das
Delphi-Quellcode:
Parent := AOwner as TWinControl;
weg.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:16 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