2009-07-28 3 views
7

Cette question semble facile, mais pour une raison quelconque, j'ai du mal à trouver la réponse.enregistrer la taille maximale et la forme sur un TForm Delphi

J'ai une application qui enregistre la taille et la position du formulaire sur un fichier INI. C'est tout un bon, mais lorsque vous fermez l'application lorsqu'il est agrandi, il va enregistrer la taille et la position de la forme maximisée mais pas son état. Ce que je veux dire, c'est que lors de la prochaine exécution, le formulaire apparaîtrait maximisé alors qu'en fait il est "restauré" mais couvre tout le bureau.

Existe-t-il un moyen d'enregistrer la taille de formulaire précédente à l'événement de maximiser, puis enregistrer le fait que le formulaire est agrandi. Le sur la lecture du fichier INI créer le formulaire dans un état maximisé et définir sa taille de «restauration» à celle avant l'événement de maximiser?

merci!

Répondre

12

Utilisez la fonction API Windows GetWindowPlacement(), comme ceci:

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

Merci. Comment appeler cette fonction? Qu'est-ce que IPersistentSettingsWriter? – wonderer

+1

@wonderer - Cet exemple montre un exemple d'utilisation de la fonction de l'API GetWindowPlacement. Vous devrez modifier cet exemple pour votre propre projet ... et modifier les appels AUserSettings à quelque chose comme un fichier INI, ou les paramètres du registre de l'utilisateur. – skamradt

+0

@skamradt: En effet, +1. Je viens de le copier de mon projet actuel. @wonderer: IPersistentSettingsWriter est dans sa forme la plus simple un wrapper pour TIniFile, vous pouvez voir que les méthodes WriteXXX() ont le même nom et les mêmes paramètres. Simplement remplacer comme skamradt suggéré. – mghie

3

Essayez la propriété Form.WindowState. En lisant ceci, vous pouvez l'écrire dans le fichier ini, puis relire l'ini pour redéfinir l'état dans la méthode form.show. Vous souhaiterez peut-être le redéfinir en entier puisque WindowState est un type énuméré (TWindowState).

0

DelphiDabbler a quelques bons window state components. Vous venez de déposer un sur votre formulaire et il va enregistrer l'état dans un fichier ini ou le registre sur le formulaire détruire et le charger sur le formulaire créer.

2

La réponse de Tom devrait fonctionner correctement. Voici quelques Pseudo-Code pour clarifier un peu:

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; 

lors de la lecture des paramètres définir Taille et Position en premier. Puis lisez le WindowState et affectez-le avec un classeur:

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