2009-07-28 1 views
7

Этот вопрос кажется простым, но по какой-то причине у меня проблемы с поиском ответа.Сохранение максимального размера и размера формы на Delphi TForm

У меня есть приложение, которое сохраняет размер и положение формы в INI-файле. Это все хорошо, однако при закрытии приложения при максимальном сохранении размер и положение формы максимизируются, но не ее состояние.

Я имею в виду, что при следующем запуске форма будет отображаться максимально, если на самом деле она «восстановлена», но покрывает весь рабочий стол.

Есть ли способ сохранить размер формы, предшествующий событию максимизации, а затем сохранить тот факт, что форма максимизирована. При чтении из INI-файла создайте форму в максимизированном состоянии и установите размер ее «восстановления» до значения до события максимизации?

спасибо!

ответ

12

Используйте функцию API Windows, 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; 
+0

Спасибо. Как я могу назвать эту функцию? Что такое IPersistentSettingsWriter? – wonderer

+1

@wonderer - В этом примере показан пример использования функции API GetWindowPlacement. Вам нужно будет изменить этот пример для своего собственного проекта ... и изменить вызовы AUserSettings на что-то вроде INI-файла или параметров реестра пользователя. – skamradt

+0

@skamradt: Действительно, +1. Я просто скопировал его из моего текущего проекта. @wonderer: IPersistentSettingsWriter в своей простейшей форме является оболочкой для TIniFile, вы можете видеть, что методы WriteXXX() имеют одинаковые имена и параметры. Просто замените, как предлагал skamradt. – mghie

3

Попробуйте Form.WindowState недвижимость. Читая это, вы можете записать его в ini-файл, а затем прочитать обратно из ini, чтобы повторно установить состояние в методе form.show. Возможно, вы захотите перевести его в целое число, поскольку WindowState - это перечисляемый тип (TWindowState).

0

В DelphiDabbler есть несколько хороших window state components. Вы просто отбросьте его в своей форме и сохраните состояние в ini-файле или в реестре в форме уничтожить и загрузить его в форме create.

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)));