Um zur ursprünglichen Frage zurückzukommen: Ich bin mit Hilfe des Debuggers in die Tiefen des DBGrid eingetaucht und habe versucht das Verhalten der offenbar nicht immer wirksamen Option dgAutoSizeColumns zu verstehen.
Also: wenn die Option dgAutoSizeColumns in DBGrid.Options aktiviert wird, wird zunächst das Bit gsAutoSized in der internen GridStatus-Variablen gelöscht. Das signalisiert, dass bei der nächsten Gelegenheit die Spaltenbreiten neu berechnet werden sollen. Und das geschieht gleich am Ende des Setters der DBGrid Options über mehrere Zwischenstationen in InternalAutoSizeColumn, wo über alle Spalten hinweg die im Grid gepufferten Records nach den längsten Zellen durchsucht werden. Das geschieht aber nur, wenn eben dieses gsAutoSized-Flag gelöscht ist und die internal Variable FDefaultColWidths auf true steht; diese wird gelöscht, wenn die Spaltenbreiten mit der Maus verändert werden. Durch Letzteres wird die Wirkungsweise der dgAutoSizeColumns-Option sehr eingeschränkt - sobald der User einmal an den Spaltenbreioten gespielt hat, ist die Option tot... Man könnte das beheben, wenn man in der Prozedur UpdateGridColumnSizes das UpdateAutoSizeColumns aus dem "if FDefaultColWidths"-Block herausnimmt:
Code: Alles auswählen
procedure TCustomDBGrid.UpdateGridColumnSizes;
var
i: Integer;
begin
if FDefaultColWidths then begin
if dgIndicator in Options then
ColWidths[0]:=Scale96ToFont(12);
end; // <--- eingefügt
if NeedAutoSizeColumns then
UpdateAutoSizeColumns;
// end; // <--- auskommentiert
end;
Mit dieser Änderung kann man die Spaltenbreiten ändern und nach Hinundherschalten von gdAutoSizeColumns in den DBGrid.Options das AutoSize wieder aktivieren. Das Hinundherschalten ist nötig, damit gsAutoSized in GridStatus gelöscht wird. Etwas umständlich... Ich bin nicht sicher, ob es sich lohnt, dies in die DBGrid-Quellcode zu committen, denn es geht noch weiter:
Eine weitere Schwierigkeit ist, dass die richtige Spaltenbreite nur für die im Grid geladenen Records berechnet wird. Das ist sinnvoll, weil sonst bei großen Tabellen alle Records der Datenbank vom Server geladen werden müssten (womit man sich keine Freunde macht..). Aber das bedeutet auch, dass, wenn der User scrollt und somit neue Records ins Grid nachgeladen werden, möglicherweise die Spaltenbreite nicht mehr stimmt. Auch das ist gut, denn sonst würden die Spaltenbreiten beim Scrollen wild hinundherspringen. Für die Spaltenbreiten-Anpassung in diesen Fall ist die Methode DBGrid.AutoSizeColumns bzw. .AutoAdjustColumns vorgesehen.
Insgesamt bin ich der Meinung, dass man dgAutoSizeColumns nur als Einstellung für die Initialisierung verstehen darf, damit bei der erstmaligen Anzeige des Grids die zu den geladenen Records optimalen Spaltenbreiten vorliegen. Alle folgenden Anpassungen (v.a. nach Scrollen) muss man durch explizite Aufrufe von AutoSizeColumns/AutoAdjustColumns mit Hilfe eines Buttons o.ä. selbst vornehmen.