VirtualStringTree Spaltenbreite anpassen

Rund um die LCL und andere Komponenten
Antworten
Ronny58
Beiträge: 90
Registriert: So 27. Apr 2014, 20:35

VirtualStringTree Spaltenbreite anpassen

Beitrag von Ronny58 »

Ich möchte in meinem VirtualStringTree, das sich die Spaltenbreite optimal nach dem größten Wert in Text oder Spaltenüberschrift anpasst.
Klappt aber nicht.

Die Options im Header habe ich wie folgt gesetzt:

Code: Alles auswählen

vst.Header.AutoSizeIndex:=-1;
vst.Header.AutoFitColumns(False);

vst.Header.Options    := [hoAutoResize,hoColumnResize,hoDblClickResize,hoOwnerDraw,hoVisible];
vst.Header.Columns[i].Options := [coAllowClick,coEnabled,coParentBidiMode,coParentColor,coResizable,coShowDropMark,coVisible,coAutoSpring,coAllowFocus,coEditable];
Die Spalten werden aber so schmal angezeigt, dass nichts zu lesen ist.

Irgendwo im Netz habe ich folgenden Code gefunden, den ich nach dem vollständigen Aufbau der VST laufen lasse. Stand wohl schon jemand anderes vor dem gleichen Problem.

Code: Alles auswählen

procedure TfMain.ResizeTree(_vst: TVirtualStringTree; iStartCol: Integer);
var
  c: UInt32;
  ws: String;
  cnv: TCanvas;
  Fnt: TFont;
  ThisWidth: UInt32;
  MinWidth: UInt32;
  Node: PVirtualNode;
  r: TRect;
  s: TSize;
begin
  cnv := _vst.Canvas;
  for c := iStartCol to _vst.Header.Columns.Count - 1 do begin
    ws := _vst.Header.Columns[c].Text;
    GetTextExtentPoint32W(cnv.Handle, PWideChar(ws), Length(ws), s);
    MinWidth := s.cx + 10;
    Fnt := _vst.Font;
    Node := _vst.GetFirst;
    while Assigned(Node) do begin
      _vst.GetTextInfo(Node, c, Fnt, r, ws);
      ThisWidth := r.Right - r.Left + 10;
      if MinWidth < ThisWidth then MinWidth := ThisWidth;
      Node := _vst.GetNext(Node);
    end;
    _vst.Header.Columns[c].Width := MinWidth;
  end;
end;
Das Ergebnis sieht aber sehr willkürlich aus. Manche Spalten sehen gut aus, bei anderen sind sie zu breit oder zu schmal.

Mach ich da mit den Options was falsch?

AutoFitColumns habe ich nach dem Laden der VST ausgeführt.
Habe AutoFitColumns auch schon mit vollständigen Parametern probiert:

Code: Alles auswählen

AutoFitColumns(False,smaAllColumns,1,vstLst.Header.Columns.Count-1)
Nichts führt zum Erfolg.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: VirtualStringTree Spaltenbreite anpassen

Beitrag von Michl »

Habe die gepostete Methode mal mit meinem alten kleinen Testprojekt getestet. Funktioniert hier. Kleine Einschränkung, Column 0 benötigt noch Platz für die TreeLines, selbst ohne Option toShowTreeLines (weiß nicht, ob man das noch irgendwie ausschalten kann). Wenn man das berücksichtigt, ist alles OK hier (Windows 7, Lazarus 2.0.12 r64642 FPC 3.2.0 x86_64-win64-win32/win64, VirtualTreeView 5.5.3.1).

Test anbei.
Dateianhänge
Simple_Test_VST.zip
(4.27 KiB) 53-mal heruntergeladen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: VirtualStringTree Spaltenbreite anpassen

Beitrag von hubblec4 »

Michl hat geschrieben:
Mi 19. Mai 2021, 20:33
Column 0 benötigt noch Platz für die TreeLines, selbst ohne Option toShowTreeLines (weiß nicht, ob man das noch irgendwie ausschalten kann).
Die Treelines in Column 0(eigentlich genauer gesagt die MainColumn, welche auch einen anderen index ausser 0 haben kann) sind die RootLines vom RootNode(welcher selbst nie sichtbar ist).

Das kann mit der Option
TreeOptions -> PaintOptions -> toShowRoot deaktiviert werden (standard ist aktiviert).

Antworten