ajuster automatiquement la largeur d'une colonne dans une DBGrid
Bonjour,
j'ai un souci assez chiant :lol:
j'ai une DBGrid qui affiche les résultats d'une requete (dataset, ...)
Je voudrais faire un code équivalent au double-clic sur la bordure d'une colonne dans excel ou autre (càd qui ajuste la largeur de la colonne par rapport à la donnée la plus large en affichage dans cette colonne)..
après qqes recherches, j'ai réussi à écrire ceci (en parcourant tout le dataset pour trouver la cellule de largeur max)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
procedure ResizeColumn(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;
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;
//Parcours de toutes les lignes de l'ensemble de données
DS.First;
MaxWidth := Canvas.TextWidth(Columns[SelectedIndex].Title.Caption) + 5;
MinWidth := 0;
while not DS.Eof do
begin
//Déterminer la largeur en pixels du contenu de l'enregistrement lu
FieldSize :=
Canvas.TextWidth(DS.FieldByName(SelectedField.FieldName).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 := Columns[SelectedIndex].Width;
if CurrentWidth <> MaxWidth then
CurrentWidth := MaxWidth;
if CurrentWidth < MinWidth then
CurrentWidth := MinWidth;
//Affectation de la nouvelle largeur à la colonne
Columns[SelectedIndex].Width := CurrentWidth;
//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; |
Le code fonctionne très bien pour ceux que ça intéresse..
on peut facilement l'adapter d'ailleurs pour ajuster toutes les colonnes du dbGrid..
sauf que ça prend énormément de temps (le parcours du DataSet)
ne peut-on pas faire autrement?? plus simplement??
si qqn a une idée je suis preneur..
Merci