IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Gérer le redimensionnement des fenêtres


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 252
    Par défaut Gérer le redimensionnement des fenêtres
    Bonjour,

    je voudrais contrôler la gestion des tailles de mes Forms de manière simple.

    Sous Windows, pas de problème : un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Constraints.MaxWidth := Width;
    ... dans TForm.FormCreate suffit. La fenêtre reste à sa position et wsMaximized élargit la fenêtre en hauteur avec une largeur de MaxWidth [en replaçant le Top à (0,0) ce qui nécessite une petite modif. pour obtenir le résultat que j'attends].

    Mais sous Linux cela fonctionne très mal. La fenêtre se déplace et s'élargit autant qu'on veut même si les ancrages respectent le MaxWidth : Par exemple une StatusBar s'allonge jusqu'à maxWidth alors que la fenêtre continue à s'élargir lors d'un redimensionnement à la souris. Au OnMouseUp, la fenêtre reprend des dimensions qui respectent le MaxWidth. Un wsMaximized ne tient aucun compte de MaxWidth. Bref au mieux c'est inélégant, au pire c'est faux ! J'avais déjà rencontré ce problème il y a longtemps et avait dû overrider des méthodes de la Form pour intercepter au bon moment les événements. Je n'ai pas trop envie de procéder à nouveau ainsi. Il y a peut être une autre solution sans surcharge.

    Si quelqu'un a une solution...
    Code suffisant sous Windows :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    unit Unit1;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs;
     
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        { private declarations }
      public
        { public declarations }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.lfm}
     
    { TForm1 }
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Constraints.MaxWidth := Width;    //<< Ici !
    end;
     
    end.
    Merci. Cordialement. AD.

  2. #2
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Salut,

    pas sûr d'avoir tout compris, mais je réponds quand même parce que je suis sous Linux est que ma contrainte à moi était sur le MinWidth et pas le MaxWidth comme toi :
    Citation Envoyé par ApproxDev Voir le message
    Mais sous Linux cela fonctionne très mal. La fenêtre se déplace et s'élargit autant qu'on veut même si les ancrages respectent le MaxWidth : Par exemple une StatusBar s'allonge jusqu'à maxWidth alors que la fenêtre continue à s'élargir lors d'un redimensionnement à la souris. Au OnMouseUp, la fenêtre reprend des dimensions qui respectent le MaxWidth. [...]
    Je n'ai mis qu'une chose à ce propos dans mon FormCreate, et, ma foi, lors d'un resize je te garantis que je ne peux pas réduire plus que la valeur imposée (les machins en MAJUSCULES sont des constantes) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TMainForm.FormCreate(Sender: TObject);
    begin
      ConstraintsMinWidth := ((PNLLARGEUR+1)*3)+SCROLLBAR+ADJUST;
      Constraints.MinWidth:= ConstraintsMinWidth;
    end;
    (je ne me souviens plus pourquoi j'ai utilisé cette variable ConstraintsMinWidth, dans l'absolu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Constraints.MinWidth:= ((PNLLARGEUR+1)*3)+SCROLLBAR+ADJUST;
    devrait suffire.)

    La fenêtre se déplace : je n'ai jamais rien noté de tel . T'es sûr qu'il n'y aurait pas un bout de code ailleurs qui met sa pagaille ?

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 252
    Par défaut
    Bonjour,

    Non, il n'y a rien d'autre. J'ai lu que dans certaines versions De Lazarus, l'approche était mal finalisée et plus exactement qu'il a fallu plusieurs fois régressé pour avoir un comportement "correct". Dans le bugtracker, il est précisé que ce n'est pas un bug.

    J'ai oublié de préciser que je suis sous Mint 17.3 [32] avec une version de Lazarus 1.6/FPC 3.0.0.

    C'est très curieux :
    1. Le code sous Linux ne fonctionne pas comme sous Windows donc je suppose comme sous Delphi 7. Donc normalement cela ne devrait pas satisfaire l'équipe de programmation de Lazarus.
    2. C'est totalement inesthétique, à croire encore une fois, que cet aspect des choses est réservé à Linux ou à Mac. Autant que je me souvienne, il a fallu que j'aille dans la méthode ConstrainedResize (protected) pour adapter l'event OnConstrainedResize et obtenir un comportement similaire à Windows. Mais j'ai zippé (rar-é) mes développements Lazarus, il y a de nombreux mois maintenant car je ne comptais pas trop les réutiliser compte tenu du retard accumulé par cet IDE.

    Va falloir que j'aille à la pêche.

    Sinon, j'ai trouvé ceci
    If you want to set a minimum and / or a maximum size for the form, then bsSizeable is the correct border style, and you can use the Constraints of the form to specify the limits. There is however the problem that the Constraints property doesn't prevent the resizing of the form, it only causes the sizes to be adjusted after the fact so that the limits are not violated. This will have the negative side effect that sizing the form with the left or upper border will move it. To prevent this from happening you need to prevent the resizing in the first place. Windows sends the WM_GETMINMAXINFO message to retrieve the minimum and maximum tracking sizes for a top level window. Handling this and returning the correct constraints fixes the moving form issue:
    C'est pour Delphi... et sous Lazarus Windows, je ne rencontre pas ce problème : cela fonctionne normalement (i.e. la fenêtre se déforme jusqu'à son max et en aunce circonstance ne ba plus loin)... que je rencontre sous Linux. Je vais voir si la solution proposée est portable et dans ce cas fonctionnelle.

    Cordialement. AD.

  4. #4
    Rédacteur

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Billets dans le blog
    84
    Par défaut
    Citation Envoyé par ApproxDev Voir le message
    Un wsMaximized ne tient aucun compte de MaxWidth.
    Le problème est récurrent sous plusieurs formes : les valeurs d'état de fenêtre ont essentiellement un sens avec Windows. Sous Android, par exemple, les fenêtres sont toujours à la valeur wsMaximized : que faire alors de wsMinimized ? Avec Linux, il faut se référer à la doc qui accompagne le code source de l'unité Forms :

    The actual meaning of each value depends on the platform:

    Windows and Mac OS X - These operating systems support all values.
    X11 - The window state is a hint sent to the Window Manager, so more primitive Window Managers might ignore this hints.
    En fait, il y a les comportements graphiques totalement indépendants des plateformes (c'est l'objectif de fpgui) qui sont encore en cours de développement (c'est un travail colossal) et les comportements standards qui font appel en dernier ressort au gestionnaire propre à chaque système. On imagine facilement qu'il y a des différences, car les différents systèmes ne fonctionnent pas exactement selon les mêmes normes . Il est même des cas (pas si rares) où le système sous-jacent n'a pas prévu la fonctionnalité : je me souviens d'un problème de bouton radio choisi par défaut que ne connaît pas Linux et qui a dû être résolu grâce à la ruse d'un bouton radio caché...
    La portabilité du code est par conséquent souvent limitée par les performances/possibilités du système sous-jacent et ça, aucun environnement de programmation ne peut totalement l'exclure. D'aucuns font même remarquer que ce n'est pas souhaitable : les utilisateurs d'Android, de Windows, de Mac OS ou de Linux ont leurs habitudes et ne souhaitent en général pas les abandonner.

    Conclusion provisoire : si je n'ai pas la solution à ton problème, j'en pressens l'origine probable .

    Cordialement,

    Gilles
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

  5. #5
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Citation Envoyé par gvasseur58 Voir le message
    [...] je me souviens d'un problème de bouton radio choisi par défaut que ne connaît pas Linux et qui a dû être résolu grâce à la ruse d'un bouton radio caché...[...]
    Ah, c'est moi qui l'ai remonté, ce problème...

  6. #6
    Rédacteur

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Billets dans le blog
    84
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Ah, c'est moi qui l'ai remonté, ce problème...
    Je savais que ça te rappellerait de bon souvenirs .
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 252
    Par défaut
    Bonjour Gilles et JP,

    avec un peu de retard : ce n'est pas lié à Linux.
    Ce code C++/Qt fonctionne parfaitement sur la même plateforme
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
     
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        setMaximumWidth(500);
    }
     
    MainWindow::~MainWindow()
    {
        delete ui;
    }

    Avec Lazarus, j'ai essayé sur ma Mint 17.3 [32] et je confirme le déplacement de la fenêtre ! Sur mon Ubuntu 16.04 [64], la fenêtre ne change pas de position, continue à s'allonger jusqu'au relâchement du bouton de la souris où elle revient à la bonne taille. Avec Qt 5.7, elle s'arrête à la taille désirée sur les 2 OS de test.

    Cordialement. AD.

  8. #8
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Salut AD,

    Citation Envoyé par ApproxDev Voir le message
    Avec Lazarus, j'ai essayé sur ma Mint 17.3 [32] et je confirme le déplacement de la fenêtre ! Sur mon Ubuntu 16.04 [64], la fenêtre ne change pas de position, continue à s'allonger jusqu'au relâchement du bouton de la souris où elle revient à la bonne taille. Avec Qt 5.7, elle s'arrête à la taille désirée sur les 2 OS de test.
    Ça doit dépendre de ton environnement de bureau, car j'ai fait un test rapide avec juste ce que tu donnais dans le post d'origine :
    Citation Envoyé par ApproxDev Voir le message
    Code suffisant sous Windows :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Constraints.MaxWidth := Width;    //<< Ici !
    end;
    et ça fonctionne très bien dans ma Debian 32 bits / Lxde / Gtk.

    Tu noteras qu'Ubuntu est construit sur une base Debian...

Discussions similaires

  1. comment ajouter des forms et gérer l'interface
    Par siham-gh dans le forum Visual C++
    Réponses: 1
    Dernier message: 21/12/2009, 08h25
  2. Réponses: 11
    Dernier message: 28/02/2007, 12h18
  3. Réponses: 2
    Dernier message: 13/10/2004, 15h32
  4. [NetBeans] redimensioner auto des form
    Par Damien69 dans le forum NetBeans
    Réponses: 5
    Dernier message: 27/05/2004, 13h50
  5. [VB.NET]La bonne gestion des forms
    Par Wintermute dans le forum Windows Forms
    Réponses: 11
    Dernier message: 13/01/2004, 16h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo