Wie kann Virtuelle Treeview Steuerung vorgenommen werden, um immer durch Linien zu bewegen?
-
06-09-2019 - |
Frage
Die Virtuelle Treeview scrollt vertikal von Pixeln, im Gegensatz zu der Art und Weise der Standard-Delphi Grids, TListView
und TTreeView
(oder die meisten anderen solcher Kontrollen, die ich bin mir dessen bewusst) blättern durch die Linie und halten eine komplette Linie sichtbar an der Spitze der jederzeit der Kontrolle. Wenn ich mit den Cursortasten zum Navigieren, dann, je nach Richtung, entweder die erste oder die letzte Zeile ist vollständig sichtbar. Wenn Sie mit der Maus scrollen gibt es keine Ausrichtung auch immer.
Dieses Verhalten kann zum Beispiel mit dem Strukturfenster in Delphi 2007 und 2009 beobachtet werden.
Gibt es eine Möglichkeit, die viele Eigenschaften zu setzen, das Verhalten des Standard-Windows-Steuerelemente haben? Oder gibt es eine Reihe von Patches irgendwo um dies zu erreichen?
Lösung
Sie könnten das TBaseVirtualTree.OnScroll Ereignis abfangen und den virtuellen treeview der Leinwand Rückgabewert für Texthöhe ( ‚M‘) als die Menge verwenden TBaseVirtualTree.offsety zu ändern, um zu erhöhen (nach oben) oder Abnahme (nach unten scrollen). Könnte aber auch, dass die Pre-Scroll-Position Modul Texthöhe, um sicherzustellen, testen ( ‚M‘) Null (Scrollen durch die richtige Menge von der falschen Position zu vermeiden).
Alternativ dieser Beitrag auf dem Virtual Treeview Forum schlägt einen anderen Ansatz: der virtuellen treeview nativen Bildlaufleisten mit VCL Bildlaufleisten verstecken und dann tun das Scrollen selbst (Trapping VCL Scroll-Ereignisse und programmatisch die virtuelle treeview scrollen).
Andere Tipps
Dies ist, was ich mit Hilfe von Argalatyr kam, sieht aus wie es das tut, was ich will es:
procedure TForm1.FormCreate(Sender: TObject);
begin
VirtualStringTree1.ScrollBarOptions.VerticalIncrement :=
VirtualStringTree1.DefaultNodeHeight;
end;
procedure TForm1.VirtualStringTree1Resize(Sender: TObject);
var
DY: integer;
begin
with VirtualStringTree1 do begin
DY := VirtualStringTree1.DefaultNodeHeight;
BottomSpace := ClientHeight mod DY;
VirtualStringTree1.OffsetY := Round(VirtualStringTree1.OffsetY / DY) * DY;
end;
end;
procedure TForm1.VirtualStringTree1Scroll(Sender: TBaseVirtualTree; DeltaX,
DeltaY: Integer);
var
DY: integer;
begin
if DeltaY <> 0 then begin
DY := VirtualStringTree1.DefaultNodeHeight;
VirtualStringTree1.OffsetY := Round(VirtualStringTree1.OffsetY / DY) * DY;
end;
end;