8
votes

Enregistrement de la taille maximale et formatée sur une tformelle Delphes

Cette question semble facile mais pour une raison quelconque, j'ai du mal à trouver la réponse.

J'ai une application qui enregistre la taille et la position du formulaire sur un fichier INI. C'est tout un puits, cependant, lorsque vous fermez l'application lorsque vous maximisez, il enregistrera la taille et la position du formulaire maximisé mais pas à son état.

Ce que je veux dire, c'est que sur la prochaine exécution, le formulaire semblerait maximisé lorsqu'il est "restauré" mais couvrant tout le bureau.

Y a-t-il un moyen d'enregistrer la taille du formulaire avant l'événement Maximize, puis enregistrez le fait que le formulaire est maximisé. La lecture du fichier INI crée le formulaire dans un état maximisé et définir sa taille "restaurer" sur celle avant l'événement maximisé?

Merci!


0 commentaires

4 Réponses :


12
votes

Utilisez la fonction Windows API GetWindowPlacement () em>, comme:

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;


5 commentaires

Merci. Comment appeler cette fonction? Qu'est-ce que iPersistStStStStStentsSetTriers?


@Wonderer - Cet exemple montre l'exemple d'utilisation de la fonction API GetWindowPlacement. Vous devriez modifier cet exemple pour votre propre projet ... et modifiez les appels AusserSettings vers quelque chose comme un fichier INI ou des paramètres de registre des utilisateurs.


@skamradt: En effet, +1. Je viens de la copier de mon projet actuel. @ Wonderer: iPersistStStStStentsSetTémariements est dans sa formulaire la plus simple, une enveloppe pour un tinifile, vous pouvez voir que les méthodes WRITXXXX () ont le même nom et les mêmes paramètres. Simplement remplacer comme Skamradt suggéré.


Edité, espérons que c'est plus clair maintenant. Dans ma défense, je envisage de programmer des interfaces au lieu de classes une très bonne chose. Mon interface de paramètres peut facilement être implémentée en termes de stockage de fichiers ini, de registre ou même de table de base de données, et le code à l'aide de celui-ci ne doit pas être changé un bit. En outre, j'ai des interfaces distincts iPersistStStTollonsReader et iPersistSistStTollons , il est donc impossible d'écrire accidentellement dans un fichier INI dans un répertoire en lecture seule si le code n'est donné qu'un lecteur interface.


Je comprends, merci. Je reçois l'erreur suivante: [Erreur] Main.Pas (1150): Types incompatibles: "TagwindowPlacement" et "PwindowPlacement" sur GetWindowPlacement (Poignée, WP);



3
votes

Essayez la propriété Form.Windowstate. En lisant cela, vous pouvez l'écrire au fichier INI, puis lisez à partir de l'INI pour ré-régler l'état dans la méthode Form.Show. Vous voudrez peut-être repousser sur un entier car le Windowstate est un type énuméré (Twindowstate).


0 commentaires

0
votes

Delphidabbler a une belle Composants de l'état de la fenêtre . Vous venez de laisser tomber un sur votre formulaire et il sauvera l'état à un fichier INI ou au registre sur la forme de la destruction et chargez-le sur le formulaire Créer.


0 commentaires

3
votes

La réponse de Tom devrait fonctionner bien. Voici un pseudo-code pour clarifier un peu:

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


0 commentaires