بعد التركيز في الكود الي كتبته يتضح انك حاولت تستدعي showdialog من خلال ثريد فرعي وهذا صحيح ولكن ايضا هناك شرط ليكون الامر فعالا وهو ان انشاء كائن الفورم نفسه يجب ان يكون في الثريد الفرعي كذلك ، ولذلك الكود الاساسي الذي كتبته لك كان فعالا ..
بالنسبة للمشكلة الي حصلت بسبب السكين وعدم عمله بشكل سليم ، ذلك والله العالم لان الديف اكسبرس لايعمل بشكل مضبوط في الثريدات الفرعية
سأجرب الان شغلة وارجع لك
--
اخوي ابو ليلى تحياتي لك ولجميع الاخوة في المنتدى والله اشتقنا لكم ..
للاسف حاولت اجعل الويب براوزر يعمل في ثريد فرعي ولكن ظهر معي خطأ معناه انه لايمكن جعل كونترول تم تكوينه في ثريد فرعي في الفورم الذي تم تكوينها بالثريد الاساسي ..
ولكن الكود الاولي الذي كتبته لك كان فعالا:
كود :
Private Sub SurroundingSub()
Dim th As Thread = New Thread(Sub()
'انشاء كائن الفورم يجب ان يكون هنا
Dim form As Form2 = New Form2()
'اظهار الفورم
form.ShowDialog()
End Sub)
th.SetApartmentState(ApartmentState.STA)
th.Start()
End Sub
فيه حل تلويصي اخر وهو جعل الwebbrowser في فورم منفصلة وتقوم بتشغل الفورم بنفس طريقة الكود اعلاه
ولكي لايلحظ المستخدم ان الويب براوزر يشتغل في window منفصلة ، هنا يمكنك اللعب على خصائص الفورم مثل اخفاء الcontrol bars (زر الاغلاق والتكبير والتصغير) ، وايضا تجعل مكان الفورم هذي فوق المكان المخصص للعرض ، واسناد خاصة owner ..
16-10-20, 11:06 PM (آخر تعديل لهذه المشاركة : 16-10-20, 11:17 PM {2} بواسطة الشاكي لله.)
تفضل اخوي ،
في هذا المثال المكتوب بالسي شارب ستجد هناك الفورم الرئيسية (form1) تحاول تشغيل الفورم الفرعية form2 (تشغيل هذه الفورم يحتاج 3 ثواني)
الان عندما نريد ان نضع ويب براوزر لتشغيل صورة متحركة في الفورم1 ستصادفنا مشكلة التهنيق عندما نحاول فتح الفورم2 وذلك بسبب انشغال الثريد
ماقمت بعمله في المثال التالي هو حذف الويب براوزر من الفورم1 ونقله الى فورم جديدة خالية من كلشيء ، ومن ثم تشغيل هذا الفورم فوق المكان المطلوب لتبدو وكانها داخل الفورم1 حقا، ولكنها داخل فورم اخرى تم انشائها في ثريد اخر .
16-10-20, 11:07 PM (آخر تعديل لهذه المشاركة : 16-10-20, 11:19 PM {2} بواسطة الشاكي لله.)
تفضل هذا الكود للفورم1 كاملا محول للفيجوال بيسك
كود :
Public Partial Class Form1
Inherits Form
Private webBrowserForm As Form = DirectCast(Nothing, Form)
Public Sub New()
InitializeComponent()
Form1.CheckForIllegalCrossThreadCalls = False
CreateWebBroser()
End Sub
Private Sub CreateWebBroser()
Dim th As Thread = New Thread(Sub()
'انشاء كائن الفورم يجب ان يكون هنا
webBrowserForm = New Form()
webBrowserForm.StartPosition = FormStartPosition.Manual
webBrowserForm.FormBorderStyle = FormBorderStyle.None
webBrowserForm.ShowInTaskbar = False
CalculateWebBrowserFormLocationAndSize()
webBrowserForm.Owner = Me
webBrowserForm.Controls.Add(New WebBrowser() With {
.Url = New Uri("https://upload.wikimedia.org/wikipedia/commons/2/2c/Rotating_earth_%28large%29.gif"),
.Dock = DockStyle.Fill
})
'اظهار الفورم
Application.Run(webBrowserForm)
End Sub)
th.SetApartmentState(ApartmentState.STA)
th.IsBackground = True
th.Start()
End Sub
Private Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs)
Call New Form2().ShowDialog()
End Sub
Private Sub Form1_LocationChanged(ByVal sender As Object, ByVal e As EventArgs)
CalculateWebBrowserFormLocationAndSize()
End Sub
Private Sub Form1_SizeChanged(ByVal sender As Object, ByVal e As EventArgs)
CalculateWebBrowserFormLocationAndSize()
End Sub
Private Sub CalculateWebBrowserFormLocationAndSize()
If webBrowserForm Is Nothing Then Return
If webBrowserForm.InvokeRequired Then
webBrowserForm.Invoke(New Action(AddressOf CalculateWebBrowserFormLocationAndSize))
Else
webBrowserForm.Location = PointToScreen(panel1.Location)
webBrowserForm.Size = panel1.Size
End If
End Sub
End Class
تمت الاستعانة ب panel1 هو بانل فاضي مهمته يكون الplaceholder للمكان المفترض يطلع فيه الفورم الي فيه الويب براوزرد
المثال علمته على السريع لذلك لك حرية التصرف في عمل تحسينات له .. موفقين