Bonjour,
j'ai un souci assez chiant

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 : Sélectionner tout - Visualiser dans une fenêtre à part
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