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 VCL Delphi Discussion :

[TStringGrid] PopupMenu différent à chaque colonne.


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut [TStringGrid] PopupMenu différent à chaque colonne.
    Bonjour,

    J'ai un petit souci, je souhaite personnaliser le popup menu de chaque colonnes d'un TStringGrid.

    Je me suis fait ce premier jet pour tester la faisabilité, il marche très bien:
    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
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      StringGrid1.Cols[0].Add('Premier');
      StringGrid1.Cols[1].Add('Deuxième');
      StringGrid1.Cols[2].Add('Troisième');
      StringGrid1.Cols[3].Add('Quatrième');
      StringGrid1.Cols[4].Add('Cinquième');
     
      //Construction des menus déroulant.
      StringGrid1.Objects[0,0] := newPopupMenu(Self,'First',paLeft,True,[NewItem('Premier',TextToShortCut(''),False,True,nil,0,'Item1')]);
      StringGrid1.Objects[1,0] := newPopupMenu(Self,'Two',paLeft,True,[NewItem('Deuxième',TextToShortCut(''),False,True,nil,0,'Item1')]);
      StringGrid1.Objects[3,0] := newPopupMenu(Self,'three',paLeft,True,[NewItem('Quatrième',TextToShortCut(''),False,True,nil,0,'Item1')]);
    end;
     
    procedure TForm1.StringGrid1ContextPopup(Sender: TObject; MousePos: TPoint;
      var Handled: Boolean);
    Var
       CurrCol,CurrRow: Integer;
    begin
    If Not (Sender is TStringGrid) Then
       Exit;
    With Sender as TStringGrid Do
         Begin
         MouseToCell(MousePos.X,MousePos.Y,CurrCol,CurrRow);
         Case CurrCol Of
         0:
           PopupMenu := (Objects[CurrCol,0] as TPopupMenu);
         1:
           PopupMenu := (Objects[CurrCol,0] as TPopupMenu);
         3:
           PopupMenu := (Objects[CurrCol,0] as TPopupMenu);
         Else
             PopupMenu := nil;
         End;    
         End;
    end;
    Le problème: Il faudrait que je créais tout les Popup à la main! Outre que c'est pénible, je voudrais pouvoir utiliser un Popup inséré sur la fiche lors du design de l'appli.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      StringGrid1.Objects[0,0] := PopupMenu1;
    Mais voilà, dans ce cas là, ça ne marche plus!

    Si vous avez déjà eu le cas, merci pour votre aide.

  2. #2
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut
    Bon, définitivement, je ne vois pas la cause.

    TPopupMenu étant un descendant de Tobject, il ne doit pas y avoir de problème à le stocker dans la partie Objects d'un TsringGrid !

  3. #3
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Ben si, chez moi, ça marche.

    Voici mon code (tu remarqueras que j'ai modifié la procedure TForm1.StringGrid1ContextPopup) :
    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
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      StringGrid1.Cols[0].Add('Premier');
      StringGrid1.Cols[1].Add('Deuxième');
      StringGrid1.Cols[2].Add('Troisième');
      StringGrid1.Cols[3].Add('Quatrième');
      StringGrid1.Cols[4].Add('Cinquième');
     
      //Construction des menus déroulant.
      StringGrid1.Objects[0,0] := newPopupMenu(Self,'First',paLeft,True,[NewItem('Premier',TextToShortCut(''),False,True,nil,0,'Item1')]);
      StringGrid1.Objects[1,0] := newPopupMenu(Self,'Two',paLeft,True,[NewItem('Deuxième',TextToShortCut(''),False,True,nil,0,'Item1')]);
      StringGrid1.Objects[3,0] := newPopupMenu(Self,'three',paLeft,True,[NewItem('Quatrième',TextToShortCut(''),False,True,nil,0,'Item1')]);
      StringGrid1.Objects[2,0] := PopupMenu 1; //celui là à été créé sur la fiche
    end;
     
    procedure TForm1.StringGrid1ContextPopup(Sender: TObject; MousePos: TPoint;
      var Handled: Boolean);
    Var CurrCol,CurrRow: Integer;
    begin
      If Not (Sender is TStringGrid) Then Exit;
      With Sender as TStringGrid Do
         Begin
           MouseToCell(MousePos.X,MousePos.Y,CurrCol,CurrRow);
          PopupMenu := (Objects[CurrCol,0] as TPopupMenu);
         End;
    end;

  4. #4
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut
    Merci beaucoup, ça marche!!

    Donc, ça vient surement du code de l'appli! Mais au moins ça confirme que c'est bien faisable

    Mais, une question me trotte dans l'esprit, lors de l'assignation à Objetcs, c'est une recopie de l'objet ? Ou une référence ?

    Ha voilà ce que c'est les développements le soir après le boulot sur un autre outil

  5. #5
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Citation Envoyé par Caine
    Mais, une question me trotte dans l'esprit, lors de l'assignation à Objetcs, c'est une recopie de l'objet ? Ou une référence ?
    non, il n'y a pas de recopie de l'objet, c'est la référence qui est recopiée.

    En gros La "variable" PopupMenu1 est un pointeur (une adresse mémoire donc) sur un objet TPopupMenu. Ca vaut pour toutes les classes d'objets.

    D'ailleurs, c'est pour ça que l'on peu écrire par exemple :
    ...nil étant réservé au pointeurs.

    les référence objects comme StringGrid1.Objects[2,0] sont aussi des pointeurs vers des objets TObjects.

    donc si tu as fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    StringGrid1.Objects[2,0] := PopupMenu1; 
    PopupMenu1:=nil;
    ...L'objet PopupMenu n'est pas détruit, il existe toujours en mémoire et sa référence reste accesible par StringGrid1.Objects[2,0]

    Par contre si tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    StringGrid1.Objects[2,0] := PopupMenu1; 
    PopupMenu1.free;
    ...L'objet PopupMenu est bel et bien détruit, et la référence stockée dans StringGrid1.Objects[2,0] pointe sur n'importe quoi !

    Si tu as besoin d'eclaircissements sur les pointeurs j'ai rédigé un pseudo tuto sur le forum, ici :
    http://www.developpez.net/forums/vie...ight=pointeurs

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

Discussions similaires

  1. [AC-2003] imputer des taux différents dans chaque colonne d'un même formulaire
    Par Ardiden31 dans le forum VBA Access
    Réponses: 16
    Dernier message: 16/04/2012, 14h28
  2. Réponses: 2
    Dernier message: 24/05/2011, 09h32
  3. Copie d'une colonne dans une feuille différente chaque mois
    Par nono256 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/11/2010, 09h47
  4. Réponses: 5
    Dernier message: 15/12/2009, 15h28
  5. Un select différent dans chaque colonne
    Par claire13 dans le forum SQL
    Réponses: 14
    Dernier message: 05/12/2008, 16h07

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