2009-07-28 8 views
7

To pytanie wydaje się proste, ale z jakiegoś powodu nie mogę znaleźć odpowiedzi.Zapisywanie zmaksymalizowanego i rozmiaru formularza na TFph Delphi

Mam aplikację, która zapisuje rozmiar i pozycję formularza w pliku INI. To wszystko dobrze, jednak gdy zamkniesz aplikację po zmaksymalizowaniu, to zaoszczędzisz rozmiar i położenie zmaksymalizowanej formy, ale nie jej stan.

Mam na myśli to, że przy kolejnym uruchomieniu formularz wydaje się być zmaksymalizowany, gdy w rzeczywistości jest "przywracany", ale obejmuje cały pulpit.

Czy istnieje sposób na zapisanie rozmiaru formularza poprzedzającego zdarzenie maksymalizacji, a następnie zapisanie faktu, że formularz jest zmaksymalizowany. Czy odczyt z pliku INI tworzy formularz w stanie zmaksymalizowanym i ustawia jego rozmiar "przywracania" na rozmiar sprzed zdarzenia maksymalizacji?

dziękuję!

Odpowiedz

12

Użyj funkcji Windows API GetWindowPlacement(), tak:

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

Dzięki. Jak mogę wywołać tę funkcję? Czym jest IPersistentSettingsWriter? – wonderer

+1

@waderer - W tym przykładzie przedstawiono przykład użycia funkcji API GetWindowPlacement. Trzeba będzie zmodyfikować ten przykład dla własnego projektu ... i zmienić wywołania AUserSettings na coś takiego jak plik INI lub ustawienia rejestru użytkowników. – skamradt

+0

@skamradt: Rzeczywiście, +1. Właśnie skopiowałem go z mojego obecnego projektu. @wonderer: IPersistentSettingsWriter jest w najprostszej formie wrapper dla TIniFile, widać, że metody WriteXXX() mają taką samą nazwę i parametry. Po prostu zastąp jako sugerowany skamradt. – mghie

3

Spróbuj właściwość Form.WindowState. Czytając to, możesz zapisać go do pliku ini, a następnie odczytać go z ini, aby ponownie ustawić stan w metodzie form.show. Możesz ponownie rzucić go do liczby całkowitej, ponieważ WindowState jest typem wyliczeniowym (TWindowState).

0

DelphiDabbler ma fajne window state components. Po prostu upuść jeden na swoim formularzu i zapisze on stan do pliku ini lub rejestru na formularzu destroy i załaduje go na tworzenie formularza.

2

Odpowiedź Toma powinna działać ładnie. Oto kilka pseudokodowań, aby trochę wyjaśnić:

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; 

podczas czytania ustawień ustaw Rozmiar i położenie jako pierwsze. Następnie należy przeczytać WindowState i przypisać go z typografią:

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