Jain. AutoFit habe ich auch probiert. Leider ist diese Methode extremst langsam bei meinen Datenmengen. Deshalb ermittle ich ja schon vorab, was der längste Zelleninhalt je Spalte ist. Da ich eine Monospace-Schriftart verwende ist die Anzahl Buchstaben gleichbedeutend mit der größten Pixelanzahl. Ich kann also schon beim Initialisieren des VST (Rootnodecount setzen und entsprechende Anzahl Column-Objekte erzeugen) festlegen, wie breit jede Spalte sein soll. Das würde ich gar nicht nachgelagert über Eventhandler machen wollen.
Der Knackpunkt ist der ColumnHeader mit dem Sort-Glyph. Wenn das beides zusammen mehr Platz braucht als der längste Zelleninhalt im Grid, klappt die Kalkulation nicht mehr. Warum auch immer.
Du kannst beim Initialsieren die (Mindest-) Headerspaltenbreite berechnen mit Zugabe für den Glyph. Dann die Mindestbreite setzen.
Delphi-Quellcode:
procedure TFrameAlarmsVst.InitVst;
var
col: TVirtualTreeColumn;
b: TBitmap;
begin
b:= TBitMap.Create;
try
b.Canvas.Font.Assign(vstAlarms.Header.Font);
col:= self.vstAlarms.Header.Columns.Add;
col.Text:= _('Alarmart');
col.MinWidth:= b.Canvas.TextWidth(col.Text) + VST_COLUMN_GLYPH_WIDTH_ADDITION;
finally
b.Free;
end;
Wenn dann Deine Value Spaltenbreite kleiner ist als die col.MinWidth musst Du gar nichts berechnen/setzen.
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.