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/)
-   -   Delphi Komponente: TPanel mit optionalen Labels im Panel (https://www.delphipraxis.net/210647-komponente-tpanel-mit-optionalen-labels-im-panel.html)

NoGAD 21. Mai 2022 22:04

Komponente: TPanel mit optionalen Labels im Panel
 
Hallo,

um mir meine Arbeit leichter zu machen. würde ich mir gerne ein Panel als Komponente erstellen, welches Labels aufnimmt.

Leider weiß ich nicht so recht, wie ich da anfangen muss.

Im Endeffekt hätte ich gerne MyPanel.LabelAdd; , was zu einem neuen Label im Panel führt.

Kann mir jemand einen Tipp geben, wie man das umsetzt?

LG Mathias :-)

BerndS 21. Mai 2022 22:48

AW: Komponente: TPanel mit optionalen Labels im Panel
 
Meinst du zur Laufzeit?
Erstelle dir einfach einen classhelper.

NoGAD 21. Mai 2022 22:49

AW: Komponente: TPanel mit optionalen Labels im Panel
 
Hallo Bernd,

ich möchte es gerne als eigene Komponente erstellen.

LG Mathias

NoGAD 21. Mai 2022 23:48

AW: Komponente: TPanel mit optionalen Labels im Panel
 
Hier ist mal ein Test, wie ich es mir vorstelle.

Aber der Code ist natürlich kompletter Unsinn - ich weiß nur leider nicht, wie das richtig gemacht wird, die Darstellung für die Komponente ist erst einmal nur ein Test.

Z.B. der Name der Labels - wie können die automatisch einen bekommen?
Lasse ich den Namen weg, gibt es die nicht.

Ich würde den Labels gerne selbst einen Namen geben, vielleicht direkt bei der Erstellung - oder erst danach?
Keine Ahnung, wie das funktioniert.

Delphi-Quellcode:
unit My_PanelLabel;

interface

uses
  System.SysUtils, System.Classes, Vcl.Controls, Vcl.ExtCtrls, Vcl.StdCtrls, Vcl.Graphics;

type
  TMy_PanelLabel = class;

  TMy_PanelLabel = class(TPanel)
  private
    { Private-Deklarationen }
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
    function AddLabel(AOwner: TComponent): TLabel;
  published
    { Published-Deklarationen }
  end;

procedure Register;

implementation

function TMy_PanelLabel.AddLabel(AOwner: TComponent): TLabel;
begin
  Result := TLabel.Create(AOwner);
  Result.Name := AOwner.Name + '_' + AOwner.ComponentCount.ToString;
  Result.Parent := Self;
  Result.Align := alLeft;
  Result.AutoSize := True;
  Result.AlignWithMargins := True;
  Result.Alignment := taCenter;
  Result.Layout := tlCenter;
  Result.Transparent := False;
  case (AOwner.ComponentCount mod 2) = 0 of
    True:
      Result.Color := clLime;
    False:
      Result.Color := clYellow;
  end;
end;

procedure Register;
begin
  RegisterComponents('Test', [TMy_PanelLabel]);
end;

end.

NoGAD 22. Mai 2022 00:48

AW: Komponente: TPanel mit optionalen Labels im Panel
 
Hallo nochmal.


Ich habe eben bei der Recherche das TFlowPanel entdeckt. Das ist im Prinzip das, was ich auch machen wollte, Labels hintereinander automatisch anordnen.

Ich würde mich, trotz des "Fundes" dennoch freuen, wenn ich lernen würde, wie man so eine Komponente richtig erstellt.

LG Mathias :-)

TurboMagic 22. Mai 2022 15:11

AW: Komponente: TPanel mit optionalen Labels im Panel
 
Hallo,

sollte nicht das Panel auf dem das Label platziert wird in deinem Fall der Owner des Labels sein?
Dann wäre dieser AOwner Parameter überflüssig...

Grüße
TurboMagic

Delbor 23. Mai 2022 10:07

AW: Komponente: TPanel mit optionalen Labels im Panel
 
Hi NoGad

Die Function AddLabel muss teil deines neuen Panels sein, nicht des hinzuzufügenden Labels. An deinem Entwurf stimmen aufgrund deiner Beschreibung einige Sachen nicht.
Nach deiner Beschreibung willst du ein Label schaffen, das sich selber einem Panel hinzufügn kann, createst aber dann in der Addfunktion ein Panel, das sich ein Label createn kann. Und wenn ich dich richtig verstanden habe, ist es eigentlich das, was du willst: ein Panel, dem per Add beliebig viele Labels hinzugefügt werden können.

Delphi-Quellcode:
interface

uses
  System.SysUtils, System.Classes, Vcl.Controls, Vcl.ExtCtrls, Vcl.StdCtrls, Vcl.Graphics;

type
  TMy_PanelLabel = class; //<= diese Zeile sollttest du vergessen

  TMy_PanelLabel = class(TPanel) // <= das deklariert dein neues Panel, das sich über die Addfunktion ein neues Label hinzufügen kann
  private
    { Private-Deklarationen }
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
    function AddLabel(AOwner: TComponent): TLabel;
  published
    { Published-Deklarationen }
  end;
Zur Funtion LabelAdd:
Delphi-Quellcode:
function TMy_PanelLabel.AddLabel(AOwner: TComponent): TLabel;
begin
  Result := TLabel.Create(AOwner);
  Result.Name := AOwner.Name + '_' + AOwner.ComponentCount.ToString; // (1
  Result.Parent := Self;
  Result.Align := alLeft;
  Result.AutoSize := True;
  Result.AlignWithMargins := True;
  Result.Alignment := taCenter;
  Result.Layout := tlCenter;
  Result.Transparent := False;
  case (AOwner.ComponentCount mod 2) = 0 of
    True:
      Result.Color := clLime;
    False:
      Result.Color := clYellow;
  end;
end;
(1 Vergib lieber einen Tag-Wert, von eins an zählend. Solltest du auf die Idee kommen, dass dein Panel neben Labels auch andere Komponenten automatisch createn soll, stimmt Componentcount nicht mehr.

Des weiteren wäre ich mit der Vergabe von Alignwerten sehr vorsichtig. Probier doch mal aus, was passiert, wenn du ein 'Label1' und anschliessend ein 'Label2' alLeft ausrichtest - auf dem Parent liegen dann ein Label2 und anschliessend ein Label1. Und das ist nur eine kurze Beschreibung der Fehler, die sich durch unüberlegten Einsatz von Align ergeben können.
Gib die Positionswerte Left & Co lieber per Integer(..) an. Die kannst du auch umrechnen, wenn erforderlich.

Gruss
Delbor

NoGAD 23. Mai 2022 12:30

AW: Komponente: TPanel mit optionalen Labels im Panel
 
Hallo Roger,

danke für Deine Tipps.

Die Erstellung von solch einer Komponente hatte ich mir von einigen Torry-Komponenten abgeguckt. Ich bleibe dran :)

LG Mathias


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