![]() |
[VST] Spaltenbreite an längsten Eintrag anpassen
Hallo ihr,
wie kann ich die Spaltenbreite vom VirtualStringTree an den längsten Eintrag + Spaltentitel setzen? MfG xZise |
Re: [VST] Spaltenbreite an längsten Eintrag anpassen
Schau dir mal bitten den Code zu dem Header an.
Dort ist eine Funktion, welche bei Doppelklick zwischen den Spaltennamen die gewünscht Funktion auslöst. |
Re: [VST] Spaltenbreite an längsten Eintrag anpassen
Nein die löst nicht die gewünschte Funktion aus ;) Und zwar wird die Spaltenbreite nicht an den Spaltentitel angepasst sondern nur an den Inhalt.
MfG xZise |
Re: [VST] Spaltenbreite an längsten Eintrag anpassen
Hast du hoDblClickResize an?
Diese ruft intern "GetMaxColumnWidth" auf. |
Re: [VST] Spaltenbreite an längsten Eintrag anpassen
xZise hat durchaus Recht. Die Spaltenbreite wird ausschließlich an den Inhalt der Nodes, nicht jedoch an den Inhalt des Headers angepasst.
Allerdings kann man das seit spätestens Version 4.8.0 mit dem Event AfterGetMaxColumnWidth machen. Es wird aufgerufen, nachdem die Breite bestimmt wurde und gibt dir die Möglichkeit, den ermittelten Wert noch einmal zu verändern. Du brauchst dort also nur noch ermitteln, wie breit der Spaltentitel ist und setzt dann den var-Parameter MaxWidth entsprechend |
Re: [VST] Spaltenbreite an längsten Eintrag anpassen
Jetzt müsste man nur noch erfahren können, wie Breit der Spaltenheader ist.
MfG xZise |
Re: [VST] Spaltenbreite an längsten Eintrag anpassen
Die Spaltenbreiten werden beim Design festgelegt.
Du brauchst nur die Header.items[i].width auslesen. |
Re: [VST] Spaltenbreite an längsten Eintrag anpassen
Also ich habe gar keine Eigenschaft Items ... Außerdem will ich ja nur die Breite des Headers.
MfG xZise |
Re: [VST] Spaltenbreite an längsten Eintrag anpassen
Ok, irgendwie sprechen wir immer aneinander vorbei!
Die Eigenschaft heißt vst.header.columns[i].width für die Breite eine Spalte. Der Header selbst ist immer so breit wie der VST bzw. die breite kann aus der privaten Variable FHeaderRect von TBaseVirtualTree ausgelesen werden. Die größe berechnet der Tree in TBaseVirtualTree.UpdateHeaderRect Siehe auch Klasse TVTHeader bzw. TVirtualTreeColumns. In TVirtualTreeColumns ist das Zeichen implementiert. Vielleicht beschreibst du einfach genau was du haben möchtest. |
Re: [VST] Spaltenbreite an längsten Eintrag anpassen
Hallo,
wir machen das Ganze so (VST ist bei uns in einen Frame integriert):
Delphi-Quellcode:
Damit die Berechnung nicht so ewig dauert (wurde hier im Forum schon mal angesprochen) solltest du noch
procedure TFrameVST.AutoFitColumn(Column: TColumnIndex);
var cWidth, hWidth: Integer; begin if [coResizable, coVisible] * vst.Header.Columns[Column].Options = [coResizable, coVisible] then begin cWidth := vst.GetMaxColumnWidth(Column); if (hoVisible in vst.Header.Options) then begin hWidth := GetMaxHeaderWidth(Column); if cWidth < hWidth then cWidth := hWidth; if cWidth > vst.Header.Columns[Column].MaxWidth then cWidth := vst.Header.Columns[Column].MaxWidth; end; vst.Header.Columns[Column].Width := cWidth; end; end; function TFrameVST.GetMaxHeaderWidth(Column: TColumnIndex): Integer; var col: TVirtualTreeColumn; Size: TSize; begin col := vst.Header.Columns[Column]; Result := 2 * col.Margin; if (Length(col.Text) > 0) then begin vst.Canvas.Font := vst.Header.Font; GetTextExtentPoint32W(vst.Canvas.Handle, PWideChar(col.Text), Length(col.Text), Size); Inc(Result, Size.cx + 4); end; if (hoShowImages in vst.Header.Options)and(Assigned(vst.Header.Images)) then Inc(Result,(vst.Header.Images.Width + col.Spacing)); if (hoShowSortGlyphs in vst.Header.Options)and(vst.Header.SortColumn = Column) then Inc(Result, 20); // Platz für Sortimage if Result < col.MinWidth then Result := col.MinWidth; if Result > col.MaxWidth then Result := col.MaxWidth; end; procedure TFrameVST.AutoFitColumns; var Column: TColumnIndex; begin vst.BeginUpdate; try for Column := 0 to vst.Header.Columns.Count-1 do AutoFitColumn(Column); finally vst.EndUpdate; end; end; folgendes hinzufügen:
Delphi-Quellcode:
procedure TFrameVST.vstBeforeGetMaxColumnWidth(Sender: TVTHeader;
Column: TColumnIndex; var UseSmartColumnWidth: Boolean); begin if Assigned(vst.OnBeforeCellPaint) then begin FmerkOnBeforeCellPaint := vst.OnBeforeCellPaint; vst.OnBeforeCellPaint := nil; end; end; procedure TFrameVST.vstAfterGetMaxColumnWidth(Sender: TVTHeader; Column: TColumnIndex); begin if Assigned(FmerkOnBeforeCellPaint) then begin vst.OnBeforeCellPaint := FmerkOnBeforeCellPaint; FmerkOnBeforeCellPaint := nil; end; end; |
Re: [VST] Spaltenbreite an längsten Eintrag anpassen
Zitat:
Ich guck mir gleich mal madas Lösung an. MfG xZise |
Re: [VST] Spaltenbreite an längsten Eintrag anpassen
Hallo,
also mit mades Lösung geht es wunderbar! MfG xZise |
Re: [VST] Spaltenbreite an längsten Eintrag anpassen
So die Lösung ist wunderbar, außer das sie relativ lange braucht. Und zwar braucht er für 160.000 Einträge mit 6 Spalten 1,4 Sekunden. Gibt es da irgendein Optimierungspotential?
MfG xZise |
Re: [VST] Spaltenbreite an längsten Eintrag anpassen
Ich würde nicht alle 160.000 durchrattern sondern nur die ersten - sagen wir mal - 1.000 . Der User scrollt in der Regel seltener nach unten als das er nach oben in die ersten Zeilen schaut - diesen Umstand kannst du nutzen.
|
Re: [VST] Spaltenbreite an längsten Eintrag anpassen
Aber wenn er sortiert, muss ich wieder die obersten 1.000 Einträge abarbeiten.
Hmmm ich habe mal eine Frage: Welche Methode ruft er beim Doppelklick zwischen den Spaltenheadern auf? Weil das braucht nicht so lange! MfG xZise |
Re: [VST] Spaltenbreite an längsten Eintrag anpassen
Zitat:
Delphi-Quellcode:
VT.Header.AutoFitColumns(False, smaUseColumnOption, 0, 1);
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz