kachwahed
06-01-2009, 08:13 AM
بسم الله الرحمن الرحيم
بسم الله والحمد لله والصلاة والسلام على رسول الله، أما بعد: السلام عليكم ورحمة الله وبركاته.
في هذا الموضوع استخدام إحدى دوال ShellApi من أجل إنشاء إيقونة بجنب الساعة (TNA) واستدعاء أحداثها (النقر بالزر الأيسر أو الأيمن أو النقر المزدوج...)، ثم إضافة قائمة من النوع TPopupMenu وكيفية تركيبها في TNA، وأخيرا طريقة إنشاء تلميحات على شكل منطادي Hint BalloonTip.
سيتم كل ذلك برمجيا في نفس الوحدة (Unit) ودون استعمال مكونات خاصة (مجانية كانت أم تجارية)، مع الشرح باللغة العربية بالتفصيل والتبسيط بأقصى ما يمكن، وفي المرفقات المثال النهائي الشامل مع الشيفرة المصدرية (كود سورس).
في البداية مقدمة سريعة (لا بد منها):
ما هي TNA ؟
TNA اختصار لعبارة Task Notification Area، أترجمها: علبة شريط المهام (بالفرنسية: L'aire de notification de la barre des tâches)، هي العلبة (أو المنطقة) التي تظهر فيها الإيقونات إلى جانب ساعة الويندوز على الجانب الأيمن من شريط المهام، تماما مثل إيقونة التحكم بالصوت لدى ويندو.
يمكنك إضافة إضافة إيقونة برنامجك الى علبة النظام ، والرد على الأحداث التي يوقعها مؤشر الماوس على إيقونة علبة شريط المهام (status area).
كيف يتم إنشاء إيقونة في علبة شريط المهام ؟
توفر دوال ShellApi دالة تجعل من العملية سهلة جدا، تدعى هذه الدالة Shell_NotifyIcon.
المعرفة كما يلي:
function Shell_NotifyIcon(dwMessage: DWORD; lpData: PNotifyIconData): BOOL;
حيث IpData مؤشر على نوع معرف كما يلي:
cbSize: DWORD;
Wnd: HWND;
uID: UINT;
uFlags: UINT;
uCallbackMessage: UINT;
hIcon: HICON;
szTip: array [0..63] of AnsiChar;
سنشرح كل عنصر بشيء من التفصيل...
تتطلب Shell_NotifyIcon اثنين من الخصائص أو المعالم (البارامترات):
المَعلم الأول (dwMessage) ويحدد الإجراءات الواجب اتخاذها.
ويأخذ قيمة (أو أكثر) من القيم التالية :
NIM_ADD : إضافة إيقونة إلى مركز المنطقة.
NIM_DELETE : حذف إيقونة من مركز المنطقة.
NIM_MODIFY : يعدل إيقونة في مركز المنطقة.
هذه القيم معرفة في الوحدة ShellApi.pas التابعة لدوال API، متوفرة في المسار:
\Program Files\Borland\Delphi7\Source\Rtl\Win
ملاحظات:
لإضافة إيقونة في علبة النظام، نستدعي Shell_NotifyIcon باستعمال NIM_ADD.
وفي أي وقت أردت تغيير الإيقونة (ومحتوياتها) يمكنك استدعاء Shell_NotifyIcon باستعمال NIM_MODIFY.
وقبل أن تنهي عمل برنامجك عليك بإزالة الإيقونة من علبة شريط المهام (أو بالأحرى تحريرها من الذاكرة) عليك باستدعاء Shell_NotifyIcon باستعمال NIM_DELETE التي تحذف الإيقونة من علبة شريط المهام.
(سيتضح ذلك أكثرالمثال التطبيقي)
المَعلم الثاني (pnid) هو مؤشر على النوع TNotifyIconData، الذي يحفظ معلومات (الخصائص) عن الأيقونات.
يتضمن النوع TNotifyIconData العناصر التالية:
cbSize : تحدد حجم بيانات NOTIFYICONDATA.
نوعها: DWORD.
hWnd : مقبض الإطار المستعمل لتلقي تنبيهات الأحداث.
نوع البيانات: HWND.
uID: رمز تعريف للأيقونة التي في علبة النظام.
نوع البيانات: UINT.
uCallBackMessage : تحديد النوع النبيه الذي يرسله إطار البرنامج المعني، والذي يستخدم لاستقبال الرسائل.
نوع البيانات: UINT.
hIcon: مقبض (Handle) للإيقونة التي ستعرض في علبة شريط المهام.
نوع البيانات: HICON.
szTip: (مبدئيا) هو نص حرفي يستخدم كتلميح على الإيقونة.
نوع البيانات: AnsiChar طولها 64 بايت.
uFlags : مجموعة من الخصائص تشير إلى ما تحويه الخصائص السابقة.
نوع البيانات: UINT.
القيم التي تأخذها: توليفة (تركيبة) من الثوابت الآتية، التي تشير إلى الخصائص المضبوطة كما يجب والتي سوف تستخدم، وتأخذ uFlags القيم التالية:
NIF_ICON: تحقق تمرير هذه الخاصية يشير إلى أن قيمة hIcon سيكون فعلا أيقونة وبالتالي ستظهر في علبة شريط المهام.
NIF_MESSAGE: النجاح في اجتياز هذه القيمة يدل على أن عنصرuCallBackMessage سيستخدم كقيمة ترسل تنبيهات الأحداث.
NIF_TIP: تنبئ هذه القيمة عن وجود عنصر szTip الذي يستخدم كتلميح (Hint) على أيقونة علبة شريط المهام.
والآن نبدأ مع الأمثلة:
المثال الأول: عرض أيقونة البرنامج في علبة شريط المهام وإضافة حدث النقر عليها (في ستة خطوات)
الخطوة الأولى: نعرف الوحدة ShellApi مع الوحدات المستعملة في قائمة uses
interface
uses
...
ShellApi;
الخطوة الثانية: نعرف متغير من النوع TNotifyIconData مع باقي متغيرات البرنامج قبل عبارة
var
Form1: TForm1;
MyTNA: TNotifyIconData;
الخطوة الثالثة: نستعمل في هذا المثال الحدث OnCreate لإضافة أيقونة علبة شريط المهام مباشرة عند تشغيل البرنامج
procedure TForm1.FormCreate(Sender: TObject);
begin
with MyTNA do
begin
cbSize := SizeOf(TNotifyIconData);//حجز حجم المكون
uID := 0;//رقم تعريفي لهذه الإيقونة، نحتاجه إذا كانت لدينا عدة أيقونات
uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;//
Wnd := Handle;//يمكن تعويضها بـ Self.Handle أو بـ Form1.Handle ويجب ذلك عند استدعائها من وحدة أخرى
uCallbackMessage := WM_APP + 1;//هذه قيمة حرة نستعملها لتلقي رسائل الأحداث
hIcon := Application.Icon.Handle;//لا بد من استعمال مقبض أيقونة البرنامج ككل، وليس مقبض الإطار
szTip := 'Delphi 4 arab';//هذا تلميح عادي يظهر على الإيقونة
end;
Shell_NotifyIcon(NIM_ADD, @MyTNA);//بهذا الإجراء نقوم بإضافة الإيقونة إلى علبة الشريط
end;
ملاحظات:
1-القيمة WM_APP + 1 التي يأخذها المتغير uCallbackMessage عادة ما تخزن في ثابت باستعمال const، وتعرف في الجزء interface مباشرة بعد تعريف الوحدات قبل type، وذلك لأنها ستستعمل أكثر من مرة.
2- في العنصر hIcon يمكن استعمال أيقونة من الرسورس عوضا عن أيقونة البرنامج، باستخدام
LoadIcon(HInstance, 'MyIcon') عوضا عن:
Application.Icon.Handle
حيث تمثل MyIcon اسم أيقونة من الرسورس.
إلى هنا تظهر الإيقونة قرب ساعة الويندوز لكنها لا تختفي عند انتهاء البرنامج لذلك نضيف الأمر الآتي:
الخطوة الرابعة: نقوم بإزالة الإيقونة من علبة شريط المهام عند انتهاء البرنامج من الحدث OnDestroy لإطار البرنامج
procedure TForm1.FormDestroy(Sender: TObject);
begin
Shell_NotifyIcon(NIM_DELETE, @MyTNA);//بهذا الإجراء نقوم بحذف الإيقونة من علبة الشريط
end;
الخطوة الخامسة: سنضيف إجراء يتلقى رسائل الأحداث من الإيقونة TNA (مثل حدث النقر، تحريك الماوس،... ) ثم نعدل عليها
نعرف في الجزء private الإجراء التالي:
private
procedure WMTaskMsg(var Msg: TMessage); message WM_APP +1;
لاحظ: القيمة WM_APP +1 هي التي أسندناها لـ uCallbackMessage نستعملها لتلقي الأحداث عبر خاصية،
أي أن إيقونة TNA تتلقى الأحداث من هذا الإجراء.
إضغط على Ctrl+Shift+C ليأخذ دلفي إلى موضع كتابة الإجراء الآتي أو أكتبه بنفسك.
الخطوة السادسة : نقوم بإخفاء بيان البرنامج من شريط المهام ثم إخفاء إطار النموذج، لتبقى فقط إيقونة TNA في علبة الشريط.
procedure TForm1.WMTaskMsg(var Msg: TMessage);
begin
if Msg.LParam = WM_LBUTTONDOWN then//إذا تلقت الأيقونة ضغط بالزر الأيسر ...
begin
ShowWindow(Application.Handle, SW_HIDE);//فسيتم إجراء منطقي (بولياني) لإخفاء البرنامج من شريط المهام
ShowWindow(Handle, SW_HIDE);//وسيتم نفس الإجراء السابق لإخفاء إطار النموذج (الفورم) من سطح المكتب
end;
if Msg.LParam = WM_RBUTTONDOWN then//إذا تلقت الأيقونة ضغط بالزر الأيمن ...
begin
ShowWindow(Application.Handle, SW_SHOW);//فسيتم نفس الإجراء السابق لإظهار البرنامج في شريط المهام
ShowWindow(Handle, SW_SHOW);//وسيتم نفس الإجراء السابق لإظهار النموذج على سطح المكتب
end;
end;
ملاحظات:
1- Msg.LParam هي المسؤولة عن تلقي الأحداث، وتتلقى الأحداث التالية:
WM_MOUSEMOVE: تحريك مؤشر الماوس
WM_LBUTTONDOWN: الضغط على زر الماوس الأيسر
WM_LBUTTONUP: تحرير زر الماوس الأيسر
WM_LBUTTONDBLCLK: نقر مزدوج بزر الماوس الأيسر
ونفس الأحداث بالنسبة لزر الماوس الأيمن (أظنها واضحة ;)):
WM_RBUTTONDOWN:
WM_RBUTTONUP:
WM_RBUTTONDBLCLK:
تنبيه: لأجل هذه الأحداث لم نستعمل else بعد if، أما case of فهي المناسبة في هذه الحالة وسنستخدمها لاحقا.
2- Msg.WParam هي المسؤولة عن التحقق من رقم uID للأيقونة التي تلقت الحدث، وبالتالي:
يمكن إضافة شرط if قبل الشرطين السابقين من أجل معرفة فيما إذا كان الحدث من الأيقونة التي أنشأناها أم أنه جاء من أيقونة أخرى، وذلك بالتحقق من رقم uID الذي أعطيناه القيمة 0 عند الإنشاء، كما يلي:
وإذا أردنا أن تتلقى الأحداث أيقونة أخرى نعطيها رقم uID مختلف عن السابق -1 مثلا- ثم نكتب if Msg.WParam = 1 وهكذا...
في مثالنا هذا لا توجد إلا أيقونة واحدة ولذلك لم ندرج شرط التحقق من uID.
الخطوة السادسة: نضيف إجراء يقوم بتلقي حدث تصغير البرنامج ثم نعدل عليه.
في الحقيقة يمكن لهذا الإجراء أن يتلقى أوامر تصغير، تكبير، إسترجاع، من أجل التعديل على أي منها، سنقتصر في هذه الخطوة على تلقي إجراء التصغير فقط.
نضيف الإجراء التالي مباشرة تحت الإجراء السابق في قسم private كالتالي:
private
procedure WMTaskMsg(var Msg: TMessage); message WM_APP +1;
procedure WMSyscommand(var msg: TWmSysCommand); message WM_SYSCOMMAND;
ثم نستخدم Ctrl+Shift+C ليأخذنا دلفي إلى موضع كتابة الإجراء الآتي كما فعلنا مع الإجراء السابق.
procedure TForm1.WMSyscommand(var msg: TWmSysCommand);
begin
if msg.CmdType and $FFF0 = SC_MINIMIZE then//إذا تلقى الحدث = تصغير البرنامج ...
begin
ShowWindow(Handle, SW_HIDE);//سيتم إجراء إخفاء النموذج من سطح المكتب
ShowWindow(Application.Handle, SW_HIDE);//وسيتم نفس الإجراء لإخفاء البرنامج من على شريط المهام
end//وإن لم يتلقى حدث تصغير البرنامج (تلقى حدث آخر)
else inherited;//فسيرث الإجراء الأصلي له (يعني إذا تلقى تكبير النموذج فسيقوم بتكبيره كما في الأصل)
end;
ملاحظات:
سنقوم لاحقا بإنشاء إجراءات (precedure) تقوم بإظهار وإخفاء النموذج، وأخرى تقوم بعرض الأيقونة...، ثم نستدعي كل منها متى اقتضت الحاجة.
إلى هنا نكون قد أنشأنا أيقونة بجانب ساعة الويندوز، بحيث يختبئ النموذج إذا نقرنا عليها بالزر الأيسر ويظهر إذا نقرنا بالزر الأيمن، وإذا قمنا بتصغير النموذج فسيختفي مباشرة في أيقونة علبة شريط المهام.
نمكل البقية إن شاء الله بعد سماع تعليقاتكم واقتراحاتكم ومرحبا بها، وفيها:
- إظهار البرنامج إما على شريط المهام وإما في أيقونة علبة شريط المهام.
- ربط الأيقونة بمكون من النوع TPopupMenu
رابط هذا المثال في المرفقات.
بسم الله والحمد لله والصلاة والسلام على رسول الله، أما بعد: السلام عليكم ورحمة الله وبركاته.
في هذا الموضوع استخدام إحدى دوال ShellApi من أجل إنشاء إيقونة بجنب الساعة (TNA) واستدعاء أحداثها (النقر بالزر الأيسر أو الأيمن أو النقر المزدوج...)، ثم إضافة قائمة من النوع TPopupMenu وكيفية تركيبها في TNA، وأخيرا طريقة إنشاء تلميحات على شكل منطادي Hint BalloonTip.
سيتم كل ذلك برمجيا في نفس الوحدة (Unit) ودون استعمال مكونات خاصة (مجانية كانت أم تجارية)، مع الشرح باللغة العربية بالتفصيل والتبسيط بأقصى ما يمكن، وفي المرفقات المثال النهائي الشامل مع الشيفرة المصدرية (كود سورس).
في البداية مقدمة سريعة (لا بد منها):
ما هي TNA ؟
TNA اختصار لعبارة Task Notification Area، أترجمها: علبة شريط المهام (بالفرنسية: L'aire de notification de la barre des tâches)، هي العلبة (أو المنطقة) التي تظهر فيها الإيقونات إلى جانب ساعة الويندوز على الجانب الأيمن من شريط المهام، تماما مثل إيقونة التحكم بالصوت لدى ويندو.
يمكنك إضافة إضافة إيقونة برنامجك الى علبة النظام ، والرد على الأحداث التي يوقعها مؤشر الماوس على إيقونة علبة شريط المهام (status area).
كيف يتم إنشاء إيقونة في علبة شريط المهام ؟
توفر دوال ShellApi دالة تجعل من العملية سهلة جدا، تدعى هذه الدالة Shell_NotifyIcon.
المعرفة كما يلي:
function Shell_NotifyIcon(dwMessage: DWORD; lpData: PNotifyIconData): BOOL;
حيث IpData مؤشر على نوع معرف كما يلي:
cbSize: DWORD;
Wnd: HWND;
uID: UINT;
uFlags: UINT;
uCallbackMessage: UINT;
hIcon: HICON;
szTip: array [0..63] of AnsiChar;
سنشرح كل عنصر بشيء من التفصيل...
تتطلب Shell_NotifyIcon اثنين من الخصائص أو المعالم (البارامترات):
المَعلم الأول (dwMessage) ويحدد الإجراءات الواجب اتخاذها.
ويأخذ قيمة (أو أكثر) من القيم التالية :
NIM_ADD : إضافة إيقونة إلى مركز المنطقة.
NIM_DELETE : حذف إيقونة من مركز المنطقة.
NIM_MODIFY : يعدل إيقونة في مركز المنطقة.
هذه القيم معرفة في الوحدة ShellApi.pas التابعة لدوال API، متوفرة في المسار:
\Program Files\Borland\Delphi7\Source\Rtl\Win
ملاحظات:
لإضافة إيقونة في علبة النظام، نستدعي Shell_NotifyIcon باستعمال NIM_ADD.
وفي أي وقت أردت تغيير الإيقونة (ومحتوياتها) يمكنك استدعاء Shell_NotifyIcon باستعمال NIM_MODIFY.
وقبل أن تنهي عمل برنامجك عليك بإزالة الإيقونة من علبة شريط المهام (أو بالأحرى تحريرها من الذاكرة) عليك باستدعاء Shell_NotifyIcon باستعمال NIM_DELETE التي تحذف الإيقونة من علبة شريط المهام.
(سيتضح ذلك أكثرالمثال التطبيقي)
المَعلم الثاني (pnid) هو مؤشر على النوع TNotifyIconData، الذي يحفظ معلومات (الخصائص) عن الأيقونات.
يتضمن النوع TNotifyIconData العناصر التالية:
cbSize : تحدد حجم بيانات NOTIFYICONDATA.
نوعها: DWORD.
hWnd : مقبض الإطار المستعمل لتلقي تنبيهات الأحداث.
نوع البيانات: HWND.
uID: رمز تعريف للأيقونة التي في علبة النظام.
نوع البيانات: UINT.
uCallBackMessage : تحديد النوع النبيه الذي يرسله إطار البرنامج المعني، والذي يستخدم لاستقبال الرسائل.
نوع البيانات: UINT.
hIcon: مقبض (Handle) للإيقونة التي ستعرض في علبة شريط المهام.
نوع البيانات: HICON.
szTip: (مبدئيا) هو نص حرفي يستخدم كتلميح على الإيقونة.
نوع البيانات: AnsiChar طولها 64 بايت.
uFlags : مجموعة من الخصائص تشير إلى ما تحويه الخصائص السابقة.
نوع البيانات: UINT.
القيم التي تأخذها: توليفة (تركيبة) من الثوابت الآتية، التي تشير إلى الخصائص المضبوطة كما يجب والتي سوف تستخدم، وتأخذ uFlags القيم التالية:
NIF_ICON: تحقق تمرير هذه الخاصية يشير إلى أن قيمة hIcon سيكون فعلا أيقونة وبالتالي ستظهر في علبة شريط المهام.
NIF_MESSAGE: النجاح في اجتياز هذه القيمة يدل على أن عنصرuCallBackMessage سيستخدم كقيمة ترسل تنبيهات الأحداث.
NIF_TIP: تنبئ هذه القيمة عن وجود عنصر szTip الذي يستخدم كتلميح (Hint) على أيقونة علبة شريط المهام.
والآن نبدأ مع الأمثلة:
المثال الأول: عرض أيقونة البرنامج في علبة شريط المهام وإضافة حدث النقر عليها (في ستة خطوات)
الخطوة الأولى: نعرف الوحدة ShellApi مع الوحدات المستعملة في قائمة uses
interface
uses
...
ShellApi;
الخطوة الثانية: نعرف متغير من النوع TNotifyIconData مع باقي متغيرات البرنامج قبل عبارة
var
Form1: TForm1;
MyTNA: TNotifyIconData;
الخطوة الثالثة: نستعمل في هذا المثال الحدث OnCreate لإضافة أيقونة علبة شريط المهام مباشرة عند تشغيل البرنامج
procedure TForm1.FormCreate(Sender: TObject);
begin
with MyTNA do
begin
cbSize := SizeOf(TNotifyIconData);//حجز حجم المكون
uID := 0;//رقم تعريفي لهذه الإيقونة، نحتاجه إذا كانت لدينا عدة أيقونات
uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;//
Wnd := Handle;//يمكن تعويضها بـ Self.Handle أو بـ Form1.Handle ويجب ذلك عند استدعائها من وحدة أخرى
uCallbackMessage := WM_APP + 1;//هذه قيمة حرة نستعملها لتلقي رسائل الأحداث
hIcon := Application.Icon.Handle;//لا بد من استعمال مقبض أيقونة البرنامج ككل، وليس مقبض الإطار
szTip := 'Delphi 4 arab';//هذا تلميح عادي يظهر على الإيقونة
end;
Shell_NotifyIcon(NIM_ADD, @MyTNA);//بهذا الإجراء نقوم بإضافة الإيقونة إلى علبة الشريط
end;
ملاحظات:
1-القيمة WM_APP + 1 التي يأخذها المتغير uCallbackMessage عادة ما تخزن في ثابت باستعمال const، وتعرف في الجزء interface مباشرة بعد تعريف الوحدات قبل type، وذلك لأنها ستستعمل أكثر من مرة.
2- في العنصر hIcon يمكن استعمال أيقونة من الرسورس عوضا عن أيقونة البرنامج، باستخدام
LoadIcon(HInstance, 'MyIcon') عوضا عن:
Application.Icon.Handle
حيث تمثل MyIcon اسم أيقونة من الرسورس.
إلى هنا تظهر الإيقونة قرب ساعة الويندوز لكنها لا تختفي عند انتهاء البرنامج لذلك نضيف الأمر الآتي:
الخطوة الرابعة: نقوم بإزالة الإيقونة من علبة شريط المهام عند انتهاء البرنامج من الحدث OnDestroy لإطار البرنامج
procedure TForm1.FormDestroy(Sender: TObject);
begin
Shell_NotifyIcon(NIM_DELETE, @MyTNA);//بهذا الإجراء نقوم بحذف الإيقونة من علبة الشريط
end;
الخطوة الخامسة: سنضيف إجراء يتلقى رسائل الأحداث من الإيقونة TNA (مثل حدث النقر، تحريك الماوس،... ) ثم نعدل عليها
نعرف في الجزء private الإجراء التالي:
private
procedure WMTaskMsg(var Msg: TMessage); message WM_APP +1;
لاحظ: القيمة WM_APP +1 هي التي أسندناها لـ uCallbackMessage نستعملها لتلقي الأحداث عبر خاصية،
أي أن إيقونة TNA تتلقى الأحداث من هذا الإجراء.
إضغط على Ctrl+Shift+C ليأخذ دلفي إلى موضع كتابة الإجراء الآتي أو أكتبه بنفسك.
الخطوة السادسة : نقوم بإخفاء بيان البرنامج من شريط المهام ثم إخفاء إطار النموذج، لتبقى فقط إيقونة TNA في علبة الشريط.
procedure TForm1.WMTaskMsg(var Msg: TMessage);
begin
if Msg.LParam = WM_LBUTTONDOWN then//إذا تلقت الأيقونة ضغط بالزر الأيسر ...
begin
ShowWindow(Application.Handle, SW_HIDE);//فسيتم إجراء منطقي (بولياني) لإخفاء البرنامج من شريط المهام
ShowWindow(Handle, SW_HIDE);//وسيتم نفس الإجراء السابق لإخفاء إطار النموذج (الفورم) من سطح المكتب
end;
if Msg.LParam = WM_RBUTTONDOWN then//إذا تلقت الأيقونة ضغط بالزر الأيمن ...
begin
ShowWindow(Application.Handle, SW_SHOW);//فسيتم نفس الإجراء السابق لإظهار البرنامج في شريط المهام
ShowWindow(Handle, SW_SHOW);//وسيتم نفس الإجراء السابق لإظهار النموذج على سطح المكتب
end;
end;
ملاحظات:
1- Msg.LParam هي المسؤولة عن تلقي الأحداث، وتتلقى الأحداث التالية:
WM_MOUSEMOVE: تحريك مؤشر الماوس
WM_LBUTTONDOWN: الضغط على زر الماوس الأيسر
WM_LBUTTONUP: تحرير زر الماوس الأيسر
WM_LBUTTONDBLCLK: نقر مزدوج بزر الماوس الأيسر
ونفس الأحداث بالنسبة لزر الماوس الأيمن (أظنها واضحة ;)):
WM_RBUTTONDOWN:
WM_RBUTTONUP:
WM_RBUTTONDBLCLK:
تنبيه: لأجل هذه الأحداث لم نستعمل else بعد if، أما case of فهي المناسبة في هذه الحالة وسنستخدمها لاحقا.
2- Msg.WParam هي المسؤولة عن التحقق من رقم uID للأيقونة التي تلقت الحدث، وبالتالي:
يمكن إضافة شرط if قبل الشرطين السابقين من أجل معرفة فيما إذا كان الحدث من الأيقونة التي أنشأناها أم أنه جاء من أيقونة أخرى، وذلك بالتحقق من رقم uID الذي أعطيناه القيمة 0 عند الإنشاء، كما يلي:
وإذا أردنا أن تتلقى الأحداث أيقونة أخرى نعطيها رقم uID مختلف عن السابق -1 مثلا- ثم نكتب if Msg.WParam = 1 وهكذا...
في مثالنا هذا لا توجد إلا أيقونة واحدة ولذلك لم ندرج شرط التحقق من uID.
الخطوة السادسة: نضيف إجراء يقوم بتلقي حدث تصغير البرنامج ثم نعدل عليه.
في الحقيقة يمكن لهذا الإجراء أن يتلقى أوامر تصغير، تكبير، إسترجاع، من أجل التعديل على أي منها، سنقتصر في هذه الخطوة على تلقي إجراء التصغير فقط.
نضيف الإجراء التالي مباشرة تحت الإجراء السابق في قسم private كالتالي:
private
procedure WMTaskMsg(var Msg: TMessage); message WM_APP +1;
procedure WMSyscommand(var msg: TWmSysCommand); message WM_SYSCOMMAND;
ثم نستخدم Ctrl+Shift+C ليأخذنا دلفي إلى موضع كتابة الإجراء الآتي كما فعلنا مع الإجراء السابق.
procedure TForm1.WMSyscommand(var msg: TWmSysCommand);
begin
if msg.CmdType and $FFF0 = SC_MINIMIZE then//إذا تلقى الحدث = تصغير البرنامج ...
begin
ShowWindow(Handle, SW_HIDE);//سيتم إجراء إخفاء النموذج من سطح المكتب
ShowWindow(Application.Handle, SW_HIDE);//وسيتم نفس الإجراء لإخفاء البرنامج من على شريط المهام
end//وإن لم يتلقى حدث تصغير البرنامج (تلقى حدث آخر)
else inherited;//فسيرث الإجراء الأصلي له (يعني إذا تلقى تكبير النموذج فسيقوم بتكبيره كما في الأصل)
end;
ملاحظات:
سنقوم لاحقا بإنشاء إجراءات (precedure) تقوم بإظهار وإخفاء النموذج، وأخرى تقوم بعرض الأيقونة...، ثم نستدعي كل منها متى اقتضت الحاجة.
إلى هنا نكون قد أنشأنا أيقونة بجانب ساعة الويندوز، بحيث يختبئ النموذج إذا نقرنا عليها بالزر الأيسر ويظهر إذا نقرنا بالزر الأيمن، وإذا قمنا بتصغير النموذج فسيختفي مباشرة في أيقونة علبة شريط المهام.
نمكل البقية إن شاء الله بعد سماع تعليقاتكم واقتراحاتكم ومرحبا بها، وفيها:
- إظهار البرنامج إما على شريط المهام وإما في أيقونة علبة شريط المهام.
- ربط الأيقونة بمكون من النوع TPopupMenu
رابط هذا المثال في المرفقات.