在Delphi TForm上保存最大化和表单大小

时间:2009-07-28 15:30:59

标签: delphi forms size

这个问题似乎很容易,但由于某种原因,我很难找到答案。

我有一个应用程序可以将表单的大小和位置保存在INI文件中。这一切都很好,但是当你最大化时关闭应用程序时,它将保存表单的大小和位置最大化而不是其状态。

我的意思是,在下一次运行时,表单会显示最大化,而实际上它已“恢复”但覆盖整个桌面。

有没有办法保存最大化事件之前的表单大小,然后保存表单最大化的事实。 INI文件中的读取是否以最大化状态创建表单并将其“恢复”大小设置为最大化事件之前的大小?

谢谢!

4 个答案:

答案 0 :(得分:12)

使用Windows API函数 GetWindowPlacement() ,如下所示:

procedure TForm1.WriteSettings(AUserSettings: TIniFile);
var
  Wp: TWindowPlacement;
begin
  Assert(AUserSettings <> nil);

  if HandleAllocated then begin
    // The address of Wp should be used when function is called
    Wp.length := SizeOf(TWindowPlacement);
    GetWindowPlacement(Handle, @Wp);

    AUserSettings.WriteInteger(SektionMainForm, KeyFormLeft,
      Wp.rcNormalPosition.Left);
    AUserSettings.WriteInteger(SektionMainForm, KeyFormTop,
      Wp.rcNormalPosition.Top);
    AUserSettings.WriteInteger(SektionMainForm, KeyFormWidth,
      Wp.rcNormalPosition.Right - Wp.rcNormalPosition.Left);
    AUserSettings.WriteInteger(SektionMainForm, KeyFormHeight,
      Wp.rcNormalPosition.Bottom - Wp.rcNormalPosition.Top);
    AUserSettings.WriteBool(SektionMainForm, KeyFormMaximized,
      WindowState = wsMaximized);
  end;
end;

答案 1 :(得分:3)

尝试使用Form.WindowState属性。通过阅读本文,您可以将其写入ini文件,然后从ini读回以在form.show方法中重新设置状态。您可能希望将其重新转换为整数,因为WindowState是枚举类型(TWindowState)。

答案 2 :(得分:2)

汤姆的回答应该很好。这里有一些伪代码可以澄清一下:

procedure TfrmDatenMonitor.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  inherited;
  //*** Save the WindowState in every case
  aIniFile.WriteInteger(Name, 'State', Integer(WindowState));

  if WindowState = wsNormal then begin
    //*** Save Position and Size, too...
    aIniFile.WriteInteger(Name, 'Top',    Top);
    aIniFile.WriteInteger(Name, 'Left',   Left);
    aIniFile.WriteInteger(Name, 'Height', Height);
    aIniFile.WriteInteger(Name, 'Width',  Width);
  end;
end;

在读取设置时首先设置尺寸和位置。 然后读取WindowState并为其分配一个类型转换:

WindowState := TWindowState(aIniFile.ReadInteger(Name, 'State', Integer(wsNormal)));

答案 3 :(得分:0)

DelphiDabbler有一些不错的window state components。您只需在表单上删除一个,它就会将状态保存到ini文件或表单上的注册表中,并将其加载到表单创建中。