سؤال

في بعض أكواد VB6، لدي معالج لحدث انهيار TreeView:

Private Sub MyTree_Collapse(ByVal Node as MSComCtlLib.Node)

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

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

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

المحلول

أعتقد أنه مثل العديد من الأحداث في VB، لا يمكن إيقاف تشغيله.

ما عليك سوى تعيين علامة منطقية كما اقترحت.

نصائح أخرى

@ فيل - توصلت إلى نفس النتيجة.تنفيذي ل MyTree_Collapse يبدو الآن شيئًا كهذا (حيث m_bHandlingCallback هو متغير عضو):

Private Sub MyTree_Collapse(ByVal Node as MSComCtlLib.Node)
    If m_bHandlingCallback Then Exit Sub

    m_bHandlingCallback = True
    DoSomeStuff
    m_bHandlingCallback = False
End Sub

هناك طريقة أخرى في VB6 وهي الحصول على بديل WithEvents إشارة إلى السيطرة:

Private WithEvents alt as TreeView

و في Form_Load:

Private Sub Form_Load()
Set alt = MyTree
End Sub

الآن alt سوف تتلقى الكثير من الأحداث مثل هذا:

Private Sub alt_Collapse(ByVal Node as MSComCtlLib.Node)
Set alt = Nothing
'DoSomeStuff'
Set alt = MyTree
End Sub

ولكن، خلال DoSomeStuff, ، الأحداث غير مرتبطة - وهذا ينطبق أيضًا على جميع الأحداث الأخرى Subق ل alt دون الحاجة إلى إجراء تغييرات تدخلية.

أود أن أعلن أن متغير العلامة ثابت في Sub.يؤدي هذا إلى تجنب جعل المتغير عالميًا ويجعله يحتفظ بقيمته بين الاستدعاءات.

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