سلام
( اعدروني لأني أعاني مشاكل كبيرة في الاتصال بالانترنت )
لم أجد المعنى العربي ل Try Icon , لكن هو رمز صغير يظهر بجانب الساعة في نضام الوندوز .
لكي تجعل برنامج يملك واحد ,
أولا أضف إلى قائمة uses المكتبة ShellAPI .
عرف المتغير
كمتغير خارجي IconData
[l] var Form1: TForm1; IconData: TNOTIFYICONDATA; [/l]
ألان تحاج في الأساس إلى الأوامر التالية فقط لكي تظهره
[l] procedure TForm1.Button2Click(Sender: TObject); begin IconData.cbSize := SizeOf(TNOTIFYICONDATA); IconData.uFlags := NIF_ICON+NIF_TIP; IconData.hIcon := Application.Icon.Handle; Shell_NotifyIcon(NIM_ADD,@IconData); end; [/l]
الشرح
الأمر الأول يحدد حجم Icon
IconData.cbSize := SizeOf(TNOTIFYICONDATA);
الأمر الثاني يحدد نوع Icon
IconData.uFlags := NIF_ICON+NIF_TIP;
الأمر الثالث يحدد الصورة Icon,
IconData.hIcon := Application.Icon.Handle;
وقد استخدمت Icon الخاص بالبرنامج نفسه ( حيت يمكن تعديلها من قائمة
Project->Options->Application ->LoadIcon )
الأمر الأخير هو أمر إظهار Icon
Shell_NotifyIcon(NIM_ADD,@IconData);
وبإمكانك استخدام الأمر التالي لإخفاء Icon
[l] Shell_NotifyIcon(NIM_DELETE,@IconData); [/l]
نفد البرنامج , ستلاحظ ظهور Try Icon بجانب الساعة و له نفس Icon برنامجك .
___________________________________________
بعد تنفيذ البرنامج وظهور Icon حرك الماوس باتجاهها , تلاحظ أنه بمجرد وصول الماوس عليها فأنها تختفي . السبب لأنها فقدت Handel
لحل هده المشكلة ( وهي اختفاء Icon عند وصول الماوس لها )
ضع الأمر التالي
[l] IconData.wnd := AllocateHWnd(WndProc); [/l]
WinProc مصطلح يختلف تعريفه بين عنصر و أخر ,
وفي مثالنا هدا استخدما WinProc الخاص بالنافدة Form
حيت يعرف Winproc انه يشير إلى إجراء النّافذة window procedure الذي يردّ على الرّسائل التي أرسلت إلى التحكّم Control.
الآن لنكتب الخطوات بعد التعديل كاملة :
[l] procedure TForm1.Button2Click(Sender: TObject); begin IconData.cbSize := SizeOf(TNOTIFYICONDATA); IconData.wnd := AllocateHWnd(WndProc); IconData.uFlags := NIF_ICON+NIF_TIP; IconData.hIcon := Application.Icon.Handle; Shell_NotifyIcon(NIM_ADD,@IconData); end; [/l]
___________________________________________
سوف نجري بعض التحسينات ,
لو أردنا ظهور عبارة arabteam200 عندما يكون الماوس موجود فوق Icon
أضف العبارة التالية إلى الخطوات السابقة ,
[l] StrPCopy(IconData.szTip,'arabteam200'); [/l]
الآن لنكتب الخطوات كاملة بعد التعديل
[l] IconData.cbSize := SizeOf(TNOTIFYICONDATA); IconData.wnd := AllocateHWnd(WndProc); StrPCopy(IconData.szTip,'arabteam200'); IconData.uFlags := NIF_ICON+NIF_TIP; IconData.hIcon := Application.Icon.Handle; Shell_NotifyIcon(NIM_ADD,@IconData); [/l]
___________________________________________
ما رأيك بمزيد من الإضافات
طبعا نحن وضعنا Try Icon لكي نستفيد منه في شي , أهم هده الفوائد هو إمكانية ظهور القوائم السريعة PopupMenu عند الضغط على زر الماوس الأيمن مثلا .
أولا ضع PopupMenu على الفورم , و أضف إليه مجموع عناصر ,
في الخطوات التالية ستلاحظ ظهور مصطلح جديد وهو Message , حيت أن الوندوز يتعامل مع البرامج باستخدام Message حيت يقوم دائما بإنتاج Message وإرسالها إلى البرامج , أيضا البرامج تتبادل Message فيما بينها , مثلا عندما تضغط بالماوس على برنامج معين فأن الوندوز يرسل رسالة إلى هدا البرنامج بذلك ,
المهم ,
1- او تعديل سنقوم به هو إضافة خاصية جديدة لنوع Icon وهي NIF_MESSAGE فتصبح
[l] IconData.uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP; [/l]
حتى يستطيع هدا Icon التعامل مع الرسائل Message .
2- تحديد رقم الرسالة الراجعة CallbackMessage كالتالي
[l] IconData.uCallbackMessage := WM_USER+1; [/l]
حيت يتم تحديد رقم معين لحدت التعامل مع Icon , فهناك عدة احدات أخرى و لها أرقام خاصة ,
3- سوف تحتاج إلى برمجة الدالة WinProc كالتالي :
[l] procedure TForm1.WndProc(Var Msg : TMessage); begin if (Msg.Msg = WM_USER+1) then begin case Msg.lParam of WM_RBUTTONUP : PopupMenu1.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y); end; end else DefWindowProc(IconData.wnd, Msg.Msg, Msg.wParam, Msg.lParam); end; [/l]
لاحظ المقارنة
if (Msg.Msg = WM_USER+1) then
هو نفس رقم الرسالة التي أعطيناها في الخطوة 2
IconData.uCallbackMessage := WM_USER+1;
ألان لنكتب الخطوات كاملة بعد التعديل
خطوات تكوين Icon
[l] IconData.cbSize := SizeOf(TNOTIFYICONDATA); IconData.wnd := AllocateHWnd(WndProc); IconData.uID := 0; IconData.uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP; IconData.hIcon := Application.Icon.Handle; StrPCopy(IconData.szTip,'HI'); IconData.uCallbackMessage := WM_USER+1; Shell_NotifyIcon(NIM_ADD,@IconData); [/l]
الدالة Winproc
[l] procedure TForm1.WndProc(Var Msg : TMessage); begin if (Msg.Msg = WM_USER+1) then begin case Msg.lParam of WM_RBUTTONUP : PopupMenu1.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y); end; end else DefWindowProc(IconData.wnd, Msg.Msg, Msg.wParam, Msg.lParam); end; [/l]
___________________________________________
ملاحظة أخيرة وهي أن أفضل مكان لوضع خطوات التكوين هو FormShow
أيضا من الأفضل وضع أمر إلغاء Icon عند إغلاق البرنامج
[l] procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin Shell_NotifyIcon(NIM_DELETE,@IconData); end; [/l]
أرجو أن أكون ما قصرت , و الله أعلم
وشكرا
مــــMADIــــدي