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

  1. #1
    Membre actif
    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
    Points : 272
    Points
    272
    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 éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 718
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 718
    Points : 15 097
    Points
    15 097
    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 ?
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  3. #3
    Membre actif
    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
    Points : 272
    Points
    272
    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
    Responsable Lazarus & Pascal

    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
    Points : 20 855
    Points
    20 855
    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 éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 718
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 718
    Points : 15 097
    Points
    15 097
    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...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  6. #6
    Responsable Lazarus & Pascal

    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
    Points : 20 855
    Points
    20 855
    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 actif
    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
    Points : 272
    Points
    272
    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 éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 718
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 718
    Points : 15 097
    Points
    15 097
    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...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  9. #9
    Membre actif
    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
    Points : 272
    Points
    272
    Par défaut
    Bonjour JP,

    ...et la Mint est je crois basée sur Ubuntu ... Sauf que Mint la joue perso au niveau de l'affichage justement pour les réfractaires du "nouvel affichage" d'Ubuntu. J'ai gardé les bureaux d'origines.

    Ceci dit, ce n'est pas le problème. Lazarus ne fait pas au niveau de l'affichage ce que fait Qt sur les mêmes appareils. C'est un peu gênant mais hormis le caractère inesthétique et très ponctuel -on n'utilise par l'agrandissement à la souris tous les jours-, cela n'empêche pas d'utiliser le programme. Cependant j'appelle cela un bug mais pas les lazarusiens. Je verrai cela plus tard. Pour l'instant je me concentre sur l'affichage en pdf... et je vais essayer d'obtenir un peu de soutien de la "foundation" (en proposant finances) s'ils ont réussi à prendre les "bonnes" décisions... sinon on continuera avec Qt.

    Cordialement AD.

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