Delphi-PRAXiS
Seite 1 von 2  1 2      

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 mit Caption bei neuer Komponente basierend auf TLabel (https://www.delphipraxis.net/159415-problem-mit-caption-bei-neuer-komponente-basierend-auf-tlabel.html)

sqlman 26. Mär 2011 23:23

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:
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.
Danke für die Hilfe.

Gruß
raka

roga 27. Mär 2011 06:48

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.

Bummi 27. Mär 2011 07:22

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.

sqlman 27. Mär 2011 08:45

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

DeddyH 27. Mär 2011 10:02

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.

sqlman 27. Mär 2011 12:12

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

DeddyH 27. Mär 2011 12:18

AW: Problem mit Caption bei neuer Komponente basierend auf TLabel
 
Die If-Abfrage in meinem Beispiel hast Du aber schon bemerkt?

himitsu 27. Mär 2011 12:47

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:
stored False
versehen

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.

sqlman 27. Mär 2011 12:54

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:
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;
Das showmessage liefert in der IDE einen leeren String und in der Anwendung das Datum der Anwendung, angezeigt im Label wird allerdings immer 'timstamp1'.

Gut, scheint also ein Oncreate Pflicht zu werden, oder?

sqlman 27. Mär 2011 12:56

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.
Seite 1 von 2  1 2      

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