delphi virtualtreeview.onafteritempaint مشكلة عند التمرير؟
-
19-09-2019 - |
سؤال
أحصل على مشكلات رسم باستخدام onafteritempaint الحدث عند إجراء التمرير الأفقي.
أساسا ما أريد تحقيقه هو دمج تأثير الخلايا المحددة، على سبيل المثال نص 1 للعمود 1 & 2، نص آخر للعمود 3 و 4، إلخ ... حتى الآن VT لا يحتوي على أي دعم لدمج العمود، لذلك لا بد لي من رسمها يدويا.
هل هناك حلوة أو حدث آخر يجب أن أستخدمه بدلا من ذلك؟
باستخدام: Delphi 7 + VirtualTreeView 4.8.5
مصدر الحدث:
begin
TargetCanvas.TextOut(ItemRect.Left+ VT1.OffsetX, ItemRect.Top,
'1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF');
end;
قبل التمرير:
النص البديل http://a.imagehost.org/0869/screen1.gif.
بعد التمرير (التمرير الصحيح، ثم انتقل اليسار):
المحلول
من الصعب قول ما تريد تحقيقه، ولكن يرى أن لديك نص طويل يمتد أعمدة متعددة لست متأكدا من استخدام الحدث المناسب - عادة ما تريد اقتطاع نص إذا كان وقتا طويلا بالنسبة لعموده.
على أي حال، أفضل شيء هو قراءة القسم 5.2 "دورات الطلاء ومراحل" في virtualtreeview.pdf. ملف الوثائق، والعثور على الحدث المناسب لاستخدامه لما تريد ترسمه. بالنسبة OnAfterItemPaint
فإنه ينص:
يتم استخدام مرحلة الطلاء بعد العنصر لإضافة أشياء محددة للعقدة مثل الإطارات وما شابه ذلك تماما من جميع أعمدة هذه العقدة ويسمى مرة واحدة لكل عقدة.
لذلك أعتقد أنه ربما ليس الشخص الذي تريد استخدامه.
يحرر:
حسنا، إذا كنت تسير في دمج الخلايا، فأنت بحاجة فقط إلى إزالة إضافة VT1.OffsetX
(و أضف VT1.TextMargin
بدلا من ذلك) للحصول على السلوك الصحيح. يفترض ذلك بالطبع تريد بدء تشغيل إخراج النص في عمود الأول (الفهرس 0)، وإلا يجب عليك حساب موضع النص الأفقي من عرض الأعمدة.
ولكن من وصف مراحل الطلاء، ما زلت أفضل استخدام BeforeItemPaint
الحدث وتعيين CustomDraw
المعلمة var إلى True
لتخطي أي لوحة افتراضية.
نصائح أخرى
هل جربت هذا:
TreeOptions.AutoOptions := TreeOptions.AutoOptions + [toAutoSpanColumns];
ذلك إلى حد كبير ما تحتاجه. إن إصدار المشكلة فقط قد لا تتمكن من تحديد الأعمدة التي تم تمكينها. ربما يمكنك الالتزام بهذا من خلال الحد من خلال تعيين CellText إلى مساحة بيضاء للأعمدة التي لا تريد أن تصل إليها.