2016-05-16 4 views
0

Nehmen wir ein Beispiel für eine Komponente, die eine Eigenschaft namens ColumnWidth mit dem Standardwert 50 enthält. Während der Entwurfszeit ändere ich den Wert auf 100 und kompiliere dann die Anwendung.Wie erhält man den Anfangswert einer Komponenteneigenschaft?

Jetzt möchte ich eine Reset to default (Popup-Menü) Schaltfläche innerhalb meiner Komponente implementieren, die die ColumnWidth auf Wert 100 initialisiert, falls der Benutzer es in der Zwischenzeit ändern.

TMyComponent = class(TComponent) 
    private 
    FVirtualStringTree: TVirtualStringTree; 
    FColumnWidth: Integer; 
    FColumnWidthDef: Integer; 
    public 
    constructor Create(AOwner: TComponent); override; 
    destructor Destroy; override; 
    procedure ResetToDefault; 
    published 
    property ColumnWidth: Integer read FColumnWidth write SetColumnWidth default 50; 
    property VirtualStringTree: TVirtualStringTree read FVirtualStringTree write FVirtualStringTree; 
    end; 

constructor TMyComponent.Create(AOwner: TComponent); 
begin 
    inherited; 
    FColumnWidth:= 50; 
end; 

destructor TMyComponent.Destroy; 
begin 
    inherited; 
end; 

procedure TMyComponent.SetColumnWidth(const Value: Integer); 
begin 
    if FColumnWidth <> Value then FColumnWidth:= Value; 
end; 

procedure TMyComponent.ResetToDefault; 
begin 
    ColumnWidth:= FColumnWidthDef; 
end; 

Unter den Komponentenmethoden, wie kann ich speichern den Anfangswert von ColumnWidth?

+1

Warum verwenden Sie keine Konstante überall? –

+0

Hat die Antwort, die Sie vor ein paar Wochen auf die gleiche Frage erhalten haben, nicht mit dem zusätzlichen @RobKennedy-Kommentar funktioniert, wie Sie es wollten? –

+0

Für die vorhergehende "ähnliche" Frage hatte ich die gleiche Idee, aber mit einem Fehler von mir zu tun. Ich dachte, ich muss es von der Design-Zeit machen, aber in der Tat ist es notwendig, es in Echtzeit zu tun. Jetzt denke ich, dass diese Frage klarer ist. Programmieren ist ein Hobby und kein Job, also sind Internet und Stackoverflow meine einzigen Trainer. Vielen Dank für Ihr Verständnis, wenn ich manchmal dumme Fragen stelle. – REALSOFO

Antwort

1

Der Wert 100 ist in der Komponente nicht verfügbar, da er in der DFM-Ressource des Formulars, Frames oder Datenmoduls gespeichert ist, in dem sich die Komponente befindet. Leider kann es mühsam sein, diesen Wert später erneut aus dem DFM zu lesen (obwohl dies möglich ist). Daher sollten Sie den Wert in einem Formularfeld während des Ereignisses FormCreate speichern und später verwenden, um diese Komponenteneigenschaft auf den gespeicherten Wert zurückzusetzen.

+0

Ich glaube, 'FColumnWidthDef' ist für diesen Zweck da. –