![]() |
Zeitpunkt der Übernahme von Objektinspektor-Einstellungen
Hallo,
weiß Jemand zu welchem Zeitpunkt die Einstellungen im Objektinspektor auf die betreffende Komponente übertragen werden? Ich habe ein eigenes Form von TForm abgeleitet. Dieses soll, wenn gewünscht, am besten vor dem ersten Form-Show seine Position aus der Registry laden. Das Problem ist die published Property "LoadPosition":
Delphi-Quellcode:
Die Default-Werte müssen ja nach dem "inherited Create..." gesetzt
constructor Create(Owner: TComponent); override;
begin inherited Create(Owner); LoadPosition := True; end; werden, damit sie im Objektinspektor den richtigen Standard-Wert haben. Ich habe nun die Prozedur "DoShow" von TCustomForm überschrieben und nach dem "inherited DoShow;" abgefragt ob "LoadPosition" True oder False ist, aber egal was im Objektinspektor eingestellt ist: Ich bekomme ich immer den Wert aus meinem Constructor! |
Re: Zeitpunkt der Übernahme von Objektinspektor-Einstellunge
Zuerst wird der Konstruktor abgearbeitet.
Dann lädt die VCL die Properties aus der DFM-Resource. Danach wird die Procedure Loaded aufgerufen. Man kann diese Procedure überschreiben, um so direkt nach dem Laden der DFM einzugreifen. In deinem Fall wird es wohl so sein, dass das Property LoadPosition nicht in der DFM steckt und deshalb auch nicht geladen wird. |
Re: Zeitpunkt der Übernahme von Objektinspektor-Einstellunge
Jetzt habe ich interessanter Weise immer False (egal was im Objektinspektor eingestellt ist)...
So hatte ich mir das ganze vorgestellt:
Delphi-Quellcode:
unit xForm;
interface uses Forms, Classes; type TxForm = class(TForm) private FSavePosition: Boolean; FSaveSize: Boolean; FSaveState: Boolean; FLoadPosition: Boolean; FLoadSize: Boolean; FLoadState: Boolean; protected procedure Loaded; override; procedure DoClose(var Action: TCloseAction); override; public constructor Create(Owner: TComponent); override; destructor Destroy; override; published property SavePosition: Boolean read FSavePosition write FSavePosition default True; property SaveSize: Boolean read FSaveSize write FSaveSize default True; property SaveState: Boolean read FSaveState write FSaveState default True; property LoadPosition: Boolean read FLoadPosition write FLoadPosition default True; property LoadSize: Boolean read FLoadSize write FLoadSize default True; property LoadState: Boolean read FLoadState write FLoadState default True; end; implementation uses SysUtils; constructor TxForm.Create(Owner: TComponent); begin inherited Create(Owner); FSavePosition := True; //Hier die Default-Werte setzen FSaveSize := True; //für den Fall das in der DFM FSaveState := True; //noch keine Werte hinterlegt sind FLoadPosition := True; //Diese Werte werden dann später FLoadSize := True; //durch die DFM Werte überschrieben FLoadState := True; end; destructor TxForm.Destroy; begin inherited Destroy; end; procedure TxForm.Loaded; begin inherited Loaded; // xLoadWindow(Self, FLoadPosition, FLoadSize, FLoadState); //Hier sollen bei Bedarf die Eigenschaften geladen werden end; procedure TxForm.DoClose(var Action: TCloseAction); begin inherited DoClose(Action); // if (Application.MainForm = Self) or ((Action <> caHide) and (Action <> caMinimize)) then //Hier sollen bei Bedarf die // xSaveWindow(Self, FSavePosition, FSaveSize, FSaveState); //Eigenschaften gespeichert werden end; end. Die Objektinspektor-Einstellungen werden auf jeden Fall in der DFM gespeichert, denn wenn ich das Projekt schließe und wieder lade werden meine Einstellungen wieder hergestellt. Bei xLoadWindow in "DoShow" habe ich nur TRUE (meine Default-Werte) aber noch nicht die Werte aus der DFM. Bei xLoadWindow in "Loaded" habe ich nur FALSE (anscheinen noch nicht einmal die Default Werte) "Loaded" kehrt wohl in meinen "inherited Create" noch vor den Defaults zurück... |
Re: Zeitpunkt der Übernahme von Objektinspektor-Einstellunge
Du möchtest also ein Formular, dass seine Position & State speichert und beim Anzeigen wieder holt.
Da gibt es aber bessere Ansätze als das Ableiten von TForm. Ableiten kann man nur einmal. Wenn der Job aber an eine Komponente delegiert wird, dann kann man die Funktionalität auch auf Formularen nützen, die schon von irgend einer Masterklasse abgeleitet wurden. In der RX-Lib gibt es die Komponenten TFormPlacement & TFormStorage. Diese gibt es (verbessert) auch in der JVCL 3. Vorallem können die Komponenten zusätzlich jedes beliebige Property (z.B. Edit1.Text) zusätzlich in der Registry oder INI-Datei speichern. |
Re: Zeitpunkt der Übernahme von Objektinspektor-Einstellunge
An die Möglichkeit einer Komponente hatte ich auch schon gedacht
und die Idee für so etwas hatte ganz bestimmt auch schon jemand... Allerdings versuche ich, wenn möglich, ausschließlich eigenen Code zu verwenden. Ich möchte dabei ja auch was lernen (empfinde da so etwas wie sportlichen Ehrgeiz das selbst hinzubekommen...und wenn dann immer noch lieber mit Hilfe als Kopieren...). Außerdem finde ich es schöner wenn die Properties zum Speichern und Laden der Fenstereigenschaften auch unter den Properties des Fensters und nicht unter denen einer darauf befindlichen Komponente sind. Das xForm kommt dann in die Objektablage und wird der Standard für neue Forms bzw. Projekte. Davon abgesehen...das muß beim Ableiten doch irgendwie hinzukriegen sein!?! |
Re: Zeitpunkt der Übernahme von Objektinspektor-Einstellunge
Zitat:
Delphi-Quellcode:
initialization
// die Klasse muss registriert werden, sonst weiss die VCL nicht, // dass Sie die zusätzlichen Published Properties streamen soll RegisterClass(TXForm); end. |
Re: Zeitpunkt der Übernahme von Objektinspektor-Einstellunge
Hab ich schon gemacht...meine Form ist bereits in der Objektablage,
alle Properties sind im Objektinspektor... Alles super - Mir fehlt nur die Stelle wo ich den Load meiner gespeicherten Einstellungen ausführen muß... Hier der Code aus meinem Package...
Delphi-Quellcode:
procedure Register;
begin RegisterCustomModule(TxForm, TCustomModule); end; |
Re: Zeitpunkt der Übernahme von Objektinspektor-Einstellunge
Hab' noch mal herumprobiert und festgestellt das die Einstellungen
zur Designzeit im Objektinspektor gespeichert und geladen werden. Beim starten des Programms werden die Einstellungen aber nicht geladen! Hat auch nicht geholfen:
Delphi-Quellcode:
initialization
RegisterClass(TXForm); end. |
Re: Zeitpunkt der Übernahme von Objektinspektor-Einstellunge
wenn du auf dein Form einen Button packst und beim klick darauf die Eigenschaft liest, ist sie dann gesetzt?
|
Re: Zeitpunkt der Übernahme von Objektinspektor-Einstellunge
In der DFM noch "object" anstatt "inherited" stehen?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:28 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