unit PxFormStorage; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, JvComponent, JvFormPlacement, JvAppStorage; type TPxFormStorage = class(TJvFormStorage) private { Déclarations privées } FSaveFormCloseQuery: TCloseQueryEvent; FSaveFormShow: TNotifyEvent; FSaveFormCreate: TNotifyEvent; procedure SetPxEvents; procedure FormCreate(Sender: TObject); protected { Déclarations protégées } procedure Notification(AComponent: TComponent; Operation: TOperation); override; protected procedure Loaded; override; public { Déclarations publiques } constructor Create(AOwner: TComponent); override; published { Déclarations publiées } end; procedure Register; implementation {TPxFormStorage} procedure TPxFormStorage.Notification(AComponent: TComponent; Operation: TOperation); begin inherited Notification(AComponent, Operation); if not (csDestroying in ComponentState) and (Operation = opRemove) and (AppStorage <> nil) then if AppStorage = AComponent then AppStorage := nil; end; constructor TPxFormStorage.Create(AOwner: TComponent); begin inherited Create(AOwner); if Owner is TCustomForm then with Form do begin FSaveFormCloseQuery := OnCloseQuery; FSaveFormShow := OnShow; end end; procedure TPxFormStorage.FormCreate(Sender: TObject); begin if Assigned(FSaveFormCreate) then FSaveFormCreate(Sender); if IsActive then try RestoreFormPlacement; except Application.HandleException(Self); end; if Form.Left > screen.Width then Form.Left := screen.Width - Form.Width; if Form.Top > screen.Height then Form.Top := screen.Height - Form.Height; end; procedure TPxFormStorage.SetPxEvents; begin if Owner is TCustomForm then with Form do begin FSaveFormCreate := OnCreate; OnCreate := FormCreate; OnCloseQuery := FSaveFormCloseQuery; //Cancel redirection FormCloseQuery; OnShow := FSaveFormShow; //Cancel JvFormStorage redirection to Form.OnShow end; end; procedure TPxFormStorage.Loaded; var Loading: boolean; procedure LinkAppStorageFrom(AOwner: TComponent); var i: integer; begin if AOwner = Application then AOwner := Application.MainForm; if Assigned(AOwner) then with AOwner do begin for i := 0 to ComponentCount - 1 do if (Components[i] is TJvFormStorage) and Assigned(TJvFormStorage(Components[i]).AppStorage) then begin AppStorage := TJvFormStorage(Components[i]).AppStorage; if AppStoragePath = '' then AppStoragePath := AOwner.Name; AppStoragePath := TJvFormStorage(Components[i]).AppStoragePath + AppStoragePath; Break; end; if not Assigned(AppStorage) and (AOwner <> Application.MainForm) then LinkAppStorageFrom(AOwner.Owner); //Owner..n end; end; begin Loading := csLoading in ComponentState; inherited Loaded; if Loading and not (csDesigning in ComponentState) then begin SetPxEvents; if not Assigned(AppStorage) then LinkAppStorageFrom(FORM.Owner); end; end; procedure Register; begin RegisterComponents('Paradoxos', [TPxFormStorage]); end; end.