الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

حول أداة الشجرة TreeView

مغلق
بدأه MoonMan في 21 مارس 2004 · 6 رد · 692 مشاهدة · في لغة Ms Visual Basic 6 وما قبلها من إصدارات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

لقد انتهيت من تصميم برنامج يستخدم أداة الشجرة, و المشكلة أنه عندما يصبح عدد العقد أكثر من 10000 عقدة فإنه

عند إغلاق النافذة بأخذ استراحة شي نصف دقيقة حتى تغلق الفورم , و هذا طبعاً بفضل التقنية الغبية التي تتبعها الأداة

عند تنظيف الشجرة من العقد ( سواء باستعمال TreeView1.Nodes.Clear في الحدث Unload أو بدونه)

و ذلك بأن تقوم بحذف العقد عقدة عقدة بدلاً من حذفهم دفعة واحدة . ما أريده هو التالي:

قيم ثابت الرسالة uMsg و قيم الوسطاء (wParam,lParam) التي علي استخدامها إذا ما أردت استعمال التابع

SendMessage من توابع API , أو من خلال الـ Subclassing .

#2

يا جماعة أنا أنتظر الرد

كيف يمكنني حذف جميع عقد الشجرة بسرعة كبيرة؟؟

#3
dim node as Node
for each node in treeview1.nodes

treeview1.nodes.remove(node.index)
next node

تم تعديل هذه المشاركة بواسطة Maverick في 23 مارس 2004 في 15:07

راكان الحنيطي

Be Open Source

opensource-550x4752.gif

#4

مشكور أخ Maverick

في الواقع لم أكن أتوقع أبداً أن حذف العقدة بهذه الطريقة أسرع من إستعمال المنهج Clear حتى أني لم أجربها.

#5

ولا انا بس لازم نجرب في يوم من الايام

راكان الحنيطي

Be Open Source

opensource-550x4752.gif

#6

إذا اردت حذف الشجرة باسرع ما يكون فاستخدم الكود التالي :

Private Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" _
    (ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, _
    ByVal lParam As Long) As Long
Private Const WM_SETREDRAW As Long = &HB
Private Const TV_FIRST As Long = &H1100
Private Const TVM_GETNEXTITEM As Long = (TV_FIRST + 10)
Private Const TVM_DELETEITEM As Long = (TV_FIRST + 1)
Private Const TVGN_ROOT As Long = &H0


' استخدم الروتين التالي ومرر المقبض للشجرة 
Sub ClearTreeViewNodes(ByVal hwnd As Long)
    Dim hItem As Long
    
    ' منع حركة الشجرة أثناء الإزالة
    SendMessageLong hwnd, WM_SETREDRAW, False, &O0

    ' إزالة الشجرة
    Do
        hItem = SendMessageLong(hwnd, TVM_GETNEXTITEM, TVGN_ROOT, 0)
        If hItem <= 0 Then Exit Do
        SendMessageLong hwnd, TVM_DELETEITEM, &O0, hItem
    Loop
    
    ' إعادة النوافذ للوضع الطبيعي
    SendMessageLong hwnd, WM_SETREDRAW, True, &O0
End Sub

تم تعديل هذه المشاركة بواسطة مجرد إنسان في 24 مارس 2004 في 22:29

#7

رغم أنني انصعقت عندما عرفت أن حذف العقد (خاصة العقد الجذرية ) ضمن حلقة For أسرع من المنهج Clear (الغبي جداًً جداًً و العديم الفائدة و الحال هذه) كما نوه الأخ Maverick, فهذا آخر ما كان يخطر ببالي , إلا أن ما قدمته أخ مجرد إنسان هو بالضبط 100% ما كنت أبحث عنه

Thanks

هذا الموضوع مغلق.

مواضيع مشابهة