Utilisation de menu déroulant

Thrifto - 19 sept. 2012 à 10:38
solilog Messages postés 273 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 18 avril 2015 - 19 sept. 2012 à 21:52
Bonjour,

Je commence la programmation DELPHI donc je pense que je ne me suis pas tromper de section pour poster ce message.
Comme je suis en apprentissage et que ce langage est tout nouveau pour moi je commence par certaines bases tels que l'utilisation d'un menu déroulant.

Trêve de bavardage je vous présente mon problème, j'ai une base de donnée en ACCESS, je me connecte dessus et je récupère ce que j'ai a récupérer par le biais d'un requête SQL qui m'affiche les données dans un DBGrid. Jusque là tous va bien !
Maintenant j'aimerai récupérer le nom des colonnes pour les mettre dans un menu déroulant, et par le biais de ce menu déroulant et d'un bouton, sélectionner la colonne et afficher son contenu dans un MEMO ou autre.

J'ai déjà parcourue ce forum et d'autres forum à la recherche d'une solution adapté à mon problème mais je n'ai rien trouvé qui correspond à ma demande
J'ai donc quelques essaies non fructueux à mon actif type :
procedure TForm1.DBComboBox1Change(Sender: TObject);
begin
    ZQuery5.close ;
    ZQuery5.SQL.Clear;
    ZQuery5.SQL.add('SELECT * FROM TOTO');
    ZQuery5.Open;
    ZQuery5.First;

    while not ZQuery5.Eof do
    begin
      DBComboBox1.Items.Add(ZQuery5.FieldByName('Colonne1').asstring);
      ZQuery5.Next;
    end;
end;

Qui n'affiche rien dans ma ComboBox.
J'en viens donc à vous demander de l'aide ou m'indiquer un cours qui m'aiguillerai sur une solution.
Merci d'avance !

6 réponses

jderf Messages postés 189 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 2 octobre 2014 1
19 sept. 2012 à 13:51
Bonjour,

Ton problème vient de là :

'SELECT * FROM TOTO' et ZQuery5.FieldByName('Colonne1')

Remplace par "select colonne1 from toto" si colonne1 est bien un nom existant dans ta table "toto".

C'est bien de prendre l'habitude de nommer les tables et les champs de ces dernières, avec des noms significatifs.

Jean
0
J'ai suivis ton conseil et renommer 'Colonne1' par 'Nom' et le reste de mes colonnes par 'Prénom' / 'Ville' / 'Pays'.

Je ne dis pas que le fait de changer la requête n'a pas arrangée les choses mais le résultat est exactement le même, mon menu déroulant reste vide.

J'ai aussi essayé de remplacer :
DBComboBox1.Items.Add(ZQuery1.FieldByName('Nom').asstring);

Par :
DBComboBox1.Items.Add(ZQuery1.Fields.Fields[0].asstring);

cela n'a pas d'effet non plus.

Je rappelle bien que m'a table s'affiche en entière dans le DBGrid donc je récupéré bien TOUTE la table Access.
0
jderf Messages postés 189 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 2 octobre 2014 1
19 sept. 2012 à 15:03
Pour le DBgrid, tu as utilisé un ClientDataSet, essayes cela :

with TonClientDataSet begin
Open;
First;
DBComboBox1.Clear;
While not eof do begin
// Remplissage du ComboBox
DBComboBox1.Items.Add(FieldByName('Nom').AsString);
Next;
end;
end;

Jean
0
J'ai essayé ta méthode (en passant je pense que tu as oublier le do après mon client dataset) et non le problème reste le même, je précise que j'utilise ZEOS ACCESS pour accéder à ma base de donnée et je suis sous delphi7.

Merci de ton aide Jean j'apprécie :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Solution trouvée ! Donc toutes les méthodes présentées ici sont viables ! J'ai juste envie de rigoler de moi même mais j'essayé d'implémenter mon code dans le mauvais endroit, dans ma COMBOBOX en fait.
Le code devait être fait à l'extérieur (chose logique me direz vous mais non pas sur le moment).
Il ma donc suffi de déplacé tout ça dans mon FORM dans l’évènement OnShow et voilà mon menu déroulant affiche bien mes champs.

Maintenant est il possible d'afficher le nom des tables à la place des champs ? Je vais chercher de mon côté et peut être recréer un sujet pour ne pas encombrer celui là plus qu'il ne l'ai !

En tout cas je te remercie Jean et te souhaite une bonne continuation on aura peu être à ce revoir sous peu :D
0
solilog Messages postés 273 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 18 avril 2015 10
19 sept. 2012 à 21:52
Bonsoir,
Je viens comme un cheveu sur la soupe, mais ton truc est tout simple. Tu veux choisir parmi les tables d'une DB, puis choisir les champs de la table, voir les index, ...
tu poses sur ta feuille: une DB db1, une table tb1, datasource ds1, un dbgrid gr1, un dbmemo dbEdit1. tu branches tout ca ensemble.
Ensuite bouton bt1, 3 listbox / combobox liTbl, liFld, LiIdx ok ?
Et voilà:

implementation

{$R *.DFM}
procedure TForm1.bt1Click(Sender: TObject);
begin
if not db1.connected then db1.open;
session.gettablenames( 'DB1', '*.*', true, false, liTbl.items );
end;

procedure TForm1.liTblClick(Sender: TObject);
var tname:string;
begin
with liTbl do tname := items[ itemindex ];
if tb1 .active then
begin
tb1.close;
tb1.IndexName := '';
dbEdit1.DataField := '';
end;
tb1 .tablename := tname;
tb1 .getfieldnames(liFld.items);
tb1 .getindexnames(liIdx.items);
tb1 .open;
end;

procedure TForm1.liIdxClick(Sender: TObject);
var iName : string;
begin
with liIdx do iName := items [ itemindex ];
tb1.indexname := iName;
end;

procedure TForm1.liFldClick(Sender: TObject);
var fName : string;
begin
with liFld do fName := items[ itemindex ];
dbEdit1 . datafield := fName;
end;

end.
//

tu select ta table, tes index (ta dbgrid changera de tri), ton champ (le memo affichera la connée) ...
salut.
solilog
0
Rejoignez-nous