2009-07-28 5 views
7

Questa domanda sembra facile ma per qualche motivo non riesco a trovare la risposta.salvando le dimensioni Massima e modulo su un Delphi TForm

Ho un'applicazione che salva la dimensione e la posizione del modulo su un file INI. Questo è tutto un bene, tuttavia quando si chiude l'applicazione quando ingrandita si salverà la dimensione e la posizione della forma ingrandita ma non il suo stato.

Quello che voglio dire è che alla prossima esecuzione il modulo sembrerebbe ingrandito quando in realtà è "ripristinato" ma copre l'intero desktop.

C'è un modo per salvare la dimensione del modulo precedente all'evento di ingrandimento, quindi salvare il fatto che il modulo è ingrandito. La lettura del file INI crea il modulo in uno stato ingrandito e imposta la sua dimensione di "ripristino" a quella prima dell'evento di ingrandimento?

grazie!

risposta

12

utilizzare la funzione API di Windows GetWindowPlacement(), in questo modo:

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

Grazie. Come posso chiamare questa funzione? Cos'è IPersistentSettingsWriter? – wonderer

+1

@wonderer: questo esempio mostra un esempio di utilizzo della funzione API GetWindowPlacement. Dovresti modificare questo esempio per il tuo progetto ... e cambiare le chiamate AUserSettings in qualcosa come un file INI, o le impostazioni del registro utente. – skamradt

+0

@skamradt: Infatti, +1. L'ho appena copiato dal mio attuale progetto. @wonderer: IPersistentSettingsWriter è nella sua forma più semplice un wrapper per TIniFile, puoi vedere che i metodi WriteXXX() hanno lo stesso nome e parametri. Basta sostituire come suggerito da skamradt. – mghie

3

Prova la proprietà Form.WindowState. Leggendolo, puoi scriverlo nel file ini, quindi rileggere dallo ini per reimpostare lo stato nel metodo form.show. Potresti voler ri-cast in un numero intero in quanto WindowState è un tipo enumerato (TWindowState).

0

DelphiDabbler ha qualche bello window state components. Ne lasci solo uno sul modulo e salverà lo stato in un file ini o il registro sul modulo distruggerà e lo caricherà sul modulo di creazione.

2

La risposta di Tom dovrebbe funzionare bene. Ecco qualche pseudo-codice per chiarire un po ':

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; 

durante la lettura delle impostazioni impostate per Dimensione e Posizione. Quindi leggere il WindowState e assegnarlo con un typecast:

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