قد يظن البعض أنني أكرر موضوعي السابق حول البحث عن ملفات ولكن هذا الموضوع هو تطوير للموضوع السابق
أثناء القيام بالاختبارات على الكلاس السابق وجدت أنه يسبب عدم استجابة البرنامج أثناء عملية البحث وحتى انتهائها لذلك كان لابد من بعض التعديلات على الكلاس حتى أتمكن من استخدامه في مسار thread مستقل والكلاس الجديد في المرفقات وسأقوم ببعض الشرح حول استخدامه
أولا نقوم بتعريف متغير يشير للكلاس مع استخدام العبارة WithEvents حتى نستفيد من الأحداث الخاصة به وخصوصا أن الحدث FinishedSearch الخاص بالكلاس هو ما سيعيد نتائج البحث
Dim WithEvents FFs As New FilesFoldersSearch
للبحث عن ملف في جميع الأقراص الصلبة نستخدم كود شبيه بالتالي
' ضبط محددات البحث FFs.SetSearchParams(FilesFoldersSearch.SearchForEn.Both, FilesFoldersSearch.SearchInEn.FixedDrives, "*.ini") ' تعريف المسار الجديد Dim thr As New Threading.Thread(AddressOf FFs.StartSearch) ' بدء المسار الجديد thr.Start()
حيث نقوم بضبط محددات البحث وذلك بتمريرها للإجراء SetSearchParams الخاص بضبط عمليات البحث
ثم نقوم بتعريف متغير thr الخاص بالمسار thread الجديد الذي ستجري فيه عملية البحث وذلك باستخدام الاجراء StartSearch للمسار الجديد ثم نبدأ المسار باستخدام الأمر Start
وإذا أردت إظهار مؤشر تقدم لعملية البحث ستحتاج لاستخدام الحدثين DrivesProgress و FFSearchProgress الخاصين بكلاس البحث وبافتراض أنك وضعت إثنان ProgressBar وتمت تسميتهما Pb1 و Pb2 فيكون كود إظهار التقدم على هذه المؤشرات
أولا في الاعلانات العامة للفورم نستخدم تعريف الـ delegate التاليين
Private Delegate Sub CB_FFs_DrivesProgress(ByVal sender As Object, ByVal e As FilesFoldersSearch.FileSearchProgressEeventArgs) Private Delegate Sub CB_FFs_FFSearchProgress(ByVal sender As Object, ByVal e As FilesFoldersSearch.FileSearchProgressEeventArgs)
وذلك لاستخدامهما في عملية استعادة القيم من الكلاس - الموجود على مسار مختلف - وإظهارها
وبذلك يكون كود الحدثين
Private Sub FFs_DrivesProgress(ByVal sender As Object, ByVal e As FilesFoldersSearch.FileSearchProgressEeventArgs) Handles FFs.DrivesProgress
' تحديد ما إذا كان الاجراء Invoke يجب استخدامه
' وذلك لأن المسار الثاني لايمكنه تغيير قيم التحكمات في المسار الرئيسي بأمان
If Me.Pb2.InvokeRequired Then
' استخدام الاجراء Invoke حتى نستطيع استخدام القيم المعادة من الكلاس
' وإظهارها على التحكمات الموجودة على النافذة
Dim d As New CB_FFs_DrivesProgress(AddressOf FFs_DrivesProgress)
Me.Invoke(d, New Object() {sender, e})
Else
' تحديث قيم مؤشر التقدم بالقيم المعادة من الكلاس
Pb2.Minimum = e.Min
Pb2.Maximum = e.Max
Pb2.Value = e.CurPos
End If
End Sub
Private Sub FFs_FFSearchProgress(ByVal sender As Object, ByVal e As FilesFoldersSearch.FileSearchProgressEeventArgs) Handles FFs.FFSearchProgress
' تحديد ما إذا كان الاجراء Invoke يجب استخدامه
' وذلك لأن المسار الثاني لايمكنه تغيير قيم التحكمات في المسار الرئيسي بأمان
If Me.Pb1.InvokeRequired Then
' استخدام الاجراء Invoke حتى نستطيع استخدام القيم المعادة من الكلاس
' وإظهارها على التحكمات الموجودة على النافذة
Dim d As New CB_FFs_FFSearchProgress(AddressOf FFs_FFSearchProgress)
Me.Invoke(d, New Object() {sender, e})
Else
' تحديث قيم مؤشر التقدم بالقيم المعادة من الكلاس
Pb1.Minimum = e.Min
Pb1.Maximum = e.Max
Pb1.Value = e.CurPos
End If
End Subبقي علينا الآن انتظار انطلاق الحدث FinishedSearch الخاص بالكلاس والذي سيعيد إلينا نتائج البحث وسيكون الكود هنا شبيه جدا بكود الحدثين السابقين
أولا تعريف الـ delegate
Private Delegate Sub CB_FFs_FinishedSearch(ByVal sender As Object, ByVal e As FilesFoldersSearch.FinishedSearchProgressEeventArgs)
ثم إجراء الحدث بافتراض أنه لديك إثنان ListBox تريد إظهار نتائج البحث فيهما
Private Sub FFs_FinishedSearch(ByVal sender As Object, ByVal e As FilesFoldersSearch.FinishedSearchProgressEeventArgs) Handles FFs.FinishedSearch
If Me.ListBox1.InvokeRequired Or Me.ListBox2.InvokeRequired Then
Dim d As New CB_FFs_FinishedSearch(AddressOf FFs_FinishedSearch)
Me.Invoke(d, New Object() {sender, e})
Else
ListBox1.Items.Clear()
ListBox2.Items.Clear()
ListBox1.Items.AddRange(e.FoundFiles.ToArray)
ListBox2.Items.AddRange(e.FoundFolders.ToArray)
End If
End Sub- مرفق مثال كامل يتضمن الكلاس واستخدامه عمليا
- الكلاس والمثال مطور على VB2005 ولا أجد ما يمنع محاولة استخدامه على VB2003
