بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله
اليوم إن شاء الله نواصل ما بدأنا به، نبدأ بإنشاء مكون قائمة منسدلة (TPopupMenu) ونحملها على الأيقونة TNA، ثم نكتب الإجراءات اللازمة لإنشاء التلميح المنطادي TBalloonHint.
الخطوة الأولى إضافة مكون من النوع TPopupMenu:
إنطلاقا من المثال السابق: نضيف ما يلي:
من قائمة المكونات Standard نضع مكون من النوع TPopupMenu على النموذج Form1، وننشئ فيه ثلاث عناصر: عرض، إخفاء، إنهاء.
سنأتي إليه بعد قليل.
بعد أن استبدلنا الأمرين:
PHP كود :
begin
ShowWindow(Application.Handle, SW_HIDE);
ShowWindow(Handle, SW_HIDE);
end;
مباشرة بالأمر: Visible := False
و:
PHP كود :
begin
ShowWindow(Application.Handle, SW_SHOW);
ShowWindow(Handle, SW_SHOW);
end;
بالأمر: Visible := True
يصبح الإجراء TForm1.WMTaskMsg، بهذا الشكل:
PHP كود :
procedure TForm1.WMTaskMsg(var Msg: TMessage);
begin
if Msg.LParam = WM_LBUTTONDOWN then
Visible := False;
if Msg.LParam = WM_RBUTTONDOWN then
Visible := True;
end;
الآن نغير في الإجراء بحيث إذا نقرنا على الأيقونة يظهر البرنامج وإذا نقرنا عليها مرة أخرى يختفي، ونستعمل هنا case...of:
(للتنبيه فقط: case of تستعمل في حالة تعدد الشروط لنفس المتغير، فمثلا عوض أن نقول "إذا كان متغير x يساوي 1 إذا إفعل a، وإذا كان المتغير x يساوي 2 إذا إفعل b...". نقول مباشرة: "من أجل x يساوي 1: إفعل a، 2: إفعل b...).
PHP كود :
procedure TForm1.WMTaskMsg(var Msg: TMessage);
begin
case Msg.LParam of
WM_LBUTTONDOWN: Visible := not Visible;
WM_RBUTTONDOWN:;
end;
end;
يمكن تشغيل البرنامج على هذا الشكل وملاحظة النتيجة.
الآن نربط مكون TPopupMenu مع حدث النقر بالزر الأيمن WM_RBUTTONDOWN، ونستعمل لذلك متغير من النوع TPoint (أي إحداثيات (x,y)على سطح مكتب الويندوز).
نعرف هذا المتغير في هذا الإجراء (مباشرة قبل begin) كما يلي: var Pnt: TPoint
ثم نعطي هذا المتغير قيمة إحداثيي مؤشر الماوس باستعمال GetCursorPos.
وأخيرا نعرض القائمة المنسدلة PopupMenu1 في حدث النقر بالزر الأيمن باستعمال خاصية Popup(x,y)، فيصبح الإجراء كما يلي:
PHP كود :
procedure TForm1.WMTaskMsg(var Msg: TMessage);
var Pnt: TPoint;//نعرف متغير من النوع إحداثيات
begin
//نجعل هذا المتغير يأخذ قيمة إحداثيات مؤشر الماوس
GetCursorPos(Pnt);
case Msg.LParam of
WM_LBUTTONDOWN: Visible := not Visible;
//نعرض القائمة المنسدلة في موضع المؤشر عندما ينقر بالزر الأيمن
WM_RBUTTONDOWN: PopupMenu1.Popup(Pnt.X, Pnt.Y);
end;
end;
الآن عند النقر على الأيقونة بالزر الأيمن تظهر القائمة المنسدلة PopupMenu1 بالعناصر التي شكلناها سابقا (عرض، إخفاء، إنهاء).
والآن سنضيف أحداث هذه العناصر (كل عنصر كلمة واحدة فقط !!!؟) كما التالي:
PHP كود :
procedure TForm1.N1Click(Sender: TObject);
begin
//للعرض:
Show
end;
//للإخفاء:
procedure TForm1.N2Click(Sender: TObject);
begin
Hide
end;
//للانهاء:
procedure TForm1.N4Click(Sender: TObject);
begin
Close
end;
وانتهينا...
الخطوة الثانية: إضافة التمليح المنطادي BalloonHint
(هذه الخطوة تتطلب شيئا من التركيز)
أولا: لا بد من التنبيه كما أشرنا أن المكون BalloonHint هو إحدى المكونات الحديثة لويندوز xp (وكذلك ويندوز 2000 NT، وويندوز Me) أي أنها لا تعمل في نظام ويندوز 98، وكذلك لا بد من توفر Internet Explorer بإصدار 5.0 على الأقل.
ثانيا: لن نستعمل النوع TNotifyIconData لأنه لا يحتوي على مكون BallonHint بل سننشئ بأنفسنا نوع جديد سنسميه: TNewNotifyIconData ثم نضيف إليه التمليح المنطادي.
بدايةً نعرف في الحقل Interface بعد تعريف الأنواع type، التسجيل TTimeoutVersion الذي يخزن مدة ظهور التمليح (سنشرح ذلك لاحقا)، مباشرة بعده نعرف النوع الجديد TNewNotifyIconData له نفس معالم (البارامترات) النوع السابق TNotifyIconData، إضافة إلى ستة أخرى جديدة (وهي التي تتطلب الإصدار 5.0 لـ IE) هي كالآتي:
كود :
dwState: DWORD;
dwStateMask: DWORD;
szInfo: array [0..255] of Char;
TTimeoutVersion: TTimeoutVersion;
szInfoTitle: array [0..63] of Char;
dwInfoFlags: DWORD;
نشرح أهم الخصائص:
szInfo: متغير حرفي لتخزين رسالة لا تفوق 256 حرف للنص الذي سيظهر في التمليح.
TTimeoutVersion: هذا متغير من نوع تسجيل (record) الذي عرفناه من قبل ويحفظ إصدار التلميح، ومدة ظهور التمليح حسب الويندوز xp لا تقل عن 10 ثوان ولا تزيد عن 60 ثانية.
szInfoTitle: عنوان التمليح وحجمه 64 حرف.
dwInfoFlags: رمز التمليح (الأيقونة المستعملة (أو الشكل) في التلميح)، ويتخذ عدة أنواع (مثل أشكال MessageDlg).
في النهاية يظهر تعريف النوع كما يلي:
كود :
interface
...
type
TForm1 = class(TForm)
...
end;
TTimeoutVersion = record
case Integer of
0: (uTimeout: UINT);//إصدارات أقدم من ويندوز 2000
1: (uVersion: UINT);//إصدار ويندوز 2000 فما فوق
end;
TNewNotifyIconData = record
cbSize: DWORD;
Wnd: HWND;
uID: UINT;
uFlags: UINT;
uCallbackMessage: UINT;
hIcon: HICON;
szTip: array [0..127] of Char;
dwState: DWORD;
dwStateMask: DWORD;
szInfo: array [0..255] of Char;
TTimeoutVersion: TTimeoutVersion;
szInfoTitle: array [0..63] of Char;
dwInfoFlags: DWORD;
end;
var
//ولا ننسى أن نعرف أيقونتنا من هذا النوع الجديد (طبعا نحذف تعريف النوع القديم):
Form1: TForm1;
MyTNA: TNewNotifyIconData;
والآن لم يبق لنا سوى كتابة الإجراء الذي يعرض التلميح المنطادي، نبدأ بتعريف الإجراء في الحقل
PHP كود :
Private:
procedure ShowBalloonTips(TipInfo, TipTitle: string);
ثم نضغط على Ctrl+Alt+C ونكتب أوامر الإجراء على النحو التالي:
(يتلقى هذا الإجراء قيمتين نصيتين تمثلان عنوان التلميح ومضمونه)
PHP كود :
procedure TForm1.ShowBalloonTips(TipInfo, TipTitle: string);
begin
with MyTNA do begin//إنشاء أيقونة
cbSize := SizeOf(MyTNA);//حجز حجم الأيقونة
uFlags := $10;//تعني كل الأحداث NIF_MESSAGE + NIF_ICON + NIF_TIP
StrPLCopy(szInfo, TipInfo, SizeOf(szInfo) - 1);//كتابة نص التلميح
MyTNA.TTimeoutVersion.uTimeout := 1000;//المدة أكتب أي قيمة فلن يؤثر ذلك، لأن الويندوز من يتحكم بوقتها
strPLCopy(szInfoTitle, TipTitle, SizeOf(szInfoTitle) - 1);//كتابة عنوان التلميح
dwInfoFlags := $00000001; //الشكل الذي سيأخذه التلميح شكل إعلام
end;
Shell_NotifyIcon(NIM_MODIFY, @MyTNA);//دالة تغيير الإيقونة إلى أيقونة ذات تلميح منطادي
end;
ملاحظات:
1- كتبنا هنا إجراء يقوم يتلقى نص رسالة التلميح وعنونها المكتوب فيها، ويعيد تغيير الأيقونة إلى أيقونة تحمل تليمح منطادي BalloonHint.
2- فيما يخص المتغير dwInfoFlags يمكنه أن يأخذ عدة قيم (مثل قيم mtWarning, mtError, mtInformation للرسائل MessageDlg) يمكن تخزينها في ثوابت معلن عنها مسبقا بحيث:
كود :
NIIF_INFO = $00000001; //تلميح إعلام
NIIF_WARNING = $00000002;//تلميح إنذار
NIIF_ERROR = $00000003;//تلميح خطأ
3- أما TTimeoutVersion يمكن إهماله تماما لأن قيمته يحددها الويندوز تلقائيا.
الخطوة الثالثة: نضع زر TButton ونكتب في حدث النقر عليه:
PHP كود :
procedure TForm1.BtnShowHintClick(Sender: TObject);
begin
ShowBalloonTips('محتوى التلميح', عنوان التلميح');
end;
الخطوة الرابعة: التحكم في الأحداث التي يتلقاها التلميح
نريد أن نجعل البرنامج يعرض رسالة (ShowMessage) عند عرض التلميح، ورسالة أخرى عند النقر عليه ورسالة ثالثة عند انتهاء مدة التلميح.
نضيف إلى الإجراء الذي يتلقى الأحداث (الذي عرفناه سابقا) الأحداث التالية: ظهور التلميح، اختفاء التلميح، النقر على التلميح، كما يلي:
PHP كود :
procedure TForm1.WMTaskMsg(var Msg: TMessage);
var Pnt: TPoint;
begin
GetCursorPos(Pnt);
case Msg.LParam of
WM_LBUTTONDOWN: Visible := not Visible;
WM_RBUTTONDOWN: PopupMenu1.Popup(Pnt.X, Pnt.Y);
WM_USER + 2: ShowMessage('ظهور التلميح');//تحدث عندما يظهر التلميح
WM_USER + 3: ShowMessage('اختفاء التلميح');//تحدث أيضا عند اختفاء الأيقونة لأن التلميح يختفي معها
WM_USER + 4: ShowMessage('انتهاء مدة التلميح');//تحدث عندما يرسل الويندوز حدث انتهاء مدة التلميح
WM_USER + 5: ShowMessage('النقر على التلميح');//تحدث عندما ينقر المستخدم على التلميح
end;
end;
ملاحظات:
1- WM_USER + i هي قيم معرفة لدى الدلفي في الوحدة Messages.pas.
2- عند النقر على الزر الذي يغلق التلميح (في أعلى يمين التلميح) يرسل الويندوز حدث انتهاء مدة التلميح WM_USER + 4 تذكر ذلك.
3- يمكن تخزين القيم WM_USER + i في ثوابت (باستعمال const) باستعمال أسماء مناسبة تدل عليها، مثل:
PHP كود :
const
BALLOONSHOW = WM_USER + 2;
BALLOONHIDE = WM_USER + 3;
BALLOONTIMEOUT = WM_USER + 4;
BALLOONUSERCLICK = WM_USER + 5;
جرب الآن تشغيل البرنامج وانظر للنتيجة.
إلى هنا نكون قد أنشأنا برنامج يعرض أيقونة بقائمة منسدلة يمكنها تلقي أحداث المستعمل، وتعرض تلميح منطادي يتلقى هو الآخر أحداث المستعمل ويرد عليها.
وللحديث بقية سنأتي عليها إن شاء الله...