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

توضيح كود دالة ؟

بدأه Rasool Micro في 22 ديسمبر 2011 · 7 رد · 654 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام وعليكم اخواني المبرمجين

كنت اعمل على برنامج واردت ان استخدم threading مع اداة progressbar (اظن انكم تفهمون ما معنى هذا صحيح؟!!!) وبحث في الكوكل والحمد لله وجدت الحل ولكن الكود الذي حل مشكلتي كان غامضاً فاريد مساعدتكم في فك هذا الغموض وهذا هو الكود:-

Delegate Sub setcontrolvaluecallback(ByVal ocontrol As Control, ByVal propname As String, ByVal propvalue As Object)
    Private Sub setcontrolproperty(ByVal ocontrol As Control, ByVal propname As String, ByVal propvalue As Object)
        If ocontrol.InvokeRequired Then
            Dim d As setcontrolvaluecallback = New setcontrolvaluecallback(AddressOf setcontrolproperty)
            ocontrol.Invoke(d, New Object() {ocontrol, propname, propvalue})
        Else
            Dim t As Type = ocontrol.GetType()
            Dim props As Reflection.PropertyInfo() = t.GetProperties()
            For Each p As Reflection.PropertyInfo In props
                If p.Name.ToUpper() = propname.ToUpper() Then
                    p.SetValue(ocontrol, propvalue, Nothing)
                End If
            Next
        End If
    End Sub

لكن هذا الكود من النظر اليه يشير الى انه يسمح لنا بوضح خاصية لاداة معينة اليس كذلك ؟؟؟؟ ام ماذا؟؟؟؟؟؟

اريد مساعدتكم في هذه المشكلة

وشكراً

#2

السلام عليكم ورحمه الله وبركاته

اخي الكود السابق يقوم بتعديل خاصية في اداة من Thread اخر, طبعا الأداة والخاصية المراد تتغييرها يمكنك تمرريها للدالة. ولكن السؤال يمكنك عمل هذا بطريقة بسيطة جدا, ولكن ممكن توضح لي ما هو هدفك لإستخدام هذه الطريقة؟

.:: Wish to become better and better ::.

#3
VB Helper كتب:

السلام عليكم ورحمه الله وبركاته

اخي الكود السابق يقوم بتعديل خاصية في اداة من Thread اخر, طبعا الأداة والخاصية المراد تتغييرها يمكنك تمرريها للدالة. ولكن السؤال يمكنك عمل هذا بطريقة بسيطة جدا, ولكن ممكن توضح لي ما هو هدفك لإستخدام هذه الطريقة؟

هدفي من السؤال هو لزيادة الخبرة ...... :wink:

لكن اخي انت ذكرت ان هناك طريقة اسهل ما هي هذه الطريقة ممكن ان توضحها لي؟؟؟!!!!!!

#4

السلام عليكم ورحمه الله وبركاته

اخي قبل ان اشرع في الطريقة, هل ممكن توضح ما تهدف اليه, لكي اجد الحل المناسب ..

.:: Wish to become better and better ::.

#5
VB Helper كتب:

السلام عليكم ورحمه الله وبركاته

اخي قبل ان اشرع في الطريقة, هل ممكن توضح ما تهدف اليه, لكي اجد الحل المناسب ..

هدفي من هذه الدالة هو اضافة قيمة لخاصية معينة عند استخدام الThreading

#6

السلام عليكم ورحمه الله وبركاته

اخي في حدث التحميل للفورم ضع الكود التالي

CheckForIllegalCrossThreadCalls = False

ومن ثم يمكنك تغيير قيمة اي خاصية بالصورة المعتاده

1

.:: Wish to become better and better ::.

#7

السلام عليكم ..

الاكواد اللي عباره عن :

تأكد من الثريد هل تستطيع التحكم بالأدوات controls

اذا تستطيع يبدأ التحكم واذا ماتستطيع يعمل invoke عن طريق الاداه control ويخلي الاستخدام عن طريق الـ thread الخاصه بالاداه وليست الثريد الجديده اللي عملتها

اسمحلي ماعرف أعبر بطريقه سليمه :P

المهم فيه طريقه افضل للتحكم بـ كل انواع الادوات عن طريق أي thread بدون عمل invoke

عن طريق استخدام

Control.CheckForIllegalCrossThreadCalls = False

تحطها بالفورم لود مره وحده فقط

وهذا مثال

Public Class Form1

Public bar As New ProgressBar

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Me.Controls.Add(bar)

' allow threads to Access controls without problems

Control.CheckForIllegalCrossThreadCalls = False

' start new thread

Dim t As New Threading.Thread(AddressOf NewThread)

t.Start()

End Sub

Sub NewThread()

Do Until bar.Value = bar.Maximum

bar.Value += 1

Threading.Thread.CurrentThread.Sleep(10)

Loop

End Sub

End Class

طيب الحين شرح ثاني لو حبيت تخلي الثريد تصنع اداه جديده راح تواجه مشاكل

وطريقه حلها أنك تخلي الثريد الاصليه اللي صنعت الفورم تصنع الاداه مثل الكود الي حاطه انت بس بطريقه ثانيه

مثال

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

' allow threads to Access controls without problems

Control.CheckForIllegalCrossThreadCalls = False

' start new thread

Dim t As New Threading.Thread(AddressOf NewThread)

t.Start()

End Sub

Delegate Sub _newThread()

Sub NewThread()

If Me.InvokeRequired Then

Dim j As New _newThread(AddressOf NewThread)

Me.Invoke(j)

Exit Sub ' <<<< exit current thread and let my form thread do the work

Else

' my form thread work

Dim bar As New ProgressBar

Me.Controls.Add(bar)

Do Until bar.Value = bar.Maximum

If bar.Value <> bar.Maximum Then

bar.Value += 1

End If

Threading.Thread.CurrentThread.Sleep(10)

Application.DoEvents() ' refresh controls

Loop

End If

End Sub

End Class

بالتوفيق ..

تم تعديل هذه المشاركة بواسطة njq8 في 26 ديسمبر 2011 في 08:14

1
#8

شكراً اخوان لقد طبقت الكود ونجح والحمد لله

هذا الكود افضل من الدالة الي كتبتها

شكراً

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