كيف يمكن إجراء عنصر تحكم TreeView الظاهري للتمرير دائما حسب الخطوط؟

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

  •  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;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top