Dbgrid et sélection des colonnes à afficher à l'exécution

Soyez le premier à donner votre avis sur cette source.

Vue 13 865 fois - Téléchargée 2 908 fois

Description

Comment permettre, très simplement, à un utilisateur de chosisir les colonnes qu'il veut voir s'afficher dans un contrôle DbGrid ?

Ce code est une extension d'un précédent code source que j'ai publié sur ce site (création d'indexes à la volée, ou comment modifier l'ordre d'affichage des données en fonction de la colonne sur laquelle on clique).

Aussi, je ne publie ci-dessous que les parties qui ont trait au titre de ce code source.

Le code complet de l'application est contenu dans l'archive zip.
      • IMPORTANT *** : ne peut être compilé avec Delphi édition personnelle (utilisation de la base de données DbDemos).

Source / Exemple :


procedure TForm1.PopupMenu1Popup(Sender: TObject);
var
  i : integer;
  MenuItem : TMenuItem;
begin
  { Effacer tous les éléments de menu }
  PopupMenu1.Items.Clear;
  { Créer les éléments de menu }
  for i:=0 to DbGrid1.Columns.Count - 1 do
  begin
    MenuItem := TMenuItem.Create(PopupMenu1);
    { Ajouter au PopupMenu }
    PopupMenu1.Items.Add(MenuItem);
    With MenuItem do
    begin
      { Affecter à Caption le titre affiché dans les titres
       des colonnes du DbGrid }
      Caption := DbGrid1.Columns[i].Title.Caption;

      {Cocher les éléments de menu qui sont déjà visibles avant l'appel}
      Checked := DbGrid1.Columns[i].Visible;
      {Utilisation de la propriété Tag pour retrouver l'indice de l'élément
      coché/non coché dans la méthode PopItemClick implémentée ci-dessous}
      Tag := i;
      {Affectation d'une méthode Click à l'élément de menu}
      OnClick := PopItemClick;
    end;
  end;
end;

procedure TForm1.PopItemClick(Sender: TObject);
begin
  {Nous utilisons une référence sur l'élément cliqué}
  with TmenuItem(Sender) do
  begin
    {Inverser son état pour refléter l'état après un click}
    Checked := not Checked;
    {Affectation de la propriété Visible du DbGrid en fonction de l'état
     coché/non coché de l'élément de menu qui vient d'être cliqué }
    DbGrid1.Columns[Tag].Visible := Checked;
  end;
end;

Conclusion :


Le code est amplement commenté.
Réalisé avec D6.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
15
Date d'inscription
vendredi 20 février 2004
Statut
Membre
Dernière intervention
10 mai 2007

Merci pour ton aide.
J'ai résolu mon problème qui était un peu plus compliqué et un peu différent car je désirais lancer une procédure du Parent de mon objet, j'ai donc fait une procédure intermédiaire dans l'objet qui lance celle du parent.
Car je pense que le problème provenait du fait qu'au moment de la compilation il ne connaissait pas son Parent encore car il est créé dynamiquement pendant l'execution et lié à son parent (lui aussi dynamique) dans le constructeur du parent.

Merci encore pour ton aide et pour ces codes fournis qui sont une bonne base pour apprendre et comprendre.
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
29
Patalou, tu peux affecter n'importe quelle méthode à un évènement donné, du moment que la signature est identique à celle de la méthode ciblée.
En clair, une méthode Click d'un objet est ainsi définie :
property onClick : TNotifyEvent;
Et TNotifyEvent est à son tour déclaré de la manière suivante :
TNotifyEvent = procedure(Sender: TObject) of object;

Delphi fait beaucoup pour nous faciliter l'écriture du code (avec une vitesse remarquable par rapport à d'autres environnements de développement), mais il faut encore parfois amorcer la complétion de code.
Si tu tapes les premières lettres après l'affectation et que tu appuies sur [CTRL]+[J], tu devrais voir apparaître les affectations possibles dans la liste déroulante.
Messages postés
15
Date d'inscription
vendredi 20 février 2004
Statut
Membre
Dernière intervention
10 mai 2007

Salut, cet exemple est très bien pour montrer comment ceci marche.
J'ai une question, tu fais
OnClick := PopItemClick;
donc tu associes une procédure quand on clique sur l'élément.
Je me suis inspiré de ce code et je désire faire de même
OnCLick mais il ne me propose que les var, const, type mais pas de procédure.
Est-ce moi qui n'est pas compris ou alors fais-je mal ?
(en gros chuis dans les choux).
Merci pour ta réponse.
Messages postés
13
Date d'inscription
vendredi 17 janvier 2003
Statut
Membre
Dernière intervention
30 janvier 2010

Merci beaucoup
cela fonctionne sans probleme
et oui encore une nouvelle fonction de decouverte ;o)
Olive
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
29
C'est très simple. A la création de la fiche, il suffit de lire un fichier contenant toute les valeurs des propriétés du composant DbGrid1 :
procedure TForm1.FormCreate(Sender: TObject);
begin
if FileExists('Grid.opt') then
ReadComponentResFile('Grid.opt', DbGrid1);
Table1.Open;
//.. reste du code
end;

Et, avant de fermer la fiche, de sauvegarder les valeurs des prorpiétés publiées du composant :
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
WriteComponentResFile('grid.opt', DbGrid1);
end;

Il n'y a rien de plus à faire !
Afficher les 7 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.