يعتقد الكثير من الناس أن دلفي هي أداة RAD، بما في ذلك أنا، الذي كنت متحيزًا ضد دلفي عندما كنت في المدرسة. والآن بعد أن خرجت من "البرج العاجي"، فقد غطت نطاقًا أوسع من المجالات وواجهت المزيد من المشكلات، و لقد اكتسبت تدريجيا وجهة نظري الخاصة. في الواقع، دلفي هي أداة تطوير تعتمد على لغة Object Pascal، مما يعني أن دلفي هي في الأساس أداة لغة وهي حقًا موجهة للكائنات. المثال الذي سأقدمه أدناه هو برنامج صغير تم تنفيذه في دلفي. البرنامج قصير وموجز، مع سياق واضح وسوف أشرح الأجزاء الرئيسية بالتفصيل. تمامًا مثل قيام السيد Hou Junjie بتقشير MFC طبقة تلو الأخرى، يجب علي اليوم أيضًا "طهي الثور".
في دلفي، عندما يتعلق الأمر ببرمجة النظام، يجب استدعاء وظائف API بدون استثناء. هناك نماذج أولية لوظائف API التي سيتم استخدامها في وحدة ShellAPI.pas.
تمارين عملية:
واحد. إنشاء تطبيق جديد: ملف->تطبيق جديد حدد ثابت الرسالة في قسم الواجهة: const WM_NID=WM_USER+1000; ينص النظام على تخصيص الرسائل للمستخدمين بدءًا من WM_USER.
اثنين. تحديد متغير عام: NotifyIcon:TNotifyIconData هو متغير مهم للغاية. البرنامج بأكمله يدور حول هذا المتغير. TNotifyIconData هو نوع سجل. اضغط باستمرار على المفتاح Ctrl وانقر نقرًا مزدوجًا فوق TNotifyIconData للدخول إلى وحدة ShellAPI.pas. (ملاحظة: في دلفي، هذه طريقة جيدة جدًا لتحليل كود المصدر. الكود المصدري يتحدث عن نفسه. إذا كنت تريد معرفة القصة الداخلية وراء البرنامج، فإن أفضل طريقة هي تحليل كود المصدر!) في هذا الوقت، يظهر ما يلي بيان الواجب:
TNotifyIconData = TNotifyIconDataA، هذا المعنى واضح جدًا، أي أن TNotifyIconData وTNotifyIconDataA هما نفس نوع البيانات، ثم انظر إلى الأسفل:
TNotifyIconDataA = _NOTIFYICONDATAA، المعنى هو نفسه كما كان من قبل، انظر إلى الأسفل:
يكتب
_NOTIFYICONDATAA = السجل
cbSize: DWord؛
وند: هوند؛
uID: UINT؛
uFlags: UINT؛
uCallbackMessage: UINT;
هيكون: هيكون؛
szTip: صفيف [0..63] من AnsiChar؛
نهاية؛
هذا حقًا "يخرج بعد أن تم استدعاؤه لفترة طويلة، لكنه لا يزال يحمل البيبا نصف يخفي الوجه." الآن أصبح الجميع واضحين للغاية. إن المتغير العام NotifyIcon الذي حددناه للتو هو في الواقع متغير نوع سجل يحتوي على 7 مكونات، وهو ما يعادل متغير البنية في C/C++ (يجب أن يكون مبرمجو C/C++ على دراية به). دعونا نشرح وظائف كل جزء من الأجزاء السبعة لنوع السجل واحدًا تلو الآخر.
1> cbSize هو حجم متغير NotifyIcon الذي حددته، والذي يمكن الحصول عليه باستخدام SizeOf(TNotifyIconData). إذا كنت مبرمجًا ماهرًا في C/C++، فيجب أن تكون على دراية به. في C/C++، عندما تريد تخصيص ذاكرة لمتغير بنية، يجب عليك استخدام SizeOf (نوع الهيكل) لمعرفة مقدار الذاكرة المطلوبة لتخزين متغير البنية هذا.
2> Wnd هو المقبض. ما هو النموذج الذي تريد أن تتعامل معه الرسائل التي تم إنشاؤها بواسطة برنامج الدرج؟ فقط دع Wnd يشير إلى هذا النموذج.
على سبيل المثال: عندما تريد النقر على أيقونة الدرج الصغيرة على شريط المهام لتبديل النموذج بين "إظهار" و"إخفاء"، أشر إلى النموذج الرئيسي.
3> uID: إذا كنت تريد إنشاء تطبيقات صينية متعددة، فكيف يمكنك التمييز بينها؟ ويتميز برقم الهوية هذا.
3> uFlags عبارة عن بتة إشارة تشير إلى خصائص برنامج الدرج الذي تم إنشاؤه حاليًا:
يشير NIF_ICON إلى أن الرمز المعين حاليًا (أي قيمة hIcon) صالح
يشير NIF_MESSAGE إلى أن رسالة النظام المحددة حاليًا (أي قيمة uCallBackMessage) صالحة
يشير NIF_TIP إلى أن شريط التلميحات المعين حاليًا (أي قيمة szTip) صالح.
4> uCallBackMessage هذا هو الجزء الأكثر أهمية من بين الأجزاء السبعة. حدد رسالة رد اتصال هنا، أي حدد اسم الرسالة هنا. عند النقر فوق رمز الدرج أو النقر بزر الماوس الأيمن فوقه، سيتم إرسال اسم الرسالة المحدد في uCallBackMessage إلى النموذج المشار إليه بواسطة Wnd، ثم تقوم بتعريف رسالة رد اتصال. وظيفة إرسال الرسالة في البرنامج لمعالجة هذه الرسالة. بهذه الطريقة، تتم معالجة المجموعة الكاملة من الرسائل المتعلقة بنظام Windows.
6> hIcon هو مقبض أيقونة الدرج، وبناءً على هذا المقبض، يمكنك إضافة الرموز وتعديلها وحذفها.
7> szTip هي الرسالة السريعة التي تظهر عند وضع الماوس على الأيقونة الصغيرة في علبة شريط المهام.
لقد أمضيت الكثير من الوقت في تقديم القصة الداخلية لـ TNotifyIconData، وبمجرد توضيح هذا الجزء، سيتم تنفيذ الباقي.
ثلاثة. انقر نقرًا مزدوجًا فوق النموذج الرئيسي لإدخال منطقة التعليمات البرمجية الخاصة بـ FormCreate:
TForm1.FormCreate(Sender:TObject);
يبدأ
// NotifyIcon هو متغير عام وقد تم تعريفه في بداية البرنامج
مع NotifyIcon القيام به
يبدأ
cbSize:=SizeOf(TNotifyIconData);
Wnd:=Handle; // مقبض يشير إلى النموذج الحالي Form1
uID:=1;
uFlags:=NIM_ICON أو NIM_MESSAGE أو NIM_TIP؛
uCallBackMessage:=WM_NID;
hIcon:=application.Icon.Handle;
szTip:="الشاب الشرير من عائلة تشانغ";
نهاية؛.
// أضف متغير المجموعة NotifyIcon إلى النظام للمعالجة
Shell_NotifyIcon(NIM_ADD,@NotifyIcon);
نهاية؛
أربعة. الخطوة التالية هي تحديد وظيفة معالجة الرسائل: عندما يرسل النظام رسالة إلى النموذج، تتم معالجتها بواسطة الوظيفة التالية. تقوم كل وظيفة معالجة رسائل بمعالجة نوع معين من الرسائل، يرجى إلقاء نظرة فاحصة على الفرق بين تعريف نص الوظيفة أدناه وتعريف الوظيفة العامة: يجب أن تضيف وظيفة معالجة الرسائل اسم الرسالة في النهاية، بحيث عندما يرسل النظام عندما تأتي رسالة WM_NID، يتم تشغيل وظيفة معالجة الرسائل WMNID تلقائيًا.
PROcedure WMNID(var msg:TMessage);message WM_NID;
يبدأ
حالة msg.Lparam
WM_LBUTTONup; Form1.Visible:=not Form1.Visible;
WM_RBUTTONUP: ShowMessage('لقد نقرت على الزر الأيمن');
نهاية؛
نهاية؛
حسنًا، لقد وُلد أبسط برنامج، حيث يمكن للجميع تعيين الأيقونة التي يريدونها.
المشروع->الخيارات، حدد صفحة التطبيق، وقم بتحميل الرمز المفضل لديك في عنصر الرمز، بحيث يتم عرض الرمز المفضل لديك في شريط المهام عند تشغيل البرنامج. عند النقر فوق الرمز، سيتحول النموذج Form1 بين مرئي وغير مرئي، أي انقر لعرضه ثم انقر مرة أخرى لإخفائه. عند النقر بزر الماوس الأيمن فوق الرمز، تظهر رسالة: "لقد قمت بالنقر فوق الزر الأيمن".
خمسة. وأخيرًا، تذكر تحرير برنامج الدرج الذي تم إنشاؤه عند إغلاق التطبيق، وإلا فإنه سيشغل موارد النظام.
TForm1.FormDestroy(Sender:TObject);
يبدأ
Shell_NotifyIcon(NIM_DELETE,@NotifyIcon);
نهاية؛
لقد مر ما يقرب من نصف عام منذ تخرجي، وما زلت لا أستطيع فهم أشياء كثيرة في المدرسة وفهمي ليس عميقًا بما فيه الكفاية عندما يكون لدي تجربة، أرغب دائمًا في كتابتها بالكلمات لتلخيص ما تعلمته ثانيًا، دعونا نتواصل مع الجميع.
البريد الإلكتروني: [email protected] السؤال: 8133413 الولد الشرير لعائلة تشانغ