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 :

TGrid détection redimensionnement d'une colonne


Sujet :

Composants FMX Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut TGrid détection redimensionnement d'une colonne
    Bonjour,

    en FMX, comment peut-on détecter le "column resizing" d'un TGrid ? C'est vrai que ce ne doit pas être trop courant sur un mobile... mais sur Mac OS ou Linux cela présente un intérêt. Quand je vois le nombre d’événements dans l'inspecteur d'objet je suis attéré et je ne parle pas du TGrid Helper associé !

    Merci. Cordialement. Gilles

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 593
    Billets dans le blog
    65
    Par défaut
    Bonjour Gilles,

    En fait, en utilisant les Livebindings, c'est assez simple à partir du moment où l'on connait l'astuce, a priori non documenté.
    Dans ce chapitre des ScopeMappings j'explique comment ajouter des "scopes"
    et dans le chapitre qui suit de très près, l'utilisation de FormatControl pour calculer la taille de la colonne "élastique".

    Bien sûr, comme je l'indique, il est tout à fait possible de ne pas passer par les Livebindings et d'accéder directement aux tailles de colonnes Grid1.Columns[n].Width
    Enfin toujours dans ce même chapitre j'explique comment l'on peut avoir non pas une colonne élastique mais des colonnes taillées "au plus juste" en fonction des données, en quelque sorte un équivalent de onDrawCell.

    Avec ces utilisations, pas besoin de détecter le Resizing.

    J'avoue que je n'ai pas testé un retaillage de grille seul sans passer par un retaillage de la forme ou du conteneur (layout) de la grille ... Hum, à voir, je vais me laisser tenté

    Cela dit, cela ne répond pas vraiment à ta question : détecter si la colonne est retaillée ? Je réponds plus à une détection de taille de grille. AMHA cela doit pouvoir se pister dans les sources (idem, c'est tentateur )

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour Serge,

    j'ai besoin du resizing :
    Nom : resizing.PNG
Affichages : 292
Taille : 6,6 Ko

    En réalité mon approche était basée sur ce que j'ai fait avec Lazarus.
    Lorsque l'on modifie la taille de la colonne 0, il faut que les objets ajoutés suivent.

    Je pourrais procéder de 2 manières.
    • Soit utiliser un layout dans les entêtes
    • Soit dériver la TGrid. mais tu sais que je ne sais pas créer de composants sur FMX. Y a-t-il un moyen de créer une classe dans le code de la TForm TmyGrid avec les événements dont j'ai besoin (en réalité les méthodes public ou protected existent) -cette partie est OK pour moi- et de les affecter directement -j'ai cru voir une fois ue approche de ce type en Lazarus- à la TGrid placée sur la Form ?


    Quand je fais cela en Lazarus, je crée directement mon composant TlzGrid que je place dans la palette. Il n'y a pas un bouquin, un article qui explique comment faire un composant proprement (avec les particularités FMX) ?
    Tu vas dire que je suis un véritable emm... mais je me demande quel est le motif de la suppression des événements Mouse sur les TGrids alors qu'il me semble qu'ils existaient dans les premières versions de FMX ? J'ai une réponse "orientée" : parce que FMX est orienté Mobile et pas du tout Linux ou Mac OS alors qu'en VCL, uniquement orienté Desktop, la TStringGrid et la dbGrid possèdent ces événements !

    Ceci dit, hormis ce problème, j'ai réussi à amener mes TGrids au niveau de mes Grids Lazarus, même mieux... en y passant pas mal de temps quand même. Il faut que j'améliore ma maîtrise de LiveBinding [je vais me pencher sur tes tutos] mais pour le reste, je suis satisfait... même si le charabia imposé par les Styles et le LiveBinding me déconcertent encore.

    Cordialement. Gilles
    Dernière modification par Invité ; 22/04/2020 à 09h53.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    j'ai essayé avec un TGridPanelLayout dans le Theader.Item... Ce n'est pas mal.... mais pas parfait car je n'arrive pas à implanter une MinWidth.

    J'ai repris le problème à zéro : on modifie la taille des colonnes "en" MouseDown, MouseMove et MouseUp dans le THeader... et cette classe à les
    événements requis. Je ne suis pas très fier de moi !

    Par hasard, je suis tombé sur un tuto composant FMX.

    Cordialement. Gilles

  5. #5
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 593
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    Bon, décidément, je ne dois pas saisir exactement l'objectif.
    Toutefois cette histoire de retaille de colonne me laissait un petit arrière-goût de bizarrerie et je voulais en voir le cœur net car je trouvais étrange qu'il n'y ait rien

    en FMX, comment peut-on détecter le "column resizing" d'un TGrid ?
    En fait, en utilisant les évènements de la colonne
    Nom : Capture.PNG
Affichages : 281
Taille : 11,2 Ko

    Par hasard, je suis tombé sur un tuto composant FMX.
    En fait créer un composant FMX (hors composant dual c.a.d. à la fois VCL et FMX et hors prise en charge du Livebinding) est aussi simple que créer un composant VCL.
    Ce sont les points entre parenthèses qui en font la difficulté.

    J'ai essayé avec un TGridPanelLayout dans le THeader.Item.
    Ce n'est pas une mauvaise idée. J'avoue avoir quelques difficultés, en design, avec ce composant.

    Perso, je me serais plutôt penché sur un style (oui, je sais tu n'es pas fan du tout), le hic est que je n'ai pas encore pris le temps de trouver comment intégrer un style dans un composant (après tout, un style ce n'est "que" une partie de dfm) je subodore la possibilité c'est tout.
    Ou, encore une autre piste, la création d'un nouveau type de colonne (oui, cela aussi doit être possible)

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour Serge,

    j'ai pas mal avancé. J'ai abandonné le TPanelGridLayout pour de simples TLayouts.

    Pour le composant, j'ai réussi à en faire un tout simple sous FMX évidemment

    Sinon pour l'autre approche :

    J'ai vu que le FMX.Header.THeaderItem avait les événements dont j'avais besoin. Ma technique est d'être au plus proche du composant utilisé. J'ai pensé un temps dériver le THeader, qui possède également ces mêmes événements. Donc il possède :
    • OnMouseEnter published Occurs when the mouse cursor enters the area of the control.
    • OnMouseLeave published Occurs when the mouse cursor leaves the control area.
    • OnMouseMove published Occurs when the mouse cursor moves while over the control area.
    • OnMouseUp published Occurs when the mouse button that was pressed over the control is released.
    • OnMouseWheel published Occurs when the mouse wheel moves while the control has focus.

    En published en plus !
    En surclassant les Header.Items[x], cela semble fonctionner mais comme la méthode layout est beaucoup plus simple, je ne suis pas allé plus loin. J'ai notamment un doute sur la "réalité" de la déclaration des HeaderItems... même si les Layouts sont bien ajoutés dedans.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for i := 0 to Header.Count-2 do
    begin
       HeaderItem := TmyHeaderItem(Header.Items[0]);
       SetLength(GPLs, i+1);  { GPLs : TArrayOfGridPanelLayouts;}
       GPLs[i] := TGridPanelLayout.Create(self);
       Header.Items[i].AddObject(GPLs[i]);
       [...]
    end;
    Il me reste à gérer les flèches à gauche de la TGrid. J'ai vu que tu avais une solution... qui m'intéresse beaucoup...

    A bientôt. Cordialement. Gilles

Discussions similaires

  1. Empêcher le redimensionnement d'une colonne par l'utilisateur.
    Par Pwouaro dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/09/2008, 15h02
  2. Réponses: 1
    Dernier message: 08/07/2008, 12h58
  3. redimensionner une colonne d'un StringGrid
    Par winow dans le forum C++Builder
    Réponses: 2
    Dernier message: 29/01/2008, 23h01
  4. [JTable] Redimensionner une colonne
    Par molusk dans le forum Composants
    Réponses: 4
    Dernier message: 21/07/2005, 16h25
  5. [JTable] redimensionner une colonne
    Par TheSeb dans le forum Composants
    Réponses: 2
    Dernier message: 21/12/2004, 19h30

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