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 Eigene Komponente: Eingenschaft kann nicht gesetzt werden??? (https://www.delphipraxis.net/130514-eigene-komponente-eingenschaft-kann-nicht-gesetzt-werden.html)

romber 9. Mär 2009 23:59


Eigene Komponente: Eingenschaft kann nicht gesetzt werden???
 
Hallo!
Ich beschäftige mich gerade mit den Grundlagen der Entwicklung eigener Komponenten und versuche eine Komponente zu erstellen, die auf einer anderen visuellen Komponente basiert, z.B. auf TPanel. Ich füge der Kemponente einige neue Eigenschaften hinzu, die bereits zu Desingtime gesetzt werden können. Wenn ich dann die Komponente installiert habe, ein neues Projekt gestartet habe, die neue Komponente auf die Form setze und die neue Eingenschaften setzen möchte, werden diese nicht gesetzt.

Beispielcode:

Delphi-Quellcode:
type
  TMyPanel = class(TPanel)
  private
    FTitle: string;
    FShowTitle: Boolean;
    procedure SetTitle(const ATitle: string);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property Title: string read FTitle write SetTitle;
    property ShowTitle: Boolean read FShowTitle write FShowTitle
end;
Was mache ich falsch?

jaenicke 10. Mär 2009 01:23

Re: Eigene Komponente: Eingenschaft kann nicht gesetzt werde
 
Schau dir einmal die Eigenschaften stored und default an, um genau zu sein sagt stored, dass der Wert explizit in jedem Fall gespeichert werden soll oder eben nicht und default gibt einen Standardwert an. Diesen Standardwert setzt du ja im Konstruktor und wenn der default Wert der aktuelle Wert ist, wird dieser nicht in der .dfm Datei gespeichert.

oki 10. Mär 2009 06:20

Re: Eigene Komponente: Eingenschaft kann nicht gesetzt werde
 
Deine neuen Eigenschaften, die das Aussehen steuern sollten alle eine Settermethode haben. Nachdem du die eigenschaft geändert hast, rufe ein Repaint, Refresch oder Paint auf, damit diese Änderung auch gezeichnet wird.

Delphi-Quellcode:
type
  TMyPanel = class(TPanel)
  private
    FTitle: string;
    FShowTitle: Boolean;
    procedure SetTitle(const ATitle: string);
    procedure SetShowTitel(const Value : Boolean);
  protected
    procedure Paint; override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property Title: string read FTitle write SetTitle;
    property ShowTitle: Boolean read FShowTitle write SetShowTitle
end;

....
procedure TMyPanel.SetShowTitel(const Value : Boolean);
begin
  if FShowTitel = Value then
    Exit;
  FShowTitel := Value;
 Paint;
end;
In deiner vererbten Paint-Methode wird dann natürlich dein Titel gezeichnet.

Delphi-Quellcode:
procedure TMyPanel.Paint;
begin
  inherited;
  if FShowTitel then begin
    // ... hier zeichne ich den Titel
  end;
  // ... und so weiter
end;
Üblicherweise lagere ich solche Sachen aber in eigene Methoden wie DrawTitel aus und rufe der Übersicht halber diese nur in Paint auf.

Gruß oki

mkinzler 10. Mär 2009 06:36

Re: Eigene Komponente: Eingenschaft kann nicht gesetzt werde
 
Zitat:

Üblicherweise lagere ich solche Sachen aber in eigene Methoden wie DrawTitel aus und rufe der Übersicht halber diese nur in Paint auf.
Das ist nicht nur eine Frage der Übersicht.

oki 10. Mär 2009 06:40

Re: Eigene Komponente: Eingenschaft kann nicht gesetzt werde
 
Zitat:

Zitat von mkinzler
Das ist nicht nur eine Frage der Übersicht.

aber für den Anfang eine gute Begründung :mrgreen:

Gruß oki

romber 10. Mär 2009 14:08

Re: Eigene Komponente: Eingenschaft kann nicht gesetzt werde
 
Danke Euch! Jetzt verstehe ich es und es klappt!

oki 10. Mär 2009 14:10

Re: Eigene Komponente: Eingenschaft kann nicht gesetzt werde
 
Das freut uns!

Gruß oki


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