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/)
-   -   Kompenente erweitern - eigene Property immer leer (https://www.delphipraxis.net/152251-kompenente-erweitern-eigene-property-immer-leer.html)

bwolf 16. Jun 2010 12:38

Kompenente erweitern - eigene Property immer leer
 
Hi Leute,

stehe irgendwie auf dem Schlauch. Ich will eine Komponente erweitern, aber schaffe es nicht mal eine weiter Property hinzuzufügen und in der Laufzeit auszugeben.
Habe den Code mal auf das Minium reduzierz, es muß irgendwas ganz dämliches meinerseits sein :|
Danke für eure Hilfe!


Delphi-Quellcode:
unit DBRichEditExt;

interface

uses
  SysUtils, Classes, Controls, StdCtrls, ComCtrls, DBCtrls, Graphics, ExtCtrls,
  Dialogs, Forms, Windows;

type
  TDBRichEditExt = class(TDBRichEdit)
  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

procedure Register;
begin
  RegisterComponents('Samples', [TDBRichEditExt]);
end;

constructor TDBRichEditExt.Create(AOwner: TComponent);
begin
  inherited;
  showmessage(FCaption); // immer leer?
end;

end.

khh 16. Jun 2010 12:41

AW: Kompenente erweitern - eigene Property immer leer
 
Zitat:

Zitat von bwolf (Beitrag 1029347)
Hi Leute,

stehe irgendwie auf dem Schlauch. Ich will eine Komponente erweitern, aber schaffe es nicht mal eine weiter Property hinzuzufügen und in der Laufzeit auszugeben.
Habe den Code mal auf das Minium reduzierz, es muß irgendwas ganz dämliches meinerseits sein :|
Danke für eure Hilfe!


vieleicht sthe ich grad auch auf dem Schlauch ;-)
ich sehe nirgeds im Quelltext dass du der Variablen einen Wert zuweist.

Gruss KHH

Bummi 16. Jun 2010 12:42

AW: Kompenente erweitern - eigene Property immer leer
 
Wo soll der Inhalt im Contructor denn herkommen?

bwolf 16. Jun 2010 12:51

AW: Kompenente erweitern - eigene Property immer leer
 
Hi,
ich dachte das die setter / getter optional sind...zu anfangs hatte ich es so:

Delphi-Quellcode:
unit DBRichEditExt;

interface

uses
  SysUtils, Classes, Controls, StdCtrls, ComCtrls, DBCtrls, Graphics, ExtCtrls,
  Dialogs, Forms, Windows;

type
  TDBRichEditExt = class(TDBRichEdit)
  private
    { Private-Deklarationen }
    FCaption : String;
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
    constructor Create(AOwner: TComponent); override;
    procedure setCaption(value : string);
    function getCaption() : string;
  published
    { Published-Deklarationen }
    property Caption: String read getCaption write setCaption;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TDBRichEditExt]);
end;

constructor TDBRichEditExt.Create(AOwner: TComponent);
begin
  inherited;
  showmessage(FCaption); // immer leer?
end;

procedure TDBRichEditExt.setCaption(value : string);
begin
  if value <> FCaption then
    FCaption := value;
end;

function TDBRichEditExt.getCaption() : string;
begin
  result := FCaption;
end;

end.

Bummi 16. Jun 2010 12:58

AW: Kompenente erweitern - eigene Property immer leer
 
Die Getter und Setter brauchst Du nur wenn dort zusätzlich etwas anders getan werden soll als FCaption zu lesen/schreiben, z.B. auf ein Canvas malen, etwas aktualiesiere etc.

Wenn Du unbedingt in Caption was sehen willst auch wenn Du im Code/Objektinspektor nichts einträgst dann schreib es im Contructor rein:

Delphi-Quellcode:
constructor TDBRichEditExt.Create(AOwner: TComponent);
begin
  inherited;
   Fcaption := 'Was auch immer Du sehen willst';
   showmessage(FCaption); // immer leer?
end;

Neutral General 16. Jun 2010 13:01

AW: Kompenente erweitern - eigene Property immer leer
 
Das Problem ist, dass der Konstruktor ausgeführt wird BEVOR die das Control die Werte aus der DFM zugewiesen bekommt. Von daher ist FCaption im Konstruktor natürlich noch leer

bwolf 16. Jun 2010 13:03

AW: Kompenente erweitern - eigene Property immer leer
 
Ah, Danke michael.
Wo wäre denn der Richtige Zeitpunkt diesen Wert zuzuweisen?

Neutral General 16. Jun 2010 13:07

AW: Kompenente erweitern - eigene Property immer leer
 
Das mit

Delphi-Quellcode:
read FCaption write FCaption;
Ist ja so in Ordnung. Wenn du in deinem (Test-)Programm mal im FormCreate oder später DBRicheditExt1.Caption ausgeben lässt, dann bekommst du auch den im OI eingestellten Wert zu sehen.

bwolf 16. Jun 2010 13:17

AW: Kompenente erweitern - eigene Property immer leer
 
Jo, das hatte ich auch schon erfolgreich getestet.

Allerdings verstehe ich dann nicht wie ich da machen soll:
Ich will im momentan überhalb von einem richEdit ein Label anzeigen. Das klappst soweit auch.
Nun möchte in der ObjektInspektor den Text vergeben der in diesem Label zur Laufzeit anzeigt werden soll.

Wenn im OnCreate die FCaption aus der Designtime nicht zur verfügung steht - wann soll ich dann in meiner erweiterten Komponente dem Label den Text aus dem ObjektInspektor zuweisen? Ich finde da kein vernünftiges event.

Neutral General 16. Jun 2010 13:20

AW: Kompenente erweitern - eigene Property immer leer
 
Delphi-Quellcode:
TDBRichEditExt = class(TDBRichEdit)
  private
    { Private-Deklarationen }
    FCaption : String;
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
    constructor Create(AOwner: TComponent); override;
    procedure setCaption(value : string);
  published
    { Published-Deklarationen }
    property Caption: String read FCaption write setCaption;
  end;

implementation

// FCaption wäre überflüssig, wenn es noch einen Getter gäbe, der
// die Caption des Anzeige-Labels zurückgeben würde
procedure TDBRichEditExt.setCaption(value : string);
begin
  if value <> FCaption then
  begin
    FCaption := value;
    FAnzeigeLabel.Caption := FCaption; // := Value;
  end;
end;
Wobei ich in deiner Komponente bisher noch kein Label sehe...


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:56 Uhr.
Seite 1 von 2  1 2      

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