Come può il controllo TreeView Virtuale essere fatta scorrere sempre dalle linee?
-
06-09-2019 - |
Domanda
TreeView scorre virtuali verticalmente di pixel, a differenza del modo in cui lo standard di Delphi griglie, TListView
e TTreeView
(o la maggior parte degli altri tali controlli che sono a conoscenza di) scroll per riga e mantenere una linea completa visibile nella parte superiore della controllo in ogni momento. Quando uso i tasti cursore per navigare, quindi a seconda della direzione o la prima o l'ultima riga è completamente visibile. Quando si scorre con il mouse non v'è alcun allineamento di sorta.
Questo comportamento può essere osservato, ad esempio con la finestra Struttura in Delphi 2007 e nel 2009.
C'è un modo per impostare le molte proprietà di avere il comportamento dei controlli standard delle finestre? O c'è un insieme di patch da qualche parte per raggiungere questo obiettivo?
Soluzione
Si potrebbe intercettare l'evento TBaseVirtualTree.OnScroll e utilizzare il valore della tela del controllo TreeView virtuale cambio di textHeight ( 'M') come la quantità di cambiare TBaseVirtualTree.offsety al fine di incrementare (scorrere verso l'alto) o decremento (scorrere verso il basso). Potrebbe anche test per assicurarsi che il pre-scroll posizione modulo textHeight ( 'M') è pari a zero (per evitare lo scorrimento dalla giusta quantità dalla posizione sbagliata).
In alternativa, questo post sul Treeview virtuale forum suggerisce un altro approccio: nascondere le barre di scorrimento native del controllo TreeView virtuale con barre di scorrimento VCL e poi fare lo scorrimento da soli (cattura eventi di scorrimento VCL e di programmazione scorrendo la vista ad albero virtuale).
Altri suggerimenti
Questo è ciò che mi si avvicinò con l'aiuto di Argalatyr, sembra che fa quello che voglio che:
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;