سؤال

أحصل على مشكلات رسم باستخدام 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.

بعد التمرير (التمرير الصحيح، ثم انتقل اليسار):

نص Alt http://a.imagehost.org/0645/screen2.gif.

هل كانت مفيدة؟

المحلول

من الصعب قول ما تريد تحقيقه، ولكن يرى أن لديك نص طويل يمتد أعمدة متعددة لست متأكدا من استخدام الحدث المناسب - عادة ما تريد اقتطاع نص إذا كان وقتا طويلا بالنسبة لعموده.

على أي حال، أفضل شيء هو قراءة القسم 5.2 "دورات الطلاء ومراحل" في virtualtreeview.pdf. ملف الوثائق، والعثور على الحدث المناسب لاستخدامه لما تريد ترسمه. بالنسبة OnAfterItemPaint فإنه ينص:

يتم استخدام مرحلة الطلاء بعد العنصر لإضافة أشياء محددة للعقدة مثل الإطارات وما شابه ذلك تماما من جميع أعمدة هذه العقدة ويسمى مرة واحدة لكل عقدة.

لذلك أعتقد أنه ربما ليس الشخص الذي تريد استخدامه.

يحرر:

حسنا، إذا كنت تسير في دمج الخلايا، فأنت بحاجة فقط إلى إزالة إضافة VT1.OffsetX (و أضف VT1.TextMargin بدلا من ذلك) للحصول على السلوك الصحيح. يفترض ذلك بالطبع تريد بدء تشغيل إخراج النص في عمود الأول (الفهرس 0)، وإلا يجب عليك حساب موضع النص الأفقي من عرض الأعمدة.

ولكن من وصف مراحل الطلاء، ما زلت أفضل استخدام BeforeItemPaint الحدث وتعيين CustomDraw المعلمة var إلى True لتخطي أي لوحة افتراضية.

نصائح أخرى

هل جربت هذا:

TreeOptions.AutoOptions := TreeOptions.AutoOptions + [toAutoSpanColumns];

ذلك إلى حد كبير ما تحتاجه. إن إصدار المشكلة فقط قد لا تتمكن من تحديد الأعمدة التي تم تمكينها. ربما يمكنك الالتزام بهذا من خلال الحد من خلال تعيين CellText إلى مساحة بيضاء للأعمدة التي لا تريد أن تصل إليها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top