Einzelnen Beitrag anzeigen

taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
533 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: VirtualTreeview als Grid optimale Spaltenbreite berechnen

  Alt 8. Mär 2023, 11:26
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.

Geändert von taveuni ( 8. Mär 2023 um 11:28 Uhr)
  Mit Zitat antworten Zitat