كيف يمكن إجراء عنصر تحكم TreeView الظاهري للتمرير دائما حسب الخطوط؟
-
06-09-2019 - |
سؤال
مخطوطات TreeView الظاهري عموديا حسب بكسل، على عكس طريقة شبكات دلفي القياسية، TListView
و TTreeView
(أو معظم الضوابط الأخرى التي أدركها) التمرير حسب الخط والحفاظ على خط كامل مرئي في الجزء العلوي من عنصر التحكم في جميع الأوقات. عندما أستخدم مفاتيح المؤشر للتنقل، ثم اعتمادا على الاتجاه إما السطر الأول أو الأخير مرئي تماما. عند التمرير باستخدام الماوس، لا يوجد محاذاة على الإطلاق.
يمكن ملاحظة هذا السلوك على سبيل المثال مع نافذة الهيكل في دلفي 2007 و 2009.
هل هناك أي طريقة لتعيين العديد من الخصائص الخاصة بها للحصول على سلوك عناصر تحكم Windows القياسية؟ أم أن هناك مجموعة من الرقع في مكان ما لتحقيق ذلك؟
المحلول
يمكنك اعتراض حدث Tbasevirtualtree.onscroll واستخدام قيمة إرجاع Canvas ل Textual TreeView ل Textalight ('m') كمبلغ لتغيير tbasevirtualtree.offsety من أجل زيادة (التمرير لأعلى) أو الانخفاض (التمرير لأسفل). يمكن أن تختبر أيضا لضمان مواد التمرير المسبق Modulus Textaleight ('m') هو صفر (لتجنب التمرير حسب المبلغ المناسب من الموضع الخطأ).
بدلا من ذلك، هذا المشنور في منتدى TreeView الظاهري يقترح نهجا آخر: إخفاء أشرطة التمرير الأصلية ل TreeView TreeView مع أشرطة التمرير VCL ثم قم بالتمرير بنفسك (محاصرة أحداث التمرير VCL والتمرير برمجيا Tree Virtual TreeView).
نصائح أخرى
هذا ما توصلت إليه بمساعدة Argalatyr، يبدو أنه يفعل ما أريده:
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;