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

Composants FMX Delphi Discussion :

TFlowLayout qui ne "flow" pas [Windows]


Sujet :

Composants FMX Delphi

  1. #1
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut TFlowLayout qui ne "flow" pas
    Bonjour

    Soit une application FMX "Berlin" sur Windows !
    J'ai un TFlowLayout qui contient 2 TLayout A et B.
    En design, si je mets "A.Visible := False" , B se repositionne à gauche : normal !
    Au runtime, ça ne fonctionne plus . Je fais A.Visible := False dans le FormShow, le FormCreate, le FormActivate, j'ai beau ajouter du repaint ou du recalcsize à gogo, rien n'y fait !

    Question: avez-vous le même souci ou est-ce que ça vient de moi ?

  2. #2
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    Bonjour,

    je constate le même comportement avec Berlin & Tokyo
    en design tout fonctionne
    et en Runtime rien ne bouge
    et rien n'y fait !

    Cordialement,
    @+

  3. #3
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    seule solution pour le moment est de modifier la taille de la fenêtre qui contient le TFlowLayout.
    au FormShow Width := Width + 1 par exemple.

    solution valable si le flowlayout est en align = client
    sinon, j'ai augmenté la taille du flowlayout de 1 et réduit de 1. Et ça fonctionne.
    J'aurais perdu moins de temps à gérer ça à la mimine dès le début

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    essaye le BeginUpdate / EndUpdate du FlowLayout. C'est souvent le piège des contrôles FMX, le besoin de notifier la modification

    Par exemple
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    unit UnitFlowLayout;
     
    interface
     
    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
      FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
      FMX.Objects, FMX.Layouts, FMX.Controls.Presentation;
     
    type
      TForm8 = class(TForm)
        FlowLayout1: TFlowLayout;
        BtnLayout1: TButton;
        BtnLayout2: TButton;
        BtnLayout3: TButton;
        Layout4: TLayout;
        Rectangle1: TRectangle;
        Label1: TLabel;
        Layout5: TLayout;
        Rectangle2: TRectangle;
        Label2: TLabel;
        Layout6: TLayout;
        Rectangle3: TRectangle;
        Label3: TLabel;
        procedure BtnLayout1Click(Sender: TObject);
        procedure BtnLayout2Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form8: TForm8;
     
    implementation
     
    {$R *.fmx}
     
    procedure TForm8.BtnLayout1Click(Sender: TObject);
    begin
    Flowlayout1.BeginUpdate;
    Layout4.Visible:=not Layout4.Visible;
    Flowlayout1.EndUpdate;
    end;
     
     
    procedure TForm8.BtnLayout2Click(Sender: TObject);
    begin
    Flowlayout1.BeginUpdate;
    Layout5.Visible:=not Layout5.Visible;
    Flowlayout1.EndUpdate;
    end;
     
    end.
    fonctionne correctement
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Bonjour,

    essaye le BeginUpdate / EndUpdate du FlowLayout. C'est souvent le piège des contrôles FMX, le besoin de notifier la modification

    Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      Flowlayout1.BeginUpdate;
      Layout4.Visible:=not Layout4.Visible;
      Flowlayout1.EndUpdate;
    fonctionne correctement
    Effectivement ça fonctionne très bien
    Bravo, j'aurai jamais pensé à un Begin/EndUpdate je pensais que c'était réservé aux TStrings

    Merci pour le tuyau
    Cordialement,
    @+

  6. #6
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    essaye le BeginUpdate / EndUpdate du FlowLayout. C'est souvent le piège des contrôles FMX, le besoin de notifier la modification
    J'avais oublié ce détail. Merci du rappel !

    C'est résolu

  7. #7
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    C'est souvent le piège des contrôles FMX, le besoin de notifier la modification

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm8.BtnLayout1Click(Sender: TObject);
    begin
    Flowlayout1.BeginUpdate;
    Layout4.Visible:=not Layout4.Visible;
    Flowlayout1.EndUpdate;
    end;
    Un piège ? Je suis toujours surpris du nombre de bidouilles qu'il faut faire en FMX. J'en ai fait très peu, mais j'ai chaque fois rencontré des galères dans lesquelles la solution était une astuce. Perso ca me dérange un peu qu'il faille mettre un BeginUpdate sur le parent de mon controle, juste pour qu'il réagisse correctement. Dans ce cas la, pourquoi ne faudrait-il pas en mettre aussi sur le Panel parent du FlowControl ? Et la Form parent du Panel ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm8.BtnLayout1Click(Sender: TObject);
    begin
    Self.BeginUpdate;
    Panel1.BeginUpdate;
    Flowlayout1.BeginUpdate;
    Layout4.Visible:=not Layout4.Visible;
    Flowlayout1.EndUpdate;
    Panel1.EndUpdate;
    Self.EndUpdate;
    end;
    Je sais, je suis hors-sujet, mais je suis souvent halluciné de voir la solution de ces problèmes de base

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Bonjour
    Citation Envoyé par guillemouze Voir le message
    Un piège ? Je suis toujours surpris du nombre de bidouilles qu'il faut faire en FMX.
    je suis d'accord, c'est pas toujours évident et du coup cela fait penser à de la "bidouille"
    mais de là à tout mettre en BeginUpdate/EndUpdate
    d'un autre côté, si on ne veut justement pas qu'il y ait ré-arrangement de ce FlowLayout, le choix est possible.

    Je pense qu'avec un peu de temps il serait possible de dériver le TFlowLayout pour en faire un plus "réactif" ou plus exactement toujours "réactif"
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  9. #9
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Désolé, je pollue un peu le sujet, mais
    Citation Envoyé par SergioMaster Voir le message
    mais de là à tout mettre en BeginUpdate/EndUpdate
    j'ai volontairement exagéré, mais dans l'absolu ce n'est pas absurde, si le masquage d'un composant implique des modifications en cascade dans sa hiérarchie, c'est limite ce qu'il faudrait faire.

    Citation Envoyé par SergioMaster Voir le message
    d'un autre côté, si on ne veut justement pas qu'il y ait ré-arrangement de ce FlowLayout, le choix est possible.
    c'est la qu'intervient la puissance du begin/end update : on fait le BeginUpdate, puis les multiples modifications (qui ne provoquent donc pas de MàJ), puis le endUpdate (c'est là que les mises à jour sont faites).
    En plus, comme le dit Papy,
    Citation Envoyé par Papy214 Voir le message
    j'ai beau ajouter du repaint ou du recalcsize à gogo, rien n'y fait !

+ Répondre à la discussion
Cette discussion est résolue.

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