AJUSTER AUTOMATIQUEMENT LA LARGEUR D'UNE COLONNE D'UN TDBGRID EN DOUBLE CLIQUANT

ffert Messages postés 63 Date d'inscription samedi 18 janvier 2003 Statut Membre Dernière intervention 15 décembre 2009 - 26 mars 2004 à 08:33
mustapha81 Messages postés 6 Date d'inscription dimanche 20 mars 2005 Statut Membre Dernière intervention 10 mars 2006 - 27 févr. 2007 à 12:53
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/21485-ajuster-automatiquement-la-largeur-d-une-colonne-d-un-tdbgrid-en-double-cliquant-dessus

mustapha81 Messages postés 6 Date d'inscription dimanche 20 mars 2005 Statut Membre Dernière intervention 10 mars 2006
27 févr. 2007 à 12:53
Votre code est tres bien mais il ne comporte pas la largeur du titre!!!!je ne sais pas comment faire!!!!!!!!
BMSOFT Messages postés 5 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 24 décembre 2005
19 juin 2005 à 12:39
il y'a de magnifique composants de grille sur TMSsoft.com qui permette l'ajustage des cellules automatiques; le tri; et beaucoup d'autres fonctions plus simples. Merci
AhmedBoudali Messages postés 14 Date d'inscription mardi 24 octobre 2000 Statut Membre Dernière intervention 13 décembre 2005
4 févr. 2005 à 09:38
DelphiProg>> Avec mes excuses, j'ai mal lu le code.

Je croyais que FieldSize récuperait la taille en pixels sur la valeur du champ de l'enregistrement.

Petite subtilité pour y remédier (vue dans un source VB) --> transmettre la valeur du champ à un objet comportant une propriété de type autosize (TLabel) et récupérer sa propriété "width" dans la variable "tailleInitiale".

Pour l'option ajuster toutes colonnes ->> on duplique ce fameux objet et la variable "tailleInitiale", et on ajoute une boucle "for" dans la boucle "while not eof".

Vous en pensez quoi ?

Cordialement.
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 33
3 févr. 2005 à 18:57
AhmedBoudali >> ce n'est pas la même chose.
Ici il s'agit d'ajuster la largeur des colonnes à celles des données réellement présentes et non à la taille maximum de la colonne. Nuance...
Mais la remarque est bonne.
Par contre, dans le code que tu donnes, pourquoi parcourir les données si c'est pour ajuster à la taille de la colonne que l'on connait dès la conception ?
AhmedBoudali Messages postés 14 Date d'inscription mardi 24 octobre 2000 Statut Membre Dernière intervention 13 décembre 2005
3 févr. 2005 à 14:15
Il n'y aurait pas plus simple ?

var tailleInitiale:integer;

begin
tailleInitiale:=0

while not eof do
begin
if tailleInitiale<FieldSize then
tailleInitiale:=FieldSize;
next;
end;

Grid.Columns[Selected].width:=TailleInitiale;
end;
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 33
9 déc. 2004 à 00:22
Oluha: le problème avec ton code :
1/- c'est qu'il est fortement lié à form1 et gridFic
2/- il redimensionne toutes les colonnes, y compris celles non visibles (pas de distinction)
3/- il ne respecte pas la loi de Demeter.

J'ai donc revu mon code pour :
1/- qu'il s'applique à toutes les colonnes d'un TDbGrid
2/- que les titres soient pris en compte pour le calcul des largeurs
3/- qu'il soit compatible aussi Delphi 8
et voici ce que ça donne : une nouvelle méthode nommé ResizeAllColumns :

procedure TForm1.ResizeAllColumns(Grid: TDBGrid);
var
MaxWidth, //Largeur maximale de la colonne
MinWidth, //Largeur minimale de la colonne
CurrentWidth: integer; //Largeur actuelle
FieldSize: integer; //Taille du champ d'après son contenu
DS: TDataSet;
BookMark: TBookmark;
Col: integer;
begin

//Pour alléger l'écriture !...
DS := Grid.DataSource.DataSet;
with Grid do
begin
//Mémoriser la ligne actuellement sélectionnée
BookMark := DS.GetBookmark;
//Pour ne pas voir toutes les lignes défiler
Ds.DisableControls;
for Col := 0 to Grid.Columns.Count - 1 do
//ne traiter que les colonnes visibles
if Grid.Columns[Col].Visible then
begin
//prendre en compte la largeur des titres
MaxWidth := Canvas.TextWidth(Grid.Columns[Col].Title.Caption) + 5;
MinWidth := MaxWidth;
//Parcours de toutes les lignes de l'ensemble de données
DS.First;
while not DS.Eof do
begin
//Déterminer la largeur en pixels du contenu de l'enregistrement lu
FieldSize := Canvas.TextWidth(Grid.Columns[Col].Field.AsString) + 5;
//Réajuster la largeur maximale ?
if MaxWidth < FieldSize then
MaxWidth := FieldSize;
//Réajuster la largeur minimale ?
if MinWidth > FieldSize then
MinWidth := FieldSize;
DS.Next;
end;
//Largeur de la colonne cliquée
CurrentWidth := Grid.Columns[Col].Width;

if CurrentWidth <> MaxWidth then
CurrentWidth := MaxWidth;

if CurrentWidth < MinWidth then
CurrentWidth := MinWidth;
//Affectation de la nouvelle largeur à la colonne
Columns[Col].Width := CurrentWidth;
end; {if Grid.Columns[Col].Visible}
//repositionner le curseur de l'ensemble de données
DS.GotoBookmark(BookMark);
DS.FreeBookmark(BookMark);
//Rétablir l'affichage du TDbGrid
DS.EnableControls;
end;
end;

Ce code pourra aussi être réutilisé en tant que procédure simple.
cs_oluha Messages postés 71 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 5 février 2009
8 déc. 2004 à 15:23
Salut

Vu la date de ton message ABCD1234 tu ne dois plus en avoir besoin mais pour les autres, voici une procédure qui redimentionne toutes les colonnes de mon TDBGrid (par contre je ne tiens pas compte de la largeur du titre dedans).


procedure ResizeColumns();
var
J,MaxTextWidth, fieldwith : Integer;

begin

// On fait toutes les colonnes du TDBGrid
For J:=0 to Form1.GridFic.FieldCount-1 do
begin
// Initialisation
MaxTextWidth := 0;

// On recupere la longueur la plus grande contenu dans la colonne
Form1.GridFic.DataSource.DataSet.First;

while not form1.GridFic.DataSource.DataSet.Eof do
begin
fieldwith := Form1.GridFic.Canvas.TextWidth(form1.GridFic.datasource.DataSet.Fields.Fields[J].AsString);
if (fieldwith > MaxTextWidth) then MaxTextWidth := fieldwith;
Form1.GridFic.DataSource.DataSet.Next;
end;
// On applique la nouvelle taille a condition que la colonne n'était pas vide
If MaxTextWidth > 0 then form1.GridFic.Columns[J].Width := MaxTextWidth + 20;
end;
end;
cs_ABCD1234 Messages postés 1 Date d'inscription mercredi 24 mars 2004 Statut Membre Dernière intervention 13 avril 2004
13 avril 2004 à 18:49
Bonjour à tous,

Je suis encore un peu jeune sous Delphi et je n'arrive pas à modifier ce code comme je le voudrais. J'aimerais en fait ajuster la taille de toutes les colonnes en une fois, en tenant compte de la largeur des titres (parfois les titres sont plus larges que le contenu des colonnes)
Si quelqu'un peut m'aider, j'apprécierais beaucoup,

Bien à vous,

Marc
ffert Messages postés 63 Date d'inscription samedi 18 janvier 2003 Statut Membre Dernière intervention 15 décembre 2009
26 mars 2004 à 08:33
Voilà un code interressant...

Je pense que c'est le genre de code pertinent qui va arriver sur mon site... Si tu es d'accord....

Au fait, Je viens de terminer une formation DBExpress (par cogisoft), je vais peut être mettre les exemples sur ce site... En fonction de vos demandes... Si certains sont interressés, écrivez-moi...

Merci Delphi Prog.