![]() |
Problem mit Caption bei neuer Komponente basierend auf TLabel
Hallo Forum,
vielleicht könnte Ihr mir einmal behilflich sein. Ich habe eine Komponente, basierend auf TLabel, erstellt. Im Konstruktor soll die Caption gesetzt werden. Leider tut sich gar nichts. Parallel habe ich mal die Farbe gesetzt. Funktioniert einwandfrei. Frage: Was mache ich bei der Caption falsch, das die nicht gesetzt wird? Ich verwende D7.
Code:
Danke für die Hilfe.
unit raka_timestamp;
interface uses Classes, Controls, StdCtrls; type Ttimestamp = class(TLabel) private { Private-Deklarationen } protected { Protected-Deklarationen } public { Public-Deklarationen } constructor Create(AOwner:Tcomponent);override; published { Published-Deklarationen } end; procedure Register; implementation uses dialogs,sysutils,forms; procedure Register; begin RegisterComponents('Standard',[TTimeStamp]); end; constructor Ttimestamp.Create(AOwner:TComponent); begin inherited Create(AOwner); Font.Color:=$00FFFF; Caption:='test'; end; end. Gruß raka |
AW: Problem mit Caption bei neuer Komponente basierend auf TLabel
Delphi-Quellcode:
unit raka_timestamp;
interface uses Classes, Controls, StdCtrls; type Ttimestamp = class(TLabel) private { Private-Deklarationen } FCaption: String; // <-- protected { Protected-Deklarationen } public { Public-Deklarationen } constructor Create(AOwner:Tcomponent);override; published { Published-Deklarationen } property Caption: String read FCaption write FCaption; // <-- end; procedure Register; implementation uses dialogs,sysutils,forms; procedure Register; begin RegisterComponents('Standard',[TTimeStamp]); end; constructor Ttimestamp.Create(AOwner:TComponent); begin inherited Create(AOwner); Font.Color:=$00FFFF; FCaption:='test'; // <-- FCaption! end; end. |
AW: Problem mit Caption bei neuer Komponente basierend auf TLabel
Die Implementierung von sqlman ist korrekt und funktioniert bei mir einwandfrei (D2010, D7 habe ich leider gerade nicht greifbar). Das Neueinführen von FCaption ist nicht zielführend, da diese ja gar nicht zum Zeichnen herangezogen würde.
|
AW: Problem mit Caption bei neuer Komponente basierend auf TLabel
Ich muss etwas ergänzen:
In der IDE wird die Caption gesetzt. Ich möchte aber, das hier zur Laufzeit, also beim erstellen des Labels das Datum der Application hineingeschrieben wird. Dies funktioniert zur Laufzeit nicht. Es bleibt die Caption der IDE stehen. Wir der Konstruktor nicht mehr zur Laufzeit durchlaufen ? Gruß raka |
AW: Problem mit Caption bei neuer Komponente basierend auf TLabel
Ich habe das hier gerade unter Delphi 7 ausprobiert, bei mir funktioniert das:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TTest = class(TLabel) public constructor Create(AOwner: TComponent); override; end; TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private-Deklarationen } FTest: TTest; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} { TTest } constructor TTest.Create(AOwner: TComponent); begin inherited; if not (csDesigning in ComponentState) then Caption := DateToStr(FileDateToDateTime(FileAge(ParamStr(0)))); end; procedure TForm1.FormCreate(Sender: TObject); begin FTest := TTest.Create(nil); FTest.Parent := self; FTest.Left := 10; FTest.Top := 10; end; procedure TForm1.FormDestroy(Sender: TObject); begin FTest.Free; end; end. |
AW: Problem mit Caption bei neuer Komponente basierend auf TLabel
Ich habe das neue Label allerdings als Komponente installiert. Wenn ich es dann auf die IDE ziehe, bzw. auf die Form, wird dort anscheinend das Erstellungsdatum der IDE abgfebildet. Dieses Datum bleibt dann allerdings auch bei der Form nach dem Start des Programms bestehen.
Also noch einmal, nicht das es unverständlich wird. ICh erstelle eine neue Komponente wie ganz oben beschrieben. Diese verwende ich in einer Form. Dort erscheint das Label dann mit einem Datum, wie gewünscht, jedoch die der IDE (anscheinend). Starte ich nun die Software, erscheint dort das Datum, welches ich bereits in der IDE sah und NICHT das des Prpogramms , das die Form darstellt. Mir schwant, das beim Create in der IDE die Caption gesetzt wird, irgendow ziwschengespeichert wird und insofern als überschrieben gilt, durch den Objektinspektor.... ICh denke ich brauche noch eine Methode ähnlich oncreate ? Gruß raka |
AW: Problem mit Caption bei neuer Komponente basierend auf TLabel
Die If-Abfrage in meinem Beispiel hast Du aber schon bemerkt?
|
AW: Problem mit Caption bei neuer Komponente basierend auf TLabel
Wenn einmal ein Wert in der DFM gespeichert wurde, dann wird beim Laden/Erstellen deiner Komponente der Constructor und damit die aktuelle Zeit in die Caption geladen, aber danach wird dieses mit den Werten der DFM überschrieben.
Fazit: man unterbindest das Setzen der Caption und sagt dem DFM-Loader, daß die Caption nicht gepsiehcert und somit später nicht mehr geladen werden soll. > Setter von Gaption überschreiben > das Property mit der Direktive
Delphi-Quellcode:
versehen
stored False
Ab da kann man die Caption nicht mehr manuell verändern und es wird immer der Wert des Constructors genutzt. Aber in soeinem Fall würde ich nicht von TLabel ableiten, sondern von TCustomLabel und .Caption sollte dann nicht als Published deklatiert werden. |
AW: Problem mit Caption bei neuer Komponente basierend auf TLabel
Das einzige was dein if erreicht hat, ist das das Label dann den Namen des Typs im Designer erhält und dieser anschliessend in dem Programm bestehen bleibt.
Der Konstruktor wird aber zur Laufzeit durchlaufen...und setzt auch die Caption des Labels. Aber diese wird danach wieder überschrieben. Dies ergab ein Showmessage(caption) im Konstructor.
Code:
Das showmessage liefert in der IDE einen leeren String und in der Anwendung das Datum der Anwendung, angezeigt im Label wird allerdings immer 'timstamp1'.
constructor Ttimestamp.Create(AOwner:TComponent);
begin inherited Create(AOwner); if not (csDesigning in ComponentState) then caption:=datetimetostr(sysutils.FileDateToDateTime(fileage(application.exename))); showmessage(caption); end; Gut, scheint also ein Oncreate Pflicht zu werden, oder? |
AW: Problem mit Caption bei neuer Komponente basierend auf TLabel
@himitsu: Die Sache mit dem TLael sollte nur das Problem für das Forum vereinfachen. Es ist aber definiv so wie du gesagt hast. Weisst Du ob das holen der DFM Werte vor dem OnCreate geschieht? Dann könnte ich meine Problem, das ich hier mit der Caption des TLabel darstellen wollte ebenfalls so lösen.
Gruß Raka |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:59 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