Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CONVERTIR DBGRID EN STRINGGRID


Information sur la source

Description

Une petite procedure qui permet de convertir un DBgrid en stringgrid.
Très pratique pour ceux qui ne veulent pas s'embêter à utiliser le composant DBgrid qui est très contraignant et peu modulable.

 

Source

  • procedure dbgridtostringgrid(db:tdbgrid;str:tstringgrid);
  • var ta:tdataset; // dataset est le lien de donné de la base du dbgrid
  • i,j:integer; // compteur de parcours
  • begin
  • ta:=db.DataSource.DataSet; //on récupère le dataset dans ta
  • if ta.Filtered then //on place le pointer sur le premier élément du filtre si le dbgrid est filtré
  • ta.FindFirst
  • else
  • ta.First; //sinon on place le pointer sur le premier élément
  • j:=0; //initialisation de j
  • str.RowCount:=1;
  • str.FixedCols:=0; //nombre de colonne fixe (gris)
  • str.ColCount:=db.Columns.Count; //on ajuste le nombre de colonne du stringgrid en fonction du dbgrid
  • for i:=0 to db.Columns.Count-1 do //on parcours toutes les colonnes de la première ligne pour ajuster la ligne fixe
  • begin
  • str.Cells[i,0]:=db.Columns.Items[i].FieldName;
  • end;
  • while not ta.Eof do //tant que l'on a pas atteint la fin des données
  • begin
  • j:=j+1; //on incrémente le conteur de ligne (pour le stringgrid)
  • str.RowCount:=str.RowCount+1; //on ajoute une ligne dans le stringgrid
  • for i:=0 to db.Columns.Count-1 do //pour toutes les colonnes on recopie les données
  • str.Cells[i,j]:=db.Columns.Grid.Fields[i].AsString;
  • ta.Next; //on passe à la prochaine ligne de la source de données
  • end;
  • if str.RowCount>1 then str.FixedRows:=1; //si il y a au moins une ligne, la première est fixe
  • end;
procedure dbgridtostringgrid(db:tdbgrid;str:tstringgrid);

var ta:tdataset; // dataset est le lien de donné de la base du dbgrid
    i,j:integer; // compteur de parcours

begin
  ta:=db.DataSource.DataSet; //on récupère le dataset dans ta
  if ta.Filtered then //on place le pointer sur le premier élément du filtre si le dbgrid est filtré
    ta.FindFirst
  else
    ta.First; //sinon on place le pointer sur le premier élément
  j:=0; //initialisation de j
  str.RowCount:=1;
  str.FixedCols:=0; //nombre de colonne fixe (gris)
  str.ColCount:=db.Columns.Count; //on ajuste le nombre de colonne du stringgrid en fonction du dbgrid
  for i:=0 to db.Columns.Count-1 do //on parcours toutes les colonnes de la première ligne pour ajuster la ligne fixe
    begin
    str.Cells[i,0]:=db.Columns.Items[i].FieldName;
    end;
  while not ta.Eof do //tant que l'on a pas atteint la fin des données
    begin
    j:=j+1; //on incrémente le conteur de ligne (pour le stringgrid)
    str.RowCount:=str.RowCount+1; //on ajoute une ligne dans le stringgrid
    for i:=0 to db.Columns.Count-1 do //pour toutes les colonnes on recopie les données
          str.Cells[i,j]:=db.Columns.Grid.Fields[i].AsString;
    ta.Next; //on passe à la prochaine ligne de la source de données
    end;
  if str.RowCount>1 then str.FixedRows:=1; //si il y a au moins une ligne, la première est fixe
end;

Conclusion

On peut rajouter un traitement pour le cas où il n'y a aucune ligne dans le dbgrid mais une exception doit être levé déjà bien avant.
 

Commentaires et avis

signaler à un administrateur
Commentaire de Delphiprog le 11/06/2006 22:42:34 administrateur CS

Honnêtement, je ne vois pas l'utilité de ce code.
Quand il s'agit de mettre à jour un ensemble de données, le composant TDbGrid est surement la réponse la plus appropriée et la plus efficace.

NB : aucune exception ne decrait être déclenchée "while not ta.Eof do" ne produira rien.

signaler à un administrateur
Commentaire de Francky23012301 le 11/06/2006 23:08:30

Salut,

Je suis pas un expert en base de données : cependant le DBGrid répond à la plupart des besoins d'un développeur à condition de savoir l'utiliser correctement. Maintenant si on veut avoir acces à d'autres fonctionnalités, il existe des composants DBGrid évolués disponibles gratuitement sur le Web. Je rejoins donc Delphiprog. Cependant la conversion que tu proposes pourraient toujours etre utile mais pour autre chose.

Maintenant coté code : rien à redire.

Pousse plus loin ton code afin de montrer l'utiliter  de cette transformation.

A+

signaler à un administrateur
Commentaire de mystercoco le 14/06/2006 11:30:28

Bonjour
Ce code m'a été d'une grande utilité lors de la présentation d'un projet.
En effet, on n'a pas forcement le droit d'utiliser d'autres composants que les composants par défaut de delphi, voir même contraint lors d'utilisations.
J'ai donc mis un appel de la procedure lors de l'évenement OPEN de la table.
Cela permet par exemple de faire le tri croissant/décroissant des colonnes, la récupération par coordonnées dans le stringgrid, la gestion des évènements du stringgrid (selection de cellules, gestion des lignes grisées (fixedrow/coll), reformatage beaucoup plus rapide, mise en cache des données, ajout de graphique ou image...
Les possibilités de gestion sont beaucoup plus souple dans un stringgrid.
De plus, cela permet au débutant de mieux comprendre le fonctionnement d'un Dbgrid (liaison avec les données).

signaler à un administrateur
Commentaire de Nono40 le 16/06/2006 01:05:12

Pas grand intéret. Surtout si le Dataset est important. Pas de mise à jour automatique en fonction des données ( cas de plusieurs PC/applications ).

Ne déplace pas l'enregistrement courant, et donc ne facilite pas les modifs sur la ligne en cours.

Dans tous les avantages que tu donnes dans ton commentaire, tout peut se faire dans le DBGrid et sans que ce soit plus compliqué.

signaler à un administrateur
Commentaire de cricri_69 le 15/09/2006 06:02:56

Bonjour,

Très intéressant ce code. Je me sers d'un code un peu similaire en conservant les fonctionnalités de la base de données pour les tris, etc. Celles des Stringgrid sont utiles pour l'affichage.
Par exemple, le dbgrid ne permet pas de conserver des lignes fixes si le nombre de record(s) est grand et que l'on doit faire des scrolling(s).
Un ( Tdrawgrid(dbgrid1).fixedrows:=3; ) par exemple ne sert à rien dans ce cas là. Dès que la page se déroule, la seule ligne conservée est la première malgré la couleur grisée initiale des 2 autres.
La conversion est donc très utile car les lignes fixes des stringgrid sont réellement FIXES.
Dans mon cas je conserve les 2 types de grille l'une pour les données, l'autre pour son afficahge plus souple ...

Ciao

signaler à un administrateur
Commentaire de alphy1070 le 11/11/2007 19:36:38

j'aimerais bien  appliquer ce code dans mon ptit projet justement je suis au niveau d'exploiter un stringgrid j'ai déjà rempli mon dbgrid mais j'arrive pas à mettre les données de la table ou du dggrid dans le stringgrid et puis je vois pas l'équiv. de tdataset? c'set l'alias de la base de données ou nom de la table ou simplement nom du dbgrid?
avez vous une idée sur l'usage des tableaux dynamique croisés possédant une base de données access
merci pour votre aide

signaler à un administrateur
Commentaire de mystercoco le 13/01/2008 17:42:52

Bjr,
les paramètres de la procedure sont les noms du dbgrid et du stringgrid. (le dbgrid doit bien sur être correctement lié à la base de donnée).

signaler à un administrateur
Commentaire de Frank_klein le 30/07/2008 14:47:52

TRES INTERESSANT, UTILE !

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Réactualiser les données avec ADO ? [ par Bruno ] Bonjour à tous,J'utilise les composants ADO pour me connecter sur une base Access.Un DataSet ADO pointe sur une table de plus de 10000 enregistrements stringgrid et sql [ par Rankin ] Salut, j'ai encore un problème. Je souhaite afficher le résultat d'une requete SQL dans une stringgrid, j'ai réussi à le faire, mais maintenant si je Problème de touche avec une TStringGrid.... [ par OrsE ] Salut tout le monde, J'ai un petit soucis avec ma StringGrid. En effet j'ai un system avec ma StringGrid qui me permet de faire un drag ans drop des c DBGrid et Drag&Drop [ par katharos ] Bonjour à tous, J'ai une petite question sur laquelle je n'arrive pas à trouver de réponse. Sur une Form j'ai 2 DBGrid et 1 StringGrid. Je peut déplac picklist dans une stringgrid [ par laska972 ] bonjour à tousje voudrais mettre une liste déroulante dans une colonne de ma stringgrid comme les picklist dans les dbgrid mais je ne veux pas utilise Alterner les couleurs dans DBGrid, erreur à la compil,mais pas tout le temps [ par DGPat ] Bonjour à tous,Voilà sur plusieurs fiches, j'alterne les couleurs d'un DBGrid, ca fonctionne, mais maintenant quans je crée une fiche e Séléctionner une ligne dans DBGRID [ par sosososo ] Bonjour,J'ai un problème pour seléctionner une ligne dans DBGRID que je viens d'insérer dans la base (CAD: Quand je fais le refresh dans dataset/dbgri colorié une cellule d'un DBgrid ou StringGrid [ par airhik7 ] Comment fait-on pour colorié une cellule d'un DBgrid ou stringgrid lorsque l'on clique dessus.C super urgent merci d'avance Retour à la ligne dans une cellule de TStringGrid [ par Drack92 ] Salutations,Je suis en pleine galère depuis pas mal de temps car via une requete SQL, j'insère le contenu d'un champ Memo d'une base Access dans un St Sav la selection dun dbgrid... [ par skzbg ] Bonjour a tous,bon, je vous explique :mon appli ce connecte a un server MySql et affiche une table dans un bdgrid dont la proprieté multiselct est a t


Nos sponsors

Sondage...

CalendriCode

Septembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
2930     

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,13 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.