عرب تك
هل تريد التفاعل مع هذه المساهمة؟ كل ما عليك هو إنشاء حساب جديد ببضع خطوات أو تسجيل الدخول للمتابعة.

اذهب الى الأسفل
avatar
tarik
عدد المساهمات : 134
تاريخ التسجيل : 08/10/2012

 السحب والالقاء فى vb.net Empty السحب والالقاء فى vb.net

الإثنين أكتوبر 08, 2012 5:53 pm
1- احداث السحب والافلات
اساس عملية السحب والإفلات في الدوت نت هي :-

* الخاصية Allowdrop : من النوع Boolean وتحدد فيها اذا ماكنت تريد للأداة ان تستقبل الافلات عليها ام لا ، اود التنبيه ان هذه الخاصية قد لا تظهر في صندوق الخصائص لبعض الأدوات ، لذلك عليك اسناد القيمة لها في الحدث Load ،

* الطريقة DoDragDrop : لبدء عملية السحب والإلقاء من الأداة ، وتحتوي الطريقة على وسيطتين ، الأولى من النوع Object تحدد فيها الكائن المراد إرساله في عملية السحب والإفلات ، والثانية من النوع Windows.Forms.DragDropEffects تحدد فيها شكل التأثير ،

بعد استدعاء الطريقة السابقة وارسال البيانات المطلوبه ، ثم افلاتها على اداة أخرى ، فاذا كانت قيمة الخاصية Allowdrop للأداة المفلت عليه مساويه لـ True ، يتم اطلاق احداث السحب والإفلات ، وقد تم شرحها في الموضوع التالي في المشاركة رقم 5 :-
أحداث السحب والإفلات :

الحدث DragEnter : يتم إطلاقه عند دخول مؤشر الفأرة على الأداة محمل بالبيانات .

الحدث DragDrop : يتم إطلاقه عند إفلات البيانات على الأداة .

الحدث DragOver : يتم إطلاقه عند انتهاء عملية السحب والإفلات .

والأحداث مشتركة في وسائطها من النوع DragEventArgs .

الكائن DragEventArgs : يحتوي على عدة خصائص مفيدة :-

الخاصية Effect : تمثل تأثيرات السحب والإفلات .

الخاصية AllowedEffect : تعود بالتأثير المرسل من مصدر السحب .

الخواص X , Y : تحدد موقع مؤشر الفأرة .


الخاصية Data : تمثل البيانات المرسلة مع عملية السحب والإفلات ، وهو من النوع IDataObject ، ويحتوي على عدة طرق :-

الطريقة GetData : تعود بالبيانات المرسلة ، مثال :-

e.Data.GetData( Windows.Forms.DataFormats.Text )
الطريقة GetDataPresent : تعود بقيمة منطقية تمثل على نوع البيانات ، مماثلة للنوع المرسل أم لا .

If e.Data.GetDataPresent(Windows.Forms.DataFormats.Text) Then
'نص'
Else
'ليس نص'
End If
سحب والقاء النصوص

دلوقتى هنعرف ازاى ننسخ نص من textbox الى textbox آخر على نفس الفورم.
هنضيف اتنين textbox ونسمى الأول SourceTextbox والثانى TargetTextbox
الأول هو الذى سيتم نقل النص منه (سحب النص) والثانى سوف ننقل النص اليه (القاء النص).

الأحداث التى نتعرض لها فى عملية السحب والالقاء:
أولا الحدث MouseDown وده بيتنفذ لما المستخدم بيضغط على الأداة.
ثانيا الحدث MouseMove وده بيتنفذ لما الماوس بيتحرك.
ثالثا الحدث DragEnter وده بيتنفذ عندما يكون الماوس محمل بالبيانات ودخل فى الأداة الى هيلقى البيانات فيها.
رابعا DragDrop وده بيتنفذ عندما يتم افلات الماوس على الأداة.

هام : يجب ان تكون الخاصية AllowDrop التابعة للأداة المراد افلات البيانات اليها مساوية True .

قبل كتابة الأكواد خلينا نشوف ايه السيناريو اللى هيحصل:
- فى الأول هيضغط المستخدم على اداة النص الأولى والتى يوجد بها النص المراد نسخه.
- هيبدأ المسخدم فى انه يتحرك بالماوس ..بس فى هنا حاجة الماوس لما يتحرك ليه حالتين اما ان المستخدم يحرك الماوس بدون الضغط على الزر الأيسر أو انه يكون ضاغط على الزر الايسر للماوس. وطبعا فى عملية السحب والالقاء يجب ان يكون الماوس على الحالة الثانية وعشان كده عشان نعرف منه حالة الماوس هنعمل متغير من النوع Boolean عشان نتأكد ان الزر الأيسر للماوس مضغوط ..(الجزء ده هيوضح اكثر مع التطبيق).
-بعد كده هيبدأ اختبار نوع البيانات التى يحملها الكائن DataObject واختيار الشكل المناسب لسهم الماوس.
-فى النهاية اذا كان نوع البيانات مطابق للنوع المطلوب سيتم نسخ البيانات والا فسيتم الغاء الأمر.

طيب خلينا نبدأ :

أول حاجة هنعملها اننا نسند القيمة true للخاصية AllowDrop والتابعة لصندوق النص الثانى
TargetTextbox أما فى وضع التصميم .
أو عن طريق الكود والذى يتم وضعه فى الحدث load للفورم:

رمز برمجي:
TargetTextBox.AllowDrop = True
بعد كده ننشأ متغير من النوع Boolean ونسميه MouseIsDown ونسند له القيمة false
طبعا يتم التصريح عنه فى قسم التصريحات العامة:

رمز برمجي:
Dim MouseIsDown AsBoolean = False
وفى الحدث MouseDown والتابع لصندوق النص الأول SourceTextbox نضع الكود التالى

رمز برمجي:

MouseIsDown = True
وفى الحدث MouseMove والتابع لصندوق النص الأول SourceTextbox نضع الكود التالى
رمز برمجي:
'اذا كان المتغير يحمل القيمة true فهذا يعنى ان الزر الأيسر للماوس مضغوط اثناء حركة الماوس
If MouseIsDown = True Then
'استخدام الدالة DoDragDrop لحفظ البيانات فى الكائن DataObject والتى تقبل وسيطين
الأول هو البيانات المطلوب حفظها فى الكائن
والثانى يوضح اى عملية متاحة على البيانات.
SourceTextBox.DoDragDrop(SourceTextBox.Text, DragDropEffects.copy)
End If
MouseIsDown = False
فى الجزء ده هيكون تعاملنا مع الأداة الثانية TargetTextbox .

فى الحدث DragEnter والتابع لصدنوق النص الثانى TargetTextbox نضع الكود التالى:
رمز برمجي:
'اختبار البيانات الموجود فى الكائن داتا اوبجكت فإذا مانت من النوع النصى يتم اختيار شكل السهم المناسب للعملية.
رمز برمجي:
If (e.Data.GetDataPresent(DataFormats.Text)) Then
e.Effect = DragDropEffects.Copy
Else
e.Effect = DragDropEffects.None
End If


وفى الحدث DragDrop التابع لصندوق النص الثانى نضع الكود التالى:
رمز برمجي:
'وهنا نجعل النص فى صندوق النص يساوى النص الموجود بالكائن داتا اوبجكت
رمز برمجي:
TargetTextBox.Text = e.Data.GetData(DataFormats.Text)

الرجوع الى أعلى الصفحة
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى