![]() |
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 :-) |
AW: Komponente: TPanel mit optionalen Labels im Panel
Meinst du zur Laufzeit?
Erstelle dir einfach einen classhelper. |
AW: Komponente: TPanel mit optionalen Labels im Panel
Hallo Bernd,
ich möchte es gerne als eigene Komponente erstellen. LG Mathias |
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. |
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 :-) |
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 |
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:
Zur Funtion LabelAdd:
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;
Delphi-Quellcode:
(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.
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; 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 |
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 01:16 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