Wie kann Virtuelle Treeview Steuerung vorgenommen werden, um immer durch Linien zu bewegen?

StackOverflow https://stackoverflow.com/questions/929600

  •  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?

War es hilfreich?

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top