Ignore:
Timestamp:
Oct 27, 2016, 3:00:47 PM (8 years ago)
Author:
chronos
Message:
  • Added: Remember position and size of main form after close of application.
  • Modified: Updated Common package to latest version.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Packages/Common/UPersistentForm.pas

    r59 r73  
    33{$mode delphi}
    44
    5 // Date: 2010-06-01
     5// Date: 2015-04-18
    66
    77interface
     
    2020    FRegistryContext: TRegistryContext;
    2121  public
     22    FormNormalSize: TRect;
     23    FormRestoredSize: TRect;
     24    FormWindowState: TWindowState;
     25    Form: TForm;
     26    procedure LoadFromRegistry(RegistryContext: TRegistryContext);
     27    procedure SaveToRegistry(RegistryContext: TRegistryContext);
    2228    function CheckEntireVisible(Rect: TRect): TRect;
    2329    function CheckPartVisible(Rect: TRect; Part: Integer): TRect;
     
    4450{ TPersistentForm }
    4551
     52procedure TPersistentForm.LoadFromRegistry(RegistryContext: TRegistryContext);
     53begin
     54  with TRegistryEx.Create do
     55  try
     56    RootKey := RegistryContext.RootKey;
     57    OpenKey(RegistryContext.Key + '\Forms\' + Form.Name, True);
     58    // Normal size
     59    FormNormalSize.Left := ReadIntegerWithDefault('NormalLeft', FormNormalSize.Left);
     60    FormNormalSize.Top := ReadIntegerWithDefault('NormalTop', FormNormalSize.Top);
     61    FormNormalSize.Right := ReadIntegerWithDefault('NormalWidth', FormNormalSize.Right - FormNormalSize.Left)
     62      + FormNormalSize.Left;
     63    FormNormalSize.Bottom := ReadIntegerWithDefault('NormalHeight', FormNormalSize.Bottom - FormNormalSize.Top)
     64      + FormNormalSize.Top;
     65    // Restored size
     66    FormRestoredSize.Left := ReadIntegerWithDefault('RestoredLeft', FormRestoredSize.Left);
     67    FormRestoredSize.Top := ReadIntegerWithDefault('RestoredTop', FormRestoredSize.Top);
     68    FormRestoredSize.Right := ReadIntegerWithDefault('RestoredWidth', FormRestoredSize.Right - FormRestoredSize.Left)
     69      + FormRestoredSize.Left;
     70    FormRestoredSize.Bottom := ReadIntegerWithDefault('RestoredHeight', FormRestoredSize.Bottom - FormRestoredSize.Top)
     71      + FormRestoredSize.Top;
     72    // Other state
     73    FormWindowState := TWindowState(ReadIntegerWithDefault('WindowState', Integer(wsNormal)));
     74  finally
     75    Free;
     76  end;
     77end;
     78
     79procedure TPersistentForm.SaveToRegistry(RegistryContext: TRegistryContext);
     80begin
     81  with Form, TRegistryEx.Create do
     82  try
     83    RootKey := RegistryContext.RootKey;
     84    OpenKey(RegistryContext.Key + '\Forms\' + Form.Name, True);
     85    // Normal state
     86    WriteInteger('NormalWidth', FormNormalSize.Right - FormNormalSize.Left);
     87    WriteInteger('NormalHeight', FormNormalSize.Bottom - FormNormalSize.Top);
     88    WriteInteger('NormalTop', FormNormalSize.Top);
     89    WriteInteger('NormalLeft', FormNormalSize.Left);
     90    // Restored state
     91    WriteInteger('RestoredWidth', FormRestoredSize.Right - FormRestoredSize.Left);
     92    WriteInteger('RestoredHeight', FormRestoredSize.Bottom - FormRestoredSize.Top);
     93    WriteInteger('RestoredTop', FormRestoredSize.Top);
     94    WriteInteger('RestoredLeft', FormRestoredSize.Left);
     95    // Other state
     96    WriteInteger('WindowState', Integer(FormWindowState));
     97  finally
     98    Free;
     99  end;
     100end;
     101
    46102function TPersistentForm.CheckEntireVisible(Rect: TRect): TRect;
    47103var
     
    98154procedure TPersistentForm.Load(Form: TForm; DefaultMaximized: Boolean = False);
    99155var
    100   Normal: TRect;
    101   Restored: TRect;
    102156  LoadDefaults: Boolean;
    103157begin
    104   with TRegistryEx.Create do
    105     try
    106       RootKey := RegistryContext.RootKey;
    107       OpenKey(RegistryContext.Key + '\Forms\' + Form.Name, True);
    108 
    109       //RestoredWindowState := TWindowState(ReadIntegerWithDefault('WindowState', Integer(Form.WindowState)));
    110       //if RestoredWindowState = wsMinimized then
    111       //  RestoredWindowState := wsNormal;
    112       //Form.WindowState := RestoredWindowState;
    113       LoadDefaults := not ValueExists('NormalLeft');
    114       Normal := Bounds(ReadIntegerWithDefault('NormalLeft', (Screen.Width - Form.Width) div 2),
    115         ReadIntegerWithDefault('NormalTop', (Screen.Height - Form.Height) div 2),
    116         ReadIntegerWithDefault('NormalWidth', Form.Width),
    117         ReadIntegerWithDefault('NormalHeight', Form.Height));
    118       Restored := Bounds(ReadIntegerWithDefault('RestoredLeft', (Screen.Width - Form.Width) div 2),
    119         ReadIntegerWithDefault('RestoredTop', (Screen.Height - Form.Height) div 2),
    120         ReadIntegerWithDefault('RestoredWidth', Form.Width),
    121         ReadIntegerWithDefault('RestoredHeight', Form.Height));
    122 
    123       if not EqualRect(Normal, Restored) or
    124         (LoadDefaults and DefaultMaximized) then begin
    125         // Restore to maximized state
    126         Form.WindowState := wsNormal;
    127         if not EqualRect(Restored, Form.BoundsRect) then
    128           Form.BoundsRect := Restored;
    129         Form.WindowState := wsMaximized;
    130       end else begin
    131         // Restore to normal state
    132         Form.WindowState := wsNormal;
    133         if FEntireVisible then Normal := CheckEntireVisible(Normal)
    134           else if FMinVisiblePart > 0 then
    135         Normal := CheckPartVisible(Normal, FMinVisiblePart);
    136         if not EqualRect(Normal, Form.BoundsRect) then
    137           Form.BoundsRect := Normal;
    138       end;
    139 
    140       //if ReadBoolWithDefault('Visible', False) then Form.Show;
    141     finally
    142       Free;
    143     end;
     158  Self.Form := Form;
     159  // Set default
     160  FormNormalSize := Bounds((Screen.Width - Form.Width) div 2,
     161    (Screen.Height - Form.Height) div 2, Form.Width, Form.Height);
     162  FormRestoredSize := Bounds((Screen.Width - Form.Width) div 2,
     163    (Screen.Height - Form.Height) div 2, Form.Width, Form.Height);
     164
     165  LoadFromRegistry(RegistryContext);
     166
     167  if not EqualRect(FormNormalSize, FormRestoredSize) or
     168    (LoadDefaults and DefaultMaximized) then begin
     169    // Restore to maximized state
     170    Form.WindowState := wsNormal;
     171    if not EqualRect(FormRestoredSize, Form.BoundsRect) then
     172      Form.BoundsRect := FormRestoredSize;
     173    Form.WindowState := wsMaximized;
     174  end else begin
     175    // Restore to normal state
     176    Form.WindowState := wsNormal;
     177    if FEntireVisible then FormNormalSize := CheckEntireVisible(FormNormalSize)
     178      else if FMinVisiblePart > 0 then
     179    FormNormalSize := CheckPartVisible(FormNormalSize, FMinVisiblePart);
     180    if not EqualRect(FormNormalSize, Form.BoundsRect) then
     181      Form.BoundsRect := FormNormalSize;
     182  end;
    144183end;
    145184
    146185procedure TPersistentForm.Save(Form: TForm);
    147186begin
    148   with Form, TRegistryEx.Create do
    149     try
    150       RootKey := RegistryContext.RootKey;
    151       OpenKey(RegistryContext.Key + '\Forms\' + Form.Name, True);
    152       WriteInteger('NormalWidth', Form.Width);
    153       WriteInteger('NormalHeight', Form.Height);
    154       WriteInteger('NormalTop', Form.Top);
    155       WriteInteger('NormalLeft', Form.Left);
    156       WriteInteger('RestoredWidth', Form.RestoredWidth);
    157       WriteInteger('RestoredHeight', Form.RestoredHeight);
    158       WriteInteger('RestoredTop', Form.RestoredTop);
    159       WriteInteger('RestoredLeft', Form.RestoredLeft);
    160       //WriteInteger('WindowState', Integer(Form.WindowState));
    161       //WriteBool('Visible', Form.Visible);
    162     finally
    163       Free;
    164     end;
     187  Self.Form := Form;
     188  FormNormalSize := Bounds(Form.Left, Form.Top, Form.Width, Form.Height);
     189  FormRestoredSize := Bounds(Form.RestoredLeft, Form.RestoredTop, Form.RestoredWidth,
     190    Form.RestoredHeight);
     191  FormWindowState := Form.WindowState;
     192  SaveToRegistry(RegistryContext);
    165193end;
    166194
     
    168196begin
    169197  inherited;
     198  if AOwner is TForm then Form := TForm(AOwner)
     199    else Form := nil;
    170200  FMinVisiblePart := 50;
    171201  FRegistryContext.RootKey := HKEY_CURRENT_USER;
Note: See TracChangeset for help on using the changeset viewer.