شرح لعملية السحب والافلات فى الفيجوال بيسك دوت نت والاحداث والخصائص الخاصه به وكيفية برمجته
عملية السحب والافلات فى الفيجوال بيسك دوت نت هى
1- الخاصية Allowdrop : من النوع Boolean وتحدد فيها اذا ماكنت تريد للأداة ان تستقبل الافلات عليها ام لا ، اود التنبيه ان هذه الخاصية قد لا تظهر في صندوق الخصائص لبعض الأدوات ، لذلك عليك اسناد القيمة لها في الحدث Load
2- الطريقة DoDragDrop : لبدء عملية السحب والإلقاء من الأداة ، وتحتوي الطريقة على وسيطتين ، الأولى من النوع Object تحدد فيها الكائن المراد إرساله في عملية السحب والإفلات ، والثانية من النوع Windows.Forms.DragDropEffects تحدد فيها شكل التأثير
بعد استدعاء الطريقة السابقة وارسال البيانات المطلوبه ، ثم افلاتها على اداة أخرى ، فاذا كانت قيمة الخاصية Allowdrop للأداة المفلت عليه مساويه لـ True يتم اطلاق احداث السحب والإفلات
احداث السحب والافلات
الحدث DragEnter : يتم إطلاقه عند دخول مؤشر الفأرة على الأداة محمل بالبيانات .
الحدث DragDrop : يتم إطلاقه عند إفلات البيانات على الأداة .
الحدث DragOver : يتم إطلاقه عند انتهاء عملية السحب والإفلات .
والأحداث مشتركة في وسائطها من النوع DragEventArgs .
الكائن DragEventArgs : يحتوي على عدة خصائص مفيدة :-
الخاصية Effect : تمثل تأثيرات السحب والإفلات .
الخاصية AllowedEffect : تعود بالتأثير المرسل من مصدر السحب .
الخواص X , Y : تحدد موقع مؤشر الفأرة .
الخاصية Data : تمثل البيانات المرسلة مع عملية السحب والإفلات ، وهو من النوع IDataObject ، ويحتوي على عدة طرق :-
أ-الطريقة GetData : تعود بالبيانات المرسلة ، مثال :-
الطريقة GetDataPresent : تعود بقيمة منطقية تمثل على نوع البيانات ، مماثلة للنوع المرسل أم لا .
If e.Data.GetDataPresent(Windows.Forms.DataFormats.Text) Then
'نص'
Else
'ليس نص'
End If
سحب والقاء النصوص
دلوقتى هنعرف ازاى ننسخ نص من textbox الى textbox آخر على نفس الفورم.
هنضيف اتنين textbox ونسمى الأول SourceTextbox والثانى TargetTextbox
الأول هو الذى سيتم نقل النص منه (سحب النص) والثانى سوف ننقل النص اليه (القاء النص).
الأحداث التى نتعرض لها فى عملية السحب والالقاء:
أولا الحدث MouseDown وده بيتنفذ لما المستخدم بيضغط على الأداة.
ثانيا الحدث MouseMove وده بيتنفذ لما الماوس بيتحرك.
ثالثا الحدث DragEnter وده بيتنفذ عندما يكون الماوس محمل بالبيانات ودخل فى الأداة الى هيلقى البيانات فيها.
رابعا DragDrop وده بيتنفذ عندما يتم افلات الماوس على الأداة.
هام : يجب ان تكون الخاصية AllowDrop التابعة للأداة المراد افلات البيانات اليها مساوية True .
هنضيف اتنين textbox ونسمى الأول SourceTextbox والثانى TargetTextbox
الأول هو الذى سيتم نقل النص منه (سحب النص) والثانى سوف ننقل النص اليه (القاء النص).
الأحداث التى نتعرض لها فى عملية السحب والالقاء:
أولا الحدث MouseDown وده بيتنفذ لما المستخدم بيضغط على الأداة.
ثانيا الحدث MouseMove وده بيتنفذ لما الماوس بيتحرك.
ثالثا الحدث DragEnter وده بيتنفذ عندما يكون الماوس محمل بالبيانات ودخل فى الأداة الى هيلقى البيانات فيها.
رابعا DragDrop وده بيتنفذ عندما يتم افلات الماوس على الأداة.
هام : يجب ان تكون الخاصية AllowDrop التابعة للأداة المراد افلات البيانات اليها مساوية True .
قبل كتابة الأكواد خلينا نشوف ايه السيناريو اللى هيحصل:
- فى الأول هيضغط المستخدم على اداة النص الأولى والتى يوجد بها النص المراد نسخه.
- هيبدأ المسخدم فى انه يتحرك بالماوس ..بس فى هنا حاجة الماوس لما يتحرك ليه حالتين اما ان المستخدم يحرك الماوس بدون الضغط على الزر الأيسر أو انه يكون ضاغط على الزر الايسر للماوس. وطبعا فى عملية السحب والالقاء يجب ان يكون الماوس على الحالة الثانية وعشان كده عشان نعرف منه حالة الماوس هنعمل متغير من النوع Boolean عشان نتأكد ان الزر الأيسر للماوس مضغوط ..(الجزء ده هيوضح اكثر مع التطبيق).
-بعد كده هيبدأ اختبار نوع البيانات التى يحملها الكائن DataObject واختيار الشكل المناسب لسهم الماوس.
-فى النهاية اذا كان نوع البيانات مطابق للنوع المطلوب سيتم نسخ البيانات والا فسيتم الغاء الأمر.
طيب خلينا نبدأ :
- فى الأول هيضغط المستخدم على اداة النص الأولى والتى يوجد بها النص المراد نسخه.
- هيبدأ المسخدم فى انه يتحرك بالماوس ..بس فى هنا حاجة الماوس لما يتحرك ليه حالتين اما ان المستخدم يحرك الماوس بدون الضغط على الزر الأيسر أو انه يكون ضاغط على الزر الايسر للماوس. وطبعا فى عملية السحب والالقاء يجب ان يكون الماوس على الحالة الثانية وعشان كده عشان نعرف منه حالة الماوس هنعمل متغير من النوع Boolean عشان نتأكد ان الزر الأيسر للماوس مضغوط ..(الجزء ده هيوضح اكثر مع التطبيق).
-بعد كده هيبدأ اختبار نوع البيانات التى يحملها الكائن DataObject واختيار الشكل المناسب لسهم الماوس.
-فى النهاية اذا كان نوع البيانات مطابق للنوع المطلوب سيتم نسخ البيانات والا فسيتم الغاء الأمر.
طيب خلينا نبدأ :
أول حاجة هنعملها اننا نسند القيمة true للخاصية AllowDrop والتابعة لصندوق النص الثانى
TargetTextbox أما فى وضع التصميم .
أو عن طريق الكود والذى يتم وضعه فى الحدث load للفورم:
طبعا يتم التصريح عنه فى قسم التصريحات العامة:
وفى الحدث MouseDown والتابع لصندوق النص الأول SourceTextbox نضع الكود التالى
'اذا كان المتغير يحمل القيمة true فهذا يعنى ان الزر الأيسر للماوس مضغوط اثناء حركة الماوس
'استخدام الدالة DoDragDrop لحفظ البيانات فى الكائن DataObject والتى تقبل وسيطين
الأول هو البيانات المطلوب حفظها فى الكائن
والثانى يوضح اى عملية متاحة على البيانات.
فى الحدث DragEnter والتابع لصدنوق النص الثانى TargetTextbox نضع الكود التالى:
'اختبار البيانات الموجود فى الكائن داتا اوبجكت فإذا مانت من النوع النصى يتم اختيار شكل السهم المناسب للعملية.
وفى الحدث DragDrop التابع لصندوق النص الثانى نضع الكود التالى:
'وهنا نجعل النص فى صندوق النص يساوى النص الموجود بالكائن داتا اوبجكت
TargetTextbox أما فى وضع التصميم .
أو عن طريق الكود والذى يتم وضعه فى الحدث load للفورم:
TargetTextBox.AllowDrop = True
بعد كده ننشأ متغير من النوع Boolean ونسميه MouseIsDown ونسند له القيمة falseطبعا يتم التصريح عنه فى قسم التصريحات العامة:
Dim MouseIsDown AsBoolean = False
MouseIsDown = True
وفى الحدث MouseMove والتابع لصندوق النص الأول SourceTextbox نضع الكود التالى'اذا كان المتغير يحمل القيمة true فهذا يعنى ان الزر الأيسر للماوس مضغوط اثناء حركة الماوس
If MouseIsDown = True Then
الأول هو البيانات المطلوب حفظها فى الكائن
والثانى يوضح اى عملية متاحة على البيانات.
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)
مفيدة جدا شكرا جزيلا
ردحذف