Comment le contrôle virtuel Treeview être pour faire défiler toujours par des lignes?
-
06-09-2019 - |
Question
Les rouleaux virtuels TreeView verticalement par pixels, contrairement à la façon dont les grilles standards Delphi, TListView
et TTreeView
(ou la plupart des autres tels contrôles que je suis au courant), faites défiler par ligne et garder une ligne pleine et visible en haut de la le contrôle à tout moment. Lorsque j'utilise les touches de curseur pour naviguer, puis en fonction de direction, soit la première ou la dernière ligne est complètement visible. Lorsque vous faites défiler avec la souris il n'y a pas d'alignement que ce soit.
Ce comportement peut être observé par exemple avec la fenêtre Structure en Delphi 2007 et 2009.
Est-il possible de définir les nombreuses propriétés d'avoir le comportement des commandes standard de Windows? Ou est-il un ensemble de correctifs quelque part pour y parvenir?
La solution
Vous pouvez intercepter l'événement TBaseVirtualTree.OnScroll et utiliser la valeur virtuelle de retour de toile de TreeView pour textheight ( « M ») que le montant de changer TBaseVirtualTree.offsety afin d'augmenter (défilement vers le haut) ou décrémenter (défilement vers le bas). Pourrait tester également faire en sorte que le module de position pré-défilement textheight ( « M ») est égal à zéro (pour éviter de faire défiler par la bonne quantité de la mauvaise position).
Vous pouvez également ce poste sur le virtuel Treeview forum suggère une autre approche: cacher le défilement de treeview virtuel natif barres avec des barres de défilement VCL puis effectuez vous-même les faire défiler (piégeage des événements de défilement VCL et le défilement par programmation virtuelle) l'arborescence.
Autres conseils
est ce que je suis venu avec l'aide de Argalatyr, ressemble comme il le fait ce que je veux à:
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;