![]() |
[VTV] Virtual Treeview und horizontal scrollbar
Hallo Gemeinde,
gegeben ist diese Konfiguration:
Delphi-Quellcode:
*) es gibt zuwenig Nodes, um einen vertikalen Scrollbar anzuzeigen
ScrollBarOptions.AlwaysVisible := False;
ScrollBarOptions.ScrollBars := ssBoth; *) es gibt Nodes mit Text, der zu breit ist, um komplett angezeigt zu werden => wird mit [...] angezeigt. Problem: der horizontale ScrollBar wird nicht angezeigt Eine Teillösung habe ich mittels Prüfung im Initialisieren des Nodes: wenn der Text zu lang ist, dann setze ich
Delphi-Quellcode:
, aber das kanns ja nicht sein.
ScrollBarOptions.AlwaysVisible := True;
Ideen anybody? |
AW: [VTV] Virtual Treeview und horizontal scrollbar
Zitat:
Ein VirtualStringTree (VST) liegt auf einem Panel, alle vier Anchors des VST sind TRUE, das Panel kann via TSplitter in der Breite verändert werden. Wenn ich nun das Panel so schmal mache, daß die Einträge im VST nicht mehr vollständig sichtbar sind, erscheint keine horizontale Scrollbar. Auch nicht, wenn ich Knoten mit langen Untereinträgen aufklappe, so daß die Untereinträge nicht vollständig sichtbar sind. Meine ScrollBarOptions: AlwaysVisible := FALSE; HorizontalIncrement := 20; ScrollBars := SSBoth; ScrollBarStyle := sbmRegular; VerticalIncrement := 20; Habe dann erstmal alle möglichen Optionen des VST verändert, jedoch ohne dabei auf eine Lösung zu treffen. Die einzige Möglichkeit, die mir bleibt, die horizontale Scrollbar anzuzeigen, scheint AlwaysVisible auf TRUE zu setzen. Wenn's jemand besser weiß, wäre auch ich sehr dankbar ... Nachtrag: Habe eben festgestellt, daß in meinem Fall ein AlwaysVisible := TRUE nicht weiterhilft: Die horizontale Scrollbar erscheint zwar, enthält aber keinen Scrollbalken. Das liegt wohl daran, daß ich in meinem VST zwei Spalten habe, wobei in der ersten Spalte die Einträge stehen und diese Spaltenbreite sich nicht ändert. Der horizontale Scrollbalken erscheint aber erst, wenn es was zum Scrollen gibt, sprich: wenn eine Spalte die Breite des VST überschreiten würde. Das mußte ich jedoch verhindern, weil ich wollte, daß die zweite Spalte immmer sichbar bleibt. Entsprechend wird die erste Spalte bei Breitenänderungen des VST (onResize) angepaßt. |
AW: [VTV] Virtual Treeview und horizontal scrollbar
Juchu, ich bin nicht der Einzige ;-)
Mein Workaround ist so: von Stackoverflow:
Delphi-Quellcode:
im Event OnAfterPaintItem des Trees:
function TMyVirtualTree.IsTextClipped(Node: PVirtualNode; Column: TColumnIndex): Boolean;
var FullRect, ClippedRect: TRect; begin FullRect := GetDisplayRect(Node, Column, True, True); ClippedRect := GetDisplayRect(Node, Column, True, False); Result := (ClippedRect.Right - ClippedRect.Left) < (FullRect.Right - FullRect.Left); end;
Delphi-Quellcode:
Wenn Du IsTextClipped auf Deine Spalten anpasst, dann könnte es gehen.
procedure TMyVirtualTree.DoAfterItemPaint(
Sender: TBaseVirtualTree ; TargetCanvas: TCanvas ; Node: PVirtualNode ; ItemRect: TRect ); begin if (0 < Header.Columns.Count) and IsTextClipped(Node, 0) then begin ScrollBarOptions.AlwaysVisible := True; end; end; Edit: nach näherer Betrachtung, glaube ich das nicht mehr. Naja. Leider kann man auf diese Art die Scrollbars nicht mehr ausblenden, wenn sie mal eingeblendet sind. HTH |
AW: [VTV] Virtual Treeview und horizontal scrollbar
Zitat:
Wie bereits geschrieben, ich hab ja den TSplitter, um die vollständige Anzeige zu gewährleisten. Und ob der Anwender nun an der Scrollbar rumfummelt oder am Splitter, kommt fast aufs Gleiche raus, mit dem einzigen Unterschied: Via Scrollbar bekäme er u.U. auch nicht den Eintrag in seiner vollen Länge zu Gesicht, via Splitter aber schon, weil da einfach die Breite des VST so lange gezogen wird, bis alles reinpaßt. Ich laß das also mal so, wie ich es jetz habe. |
AW: [VTV] Virtual Treeview und horizontal scrollbar
Stimmt schon; ich kann das leider nicht so lösen, weil der Tree immer gleich breit bleiben soll. Glück Auf!
Edit: die momentan beste Lösung:
Delphi-Quellcode:
procedure TMyVirtualTree.DoAfterItemPaint(
Sender: TBaseVirtualTree ; TargetCanvas: TCanvas ; Node: PVirtualNode ; ItemRect: TRect ); begin if (0 < Header.Columns.Count) and IsTextClipped(Node, 0) then begin Header.AutoFitColumns(False, smaAllColumns, 0, 0); end; end; |
AW: [VTV] Virtual Treeview und horizontal scrollbar
Reicht es nicht, das AutoFitColumns einmalig (bzw bei Veränderung der Einträge im Tree) aufzurufen? Das sollte dazu führen, dass die Breite der Spalte(n) auf das breiteste Element eingestellt wird, was ggf. zur Anzeige der horizontalen Scrollbar führt.
|
AW: [VTV] Virtual Treeview und horizontal scrollbar
Leider nein. Immer, wenn der Anwender einen Knoten aufmacht, dann kann ein KindKnoten zu breit werden und das Problem ist wieder da.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11: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-2025 by Thomas Breitkreuz