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 :

Utiliser le popupmenu d'un TGrid [Windows]


Sujet :

Composants FMX Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 659
    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 659
    Billets dans le blog
    65
    Par défaut Utiliser le popupmenu d'un TGrid
    Bonjour,

    TGrid a une propriété PopupMenu, mais chaque colonne a aussi sa propre propriété PopupMenu.
    Quelqu'un sait-il comment "overrider" le popupmenu de la Grid pour utiliser celui propre à la colonne ?

    Bien sûr, j'ai fait quelques essais avant de poser la question :
    Nom : Capture.PNG
Affichages : 459
Taille : 4,6 Ko
    en gras dans la colonne "attendu" le propos de ma question.
    A noter qu'un PopupMenu sans items ne s'affiche pas.

    Je pense que s'il y a possibilité d'indiquer un popupmenu par colonne c'est qu'il y a moyen de le faire donc la question est comment le faire simplement (sans trop de code). J'entrevois la possibilité d'utiliser l'évènement OnPopup du MenuPopup de la grille pour transformer ce menu en fonction de la colonne mais ce contournement me semble tiré par les cheveux (il m'en reste plus beaucoup donc ce serait dommage)

    Des idées ?

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 659
    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 659
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    après avoir beaucoup galéré sur ma piste du onpopup, ce matin je me suis réveillé avec une solution simple assez satisfaisante (peu de code) et qui semble efficace

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // popumenu catégorie
    procedure TForm1.CategMenuClick(Sender: TObject);
    begin
    Cds.Edit;
    Cds.FieldByName('Categorie').AsInteger:=TMenuItem(Sender).ImageIndex;
    end;
     
    procedure TForm1.GridCellClick(const Column: TColumn; const Row: Integer);
    begin
    Grid1.PopupMenu:=Column.PopupMenu; // à peaufiner
    inherited;
    end;
    cette solution est à peaufiner afin de faire en sorte que le popupmenu de la grille soit le popupmenu obtenu si aucun popupmenu n'est indiqué pour la colonne en cours (une variable privée, ou une constante ?) en tout cas cela me permet de me sortir de quelques cas de type de colonne que je ne pouvais gérer via Livebindings ( TGlyphColumn, TPopupColumn ...)

    en illustration, popumenu (categmenu) sur une TGlyphColumn
    Nom : PopupMenuGlyphe.PNG
Affichages : 444
Taille : 111,0 Ko

  3. #3
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 493
    Par défaut
    salut

    tu avais aussi ce genre de solution

    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
     
    procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;  var Handled: Boolean);
    var
      Pm: TPopupMenu;
      pt: TPoint;
    begin
      if (GetParent(Msg.hwnd) = DBGrid1.Handle) then
      begin
        case Msg.message of
          WM_RBUTTONUP:
            begin
              if DBGrid1.EditorMode then
              begin
                Pm := DBGrid1.PopupMenu;
                if (Pm <> nil) and Pm.AutoPopup then
                begin
                  pm.CloseMenu;
                  Pm.PopupComponent := DBGrid1;
                  pt := Mouse.CursorPos;
                  Pm.Popup(pt.X, pt.Y);
                  Handled := True;
                end;
              end;
            end;
        end;
      end;
    end;
    ou utiliser le inplaceeditor

  4. #4
    Membre chevronné
    Avatar de alheuredudejeuner
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2005
    Messages : 376
    Billets dans le blog
    4
    Par défaut heuu
    Bonjour,

    je ne vois pas le lien entre un dbgrid et un TGrid,

    le premier est purement vcl.

    Qu'est-ce qui m'échappe ?

    Cordialement

    André

  5. #5
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 493
    Par défaut
    salut

    ils sont tout les deux descendant de TcustomGrid

    Mais effectivement j'ai pas percuté sur le fait que c’était du FMX
    il n’empêche que la méthode utilisant les messages doit parfaitement être utilisable avec la class GRID

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 659
    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 659
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    je n'avais pas répondu @Anapurna, car pour moi cela correspondait à du VCL et non du FMX.

    D'une part la gestion des messages j'évite : serait-ce portable sur les autres OS ?
    D'autre part tu ne réponds pas vraiment à la problématique avec les messages car, comment tu retrouves le popup de la colonne ? (Oui, je sais cela n'existe pas en VCL ) il faudrait encore un max de code pour retrouver la colonne !

    mon code est nettement plus court je suis un partisan du moins de code possible
    peaufiné, pour utiliser le popupmenu par défaut si aucun popup n'est défini pour la colonne cela donne ceci :

    1- une variable globale privée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DefaultGridMenu : TPopupMenu;
    2-une instruction dans le OnCreate pour initialiser cette variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DefaultGridMenu :=Grid.PopupMenu;
    3-Le code du OnCellClick
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.GridCellClick(const Column: TColumn; const Row: Integer);
    begin
    if Column.PopupMenu=null
         then Grid1.PopupMenu:=DefaultGridMenu
         else Grid1.PopupMenu:=Column.PopupMenu;
    inherited;
    end;
    Le seul petit truc qui me gêne les points 1 et 2 mais je vois pas comment m'en sortir, sauf à indiquer pour chaque colonne la propriété PopupMenu bien sûr.
    l'idéal eut pu être (notez la conjugaison ) une constante où l'utilisation du TagString de la Grid mais il eut fallu retrouver l'objet par son nom,
    reste le TagObject auquel je n'avais pas encore pensé, dans le onCreate
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Grid.TagObject:=Grid.Popupmenu;
    qui me permet d'éviter la variable privée

    donc,
    1 on oublie

    en 2 , le onCreate pas moyen d'y échapper
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Grid.TagObject:=Grid.PopupMenu;
    et en 3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.GridCellClick(const Column: TColumn; const Row: Integer);
    begin
    if Column.PopupMenu=null
         then Grid.PopupMenu:=TPopupMenu(Grid.TagObject)
    else Grid.PopupMenu:=Column.PopupMenu;
    inherited;
    end;

  7. #7
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 493
    Par défaut
    salut

    a priori lors de la construction de colonne on peut definir la source et le type voir l'article ici

    et le source ici

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 659
    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 659
    Billets dans le blog
    65
    Par défaut
    Re,

    Rein à voir avec le PopupMenu mais c'est une petite part du tutoriel que je suis en train de rédiger.
    le seul truc est que ce document date un peu XE2 ou XE3 je crois, depuis les dernières versions propose des types de colonnes glyph, image, check, progress, float, currency,date,time ... en utilisant le menu contextuel ou en modifiant la propriété ColumnStyle de la liaison (LinkgridtodatasourceBindSource.columns[n])

    l'inconvénient d'un type de colonne "maison" :
    - n'est pas proposée dans le menu contextuel
    - n'est pas forcément "LiveBindable"
    donc tout doit se traiter par code, comme le source que tu indiques le montre (à ce propos merci du lien, je n'arrivai pas à y accéder)

    l'article proposé mélange tout dans une même colonne.
    Ce que je propose c'est d'utiliser les types de colonnes existantes, j'indiquerai également comment faire une colonne d'un autre type

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

Discussions similaires

  1. [Débutant] utiliser un popupmenu
    Par nirvo_ca dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 09/06/2009, 08h51
  2. BCB C++ / Utilisation du focus dans le TGrid
    Par a_lincoln54 dans le forum C++
    Réponses: 1
    Dernier message: 21/04/2008, 18h16
  3. Questions sur l'utilisation du PopupMenu
    Par scara dans le forum Composants VCL
    Réponses: 4
    Dernier message: 08/12/2007, 08h14
  4. Question sur l'utilisation du popupMenu
    Par Jayceblaster dans le forum Delphi
    Réponses: 2
    Dernier message: 25/07/2006, 10h59
  5. [VB6] Utiliser les PopUpMenu
    Par Lucas42 dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 29/06/2006, 08h09

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