الاثنين، 12 يونيو 2017

شرح احداث السحب والافلات فى vb.net

شرح لعملية السحب والافلات فى الفيجوال بيسك دوت نت والاحداث والخصائص الخاصه به وكيفية برمجته


عملية السحب والافلات فى الفيجوال بيسك دوت نت هى 

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 .

قبل كتابة الأكواد خلينا نشوف ايه السيناريو اللى هيحصل:
- فى الأول هيضغط المستخدم على اداة النص الأولى والتى يوجد بها النص المراد نسخه.
- هيبدأ المسخدم فى انه يتحرك بالماوس ..بس فى هنا حاجة الماوس لما يتحرك ليه حالتين اما ان المستخدم يحرك الماوس بدون الضغط على الزر الأيسر أو انه يكون ضاغط على الزر الايسر للماوس. وطبعا فى عملية السحب والالقاء يجب ان يكون الماوس على الحالة الثانية وعشان كده عشان نعرف منه حالة الماوس هنعمل متغير من النوع 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)



هناك تعليق واحد:

جميع الحقوق محفوظة © 2019 الحقيبة البرمجية لمبرمجى VB.NET