9.2 خطوات عامة لتطوير وظائف السحب والإفلات
السحب والإفلات هي وظيفة تسهل تشغيل الكائنات التي توفرها Windows ، ويمكن تطويرها بسهولة في Delphi.
يخرج. وفقًا لعملية تشغيل السحب والإفلات ، يمكن تقسيم خطوات التطوير إلى أربع مراحل ، وهي:
● ابدأ عملية السحب
● استلام عناصر السحب
● إسقاط عنصر السحب
● توقف عن عملية جر
أثناء عملية المقدمة ، سنجمع بين Tabset (مجموعة موسومة) السحب وإسقاط مثال. يظهر تصميم الواجهة في الشكل.
عندما يسحب المستخدم علامة إلى موضع علامة أخرى في وقت التشغيل ، ستنتقل العلامة إلى هذا الموقع وتسبب
إعادة ترتيب مجموعة العلامات.
9.2.1 ابدأ السحب
عندما يتم ضبط DragMode على dmautomatic ، السحب تلقائيًا عندما يضغط المستخدم على الماوس على عنصر تحكم المصدر
ابدأ ؛ إذا كنت تريد البدء في السحب
استخدم طريقة BegindRag.
في Tabset ، نستخدم معالجة حدث Mousedown أدناه للبدء في سحب علامة.
أولاً ، حدد ما إذا كان الزر الأيسر المضغوط هو الزر الأيسر ، ثم حدد ما إذا كان العنصر قانونيًا.
الإجراء tform1.tabset1mousedown (المرسل: TOBJECT ؛ زر: TMOUSEBUTTON ؛
Shift: TshiftState ؛
var
Dragitem: عدد صحيح ؛
يبدأ
إذا كان الزر = mbleft ثم
يبدأ
dragitem: = tabSet1.ItemAtpos (point (x ، y)) ؛
if (dragitem> -1) و (dragitem <tabSet1.tabs.count) ثم
tabset1.begindrag (false) ؛
نهاية؛
نهاية؛
9.2.2 استلام العناصر التي تم سحبها
ما إذا كان يمكن تحديد عنصر تحكم عناصر السحب من خلال حدث OnDragover للتحكم. في سحب Tabset ، الشيء الرئيسي هو استخدام موضع الماوس للحكم.
الإجراء tform1.tabset1dragover (المرسل ، المصدر: tobject ؛ x ، y: integer ؛
الدولة: Tdragstate ؛
var
droppos: عدد صحيح ؛
يبدأ
إذا كان المصدر = tabSet1 ثم
يبدأ
droppos: = tabSet1.ItemAtpos (النقطة (x ، y)) ؛
قبول: = (droppos> -1) و (droppos <> tabset1.tabindex) و
(droppos <tabset1.tabs.count) ؛
نهاية؛
آخر
قبول: = خطأ ؛
نهاية؛
9.2.3 وضع عنصر السحب
عندما تقبل عوائد معالجة حدث Ondragover True ويتم إسقاط العنصر ، حدث OnDragdrop
عملية سحب وإسقاط الاستجابة. في مثيل السحب وإسقاط علامات التبويب ، هو تغيير موضع العلامة.
الإجراء tform1.tabset1dragdrop (المرسل ، المصدر: tobject ؛ x ، y: integer) ؛
var
Oldpos: عدد صحيح ؛
Newpos: عدد صحيح ؛
يبدأ
إذا كان المصدر = tabSet1 ثم
يبدأ
OldPos: = tabSet1.Tabindex ؛
newPos: = tabSet1.ItemAtpos (point (x ، y)) ؛
if (newPos> -1) و (newPos <> OldPos) ثم
tabset1.tabs.move (Oldpos ، NewPos) ؛
نهاية؛
نهاية؛
9.2.4 عملية السحب النهائية
هناك طريقتان لإنهاء عملية السحب: إما أن يقوم المستخدم بإطلاق مفتاح الماوس أو البرنامج يستخدم طريقة enddrag.
إحباط القسري. هناك عواقبان لإنهاء عملية السحب: يتم قبول الإسقاط أو تجاهل الانخفاض.
بعد الانتهاء من عملية السحب ، سيتلقى عنصر التحكم المصدر رسالة للرد على الحدث النهائي للسحب.
9.3 اسحب وإسقاط التطبيق مثال: سحب وإسقاط دعم لمدير الملفات
على الرغم من أن مثال تطبيق File Manager تم تطويره في الفصل 6 بدأ في التبلور في الوظيفة ، إلا أنه يعمل
بالمقارنة مع مدير ملفات Windows ، لا يزال هناك العديد من أوجه القصور. أكبر عيب هو أنه لا يدعم حركة السحب وإسقاط الملفات
وسحب وإسقاط نسخة. في نهاية هذا الفصل ، يمكننا تعويض هذا العيب.
تشير حركة السحب والإفلات إلى الملف عندما يسحب المستخدم ملفًا إلى دليل أسفل شجرة الدليل ويسقطه.
سوف ينتقل تلقائيًا إلى هذا الدليل ؛
عندما تضعه وإسقاطه ، سيتم نسخ الملف تلقائيًا إلى الدليل الحالي لمحرك الأقراص. مربع قائمة الملفات كعنصر تحكم المصدر و
يمكن تحديد موقع شجرة الدليل وعلامة محرك التحكم الهدف في الرياح الفرعية المختلفة. الدليل الحالي لمحرك الأقراص هو أي فرعي
أحدث عملية للنافذة ، بغض النظر عما إذا كان لهذا النافذة الفرعية علاقة مع مصدر السحب وهدف السحب.
من أجل تنفيذ الوظائف المذكورة أعلاه ، هناك مشكلتان يجب حلهما أولاً:
1. كيف لتسجيل الدليل الحالي لكل محرك؟
لهذا نحدد متغير عالمي:
var currentdirlist: Array [0 ... 25] of String [70] ؛
في حدث onchange من DirectoryOutLine:
الإجراء tfmform.directoryoutlinechange (المرسل: tobject) ؛
يبدأ
CreateCaption
filelist.clear ؛
fileList.Directory: = directoryoutline.directory ؛
filelist.update ؛
CurrentDirlist [drivetabset.tabindex]: = directoryoutline.directory ؛
filemanager.directorypanel.caption: = directoryoutline.directory ؛
نهاية؛
نظرًا لأن مجموعة القيادة تستجيب لحدث OnClick قبل الرد على حدث OnDragdrop ، ويتم تنشيطه بواسطة الحدث
أرسل حدث OnChange لـ DirectoryOutLine ، بحيث يمكن ضمان استخدامه في حدث OnDragdrop في أي وقت
عنصر مجموعة CurrentDirlist ليس سلسلة فارغة.
2. كيفية ضمان عدم أهمية الحركة والنسخ مع النوافذ الفرعية؟
هناك مشكلة رئيسية هنا هي أنه عندما نحكم على عنصر التحكم في المصدر ، فإننا نستخدم المشغل لتنفيذ فحص النوع:
إذا كان المصدر tfilelist ثم ...
إذا استخدمنا البيان التالي:
إذا كان المصدر = fileList ثم
...
بعد ذلك ، ستقتصر عمليات الحركة والنسخ على نطاق هذا النافذة الفرعية.
عندما حلنا السؤال أعلاه ، كان عملنا يتبع خطوات التطوير العامة للسحب والإفلات ، وأكملنا ذلك خطوة بخطوة.
1. يبدأ Filelist في سحب العملية
الإجراء tfmform.filelistmousedown (المرسل: tobject ؛ زر: tmousebutton ؛
Shift: TshiftState ؛
يبدأ
إذا كان الزر = mbleft ثم
مع المرسل كما يفعل tfilelistbox
يبدأ
إذا كان itemAtpos (النقطة (x ، y) ، صواب)> = 0 ثم
Begindrag (خطأ) ؛
نهاية؛
نهاية؛
يتم استخدام ItemATPOS للتحقق مما إذا كان هناك ملف حاليًا. تمر طريقة BegindRag المعلمة خاطئة ، مما يسمح لـ Filelist بالتعامل مع أحداث الماوس بشكل منفصل دون البدء في السحب. في الواقع ، هذا الوضع موجود بكميات كبيرة.
2. DIRECTORYOUTLINE و RIVETABSET تقرر ما إذا كان سيتم قبول السحب ووضعه على الفور.
الإجراء tfmform.directoryoutlinedRagover (المرسل ، المصدر: tobject ؛ x ،
y: integer ؛
يبدأ
إذا كان المصدر هو tfilelistbox ثم
قبول: = صحيح ؛
نهاية؛
الإجراء tfmform.drivetabsetDragover (المرسل ، المصدر: TOBJECT ؛ X ،
y: integer ؛
var
proppos: عدد صحيح ؛
يبدأ
إذا كان المصدر هو tfilelistbox ثم
مع قيادة القيادة
يبدأ
proppos: = itemAtpos (point (x ، y)) ؛
قبول: = (proppos> -1) و (proppos <tabs.count) ؛
نهاية؛
نهاية؛
DIRECTORYOUTLINE هو قبول غير مشروط ، في حين أن قيادة القيادة تحتاج إلى التحقق مما إذا كانت علامة قانونية.
3. اسحب وإسقاط الاستجابة
يتم استخدام DIRECTORYOUTLINE DRAR و DROP لتنفيذ وظيفة حركة الملف. استدعاء حدث تأكيد في البرنامج
أثناء عملية المعالجة ، يتم الحصول على المسار المستهدف بواسطة DirectoryOutLine.items [getItem (x ، y)]. FullPath.
الإجراء tfmform.directoryoutlinedRagdrop (المرسل ، المصدر: Tobject ؛ X ،
Y: عدد صحيح) ؛
يبدأ
إذا كان المصدر هو tfilelistbox ثم
مع DirectoryOutLine تفعل
يبدأ
ConferenceChange ('Move' ، fileList.filename ، heads [getItem (x ، y)]. FullPath) ؛
نهاية؛
نهاية؛
يتم استخدام السحب والإفلات من مجموعة القيادة لتنفيذ وظيفة نسخ الملفات. تحويل الموضع الحالي إلى برنامج التشغيل المقابل في البرنامج
خطاب المشغل ، يتم الحصول على المسار المستهدف بواسطة CurrentDirlist [drivetabset.tabindex].
الإجراء tfmform.drivetabsetDragDrop (المرسل ، المصدر: tobject ؛ x ، y: integer) ؛
var
النقابة: Tpoint ؛
يبدأ
Apoint.x: = x ؛
drivetabset.tabindex: = drivetabset.itematpos (Apoint) ؛
إذا كان المصدر هو tfilelistbox ثم
مع قيادة القيادة
يبدأ
إذا كان CurrentDirlist [tabindex] <> 'ثم
ConferenceChange ('copy' ، thefilename ، currentDirlist [tabindex]) ؛
نهاية؛
نهاية؛
4. استجابة Filelist لسحب النهايات وتحديث قائمة الملفات
الإجراء tfmform.filelistenddrag (المرسل ، الهدف: tobject ؛ x ، y: integer) ؛
يبدأ
إذا كان الهدف <> nil ثم fileList.update ؛
نهاية؛