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)
Le code fonctionne très bien pour ceux que ça intéresse..
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;
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
Partager