TDBGrid et son affichage

cs_anseis Messages postés 1 Date d'inscription mercredi 8 janvier 2003 Statut Membre Dernière intervention 9 janvier 2003 - 9 janv. 2003 à 19:44
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 - 9 janv. 2003 à 22:22
Bonjour,

Tout d'abord merci d'être aussi prolixe en sources tutoriaux et autres explications très utiles. Ma question porte sur l'affichage de données tirés d'une base de données type Access.

En utilisant l'objet TDBGrid, comment puis-je jouer dynamiquement sur son affichage en colonne ?

si ma base comporte trois colonnes : nom prenom age et j'aimerais que l'objet TDBGrid n'affiche que 2 de ces colonnes par exmple : nom et prenom.

En espérant être claire.

Merci

2 réponses

cs_Nono40 Messages postés 962 Date d'inscription mercredi 3 avril 2002 Statut Membre Dernière intervention 12 septembre 2006 2
9 janv. 2003 à 22:11
Plusieurs solutions à toi de choisir :

1 - En définissant les colonnes
Si ton DBGrid affiche toujours la même table, tu peux définir l'apparence des clonnes en double-cliquant sur la grille en mode conception. Ensuite tu peux ajouter les colonnes (liées à des champs ) que tu veux. Il est aussi possible de mettre tous les champs de la base et ensuite de rendre visible ou non certaines colonnes

2 - Champs persistants
Si tu définis les champ de la table en persitant par double clique sur le composant DataSet ou autre puis par ajout des champs. Il est est possible de masquer des champs en rendant certains invisible : quand tu double-clique sur le DataSet tu as la liste des champs, puis tu cliques sur le champ à cacher. Tu le cache en mettant la propriété visible de ce champ à false

3 - Si tu n'utilises pas de champ persitants et que la grille sert pour plusieurs bases, tu peux cacher des colonnes juste après l'ouverture de la table :
...
DataSet.Open;
DataSet.FieldByName('LeChampANePasVoir').Visible:=False;


--- :sleepy) Nono40@fr.st :sleepy) ---
Nouveau ---> Nono40.fr.st
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
9 janv. 2003 à 22:22
Comme la question est effectivement claire, la réponse n'en sera que plus rapide et précise.

Voilà, je propose une solution élégante basée sur l'utilisation dynamique d'un composant TPopupMenu :
1/- Mettre un composant TPopupMenu sur la fiche où est situé le DbGrid;

2/- Mettre la propriété PopupMenu du DbGrid à PopupMenu1;

3/- Dans le gestionnaire d'évènements OnPopup de PopupMenu1, mettre :
procedure TForm1.PopupMenu1Popup(Sender: TObject);
var
i : integer;
MenuItem : TMenuItem;
begin
//Effacer tous les éléments de menu présents
PopupMenu1.Items.Clear;
//Créer les éléments de menu pour chaque colonne du DbGrid
for i:=0 to DbGrid1.Columns.Count - 1 do
begin
MenuItem := TMenuItem.Create(PopupMenu1);
//Ajouter cet élément de menu au TPopMenu
PopupMenu1.Items.Add(MenuItem);
With MenuItem do
begin
//Régler les propriétés
Caption := DbGrid1.Columns[i].Title.Caption;
Checked := DbGrid1.Columns[i].Visible;
{IMPORTANT : la propriété Tag sera utilisée pour retrouver l'élément cliqué}
Tag := i;
{Affectation d'une méthode}
OnClick := PopItemClick;
end;
end;
end;

4/- Créer une procédure ayant la même signature que l'évènement OnClick d'un TMenuItem dans la section privée de la fiche :
private
{ Procédure qui sera appelée sur l'évènement OnClick
d'un élément de menu contextuel}
procedure PopItemClick(Sender: TObject);

Dans la foulée, appuyer simultanément sur [shiht][ctrl][C] tant que le curseur est dans la déclaration de la fiche. Ceci a pour effet de créer un squelette de procédure.

5/- Dans la procédure PopItemClick, inscrire le code suivant :
procedure TForm1.PopItemClick(Sender: TObject);
begin
with TmenuItem(Sender) do
begin
//Inverser l'état pour refléter le clic
Checked := not Checked;
DbGrid1.Columns[Tag].Visible := Checked;
end;
end;

Voilà, je crois que je n'ai rien oublié.
Si besoin, envoies-moi un message pour une réponse rapide.

May Delphi be with you
0
Rejoignez-nous