السلام عليكم و رحمة الله تعالى و بركاته
إخواني الكرام
ممكن شرح وظيفة MessageBox
و كيفية توظيفه
و الفرق بينه و بين
;MessageDLG
و
ShowMesage
وشكرًا ، وفقكم الله .
السلام عليكم و رحمة الله تعالى و بركاته
إخواني الكرام
ممكن شرح وظيفة MessageBox
و كيفية توظيفه
و الفرق بينه و بين
;MessageDLG
و
ShowMesage
وشكرًا ، وفقكم الله .
السلام عليكم...
الوظيفة ShowMessage فقط تعرض رسالة بسيطة مع زر OK. و هي في الواقع إجراء و ليست دالة، و بالتالي فهي لا تعيد قيمة لأنه أصلاً ليس لها أزرار ليختار مها المستخدم. فقط الزر OK لإغلاق الرسالة. اتجاه الرسالة (من اليسار إلى اليمين أو من اليمين إلى اليسار) يتبع الخاصية BiDiMode للتطبيق (Application) نفسه.
الوظيفة MessageDlg تستعمل لعرض رسالة و الحصول على ما يختاره المستخدم (أي معرفة الزر الذي تم النقر عليه). و بالتالي فأنها توفر إمكانية عرض أكثر من زر على الرسالة ليختار منها المستخدم، مثلاً: Yes - No أو Yes - No - Cancel أو Retry - Cancel ... إلخ. مع وجود رمز للرسالة حسب نوعها (Information أو Error أو Warning أو Confirmation). عيوب هذه الوظيفة هي:
1. لا يوجد لها بارامتر لتحديد عنوان الرسالة.
2. الرمز دائماً ناحية اليسار و الأزرار مرتبة من اليسار إلى اليمين حتى لو كانت Application.BiDiMode مضبوطة على bdRightToLeft
3. عناوين الأزرار دائماً بالإنجليزية.
أما الدالة MessageBox (التابعة للنظام Windows) أو الوظيفة MessageBox (التابعة للكائن Application) فهي وظيفة متكاملة من جميع النواحي (لا فرق بين دالة Windows و وظيفة الـ Application إلا أن دالة Windows تحتاج إلى تمرير مقبض نافذة Window Handle كأول بارامتر).
الصيغة العامة:
function MessageBox(const Text: PChar; const Caption: PChar; Flags: Longint = MB_OK): Integer;
حيث:
Text: نص الرسالة.
Caption: عنوان الرسالة.
Flags: خيارات الرسالة، و التي تحدد: عدد و نوع الأزرار، رمز الرسالة، اتجاه الرسالة (Right-to-Left أو Left-to-Right)، الزر الافتراضي (الذي يظهر محدداً بشكل مبدئي عند عرض الرسالة).
لتحديد مجموعة من الخيارات نربط بين القيم بالعامل or.
قيم البارامتر Flags تشمل:
أ. الأزرار:
MB_OK: زر واحد: موافق
MB_OKCANCEL: زران: موافق - إلغاء الأمر
MB_ABORTRETRYIGNORE: ثلاثة أزرار: إحباط - إعادة المحاولة - تجاهل
MB_YESNOCANCEL: ثلاثة أزرار: نعم - لا - إلغاء الأمر
MB_YESNO: زران: نعم - لا
MB_RETRYCANCEL: زران: إعادة المحاولة - إلغاء الأمر
(عناوين الأزرار تتبع لغة واجهة النظام Windows، مثلاً إذا كانت واجهة Windows إنجليزية فإن الأزرار تكون OK و Cancel ... إلخ. أما إذا كان Windows عربياً فإن الأزرار تكون موافق و إلغاء الأمر... إلخ)
ب. رمز الرسالة:
MB_ICONSTOP = MB_ICONHAND = MB_ICONERROR
MB_ICONQUESTION
MB_ICONEXCLAMATION = MB_ICONWARNING
MB_ICONINFORMATION = MB_ICONASTERISK
ج. اتجاه الرسالة:
MB_RIGHT: محاذاة نص الرسالة إلى اليمين.
MB_RTLREADING: اتجاه قراءة النص من اليمين إلى اليسار، الرمز إلى اليمين، ترتيب الأزرار من اليمين إلى اليسار (رسالة عربية).
د. الزر الافتراضيي:
MB_DEFBUTTON1: الزر الأول محدد بشكل افتراضي.
MB_DEFBUTTON2: الزر الثاني محدد بشكل افتراضي.
MB_DEFBUTTON3: الزر الثالث محدد بشكل افتراضي.
MB_DEFBUTTON4: الزر الرابع محدد بشكل افتراضي.
*** القيم التي تعيدها الدالة:
IDOK: تم النقر على الزر موافق
IDCANCEL: تم النقر على الزر إلغاء الأمر
IDABORT: تم النقر على الزر إحباط
IDRETRY: تم النقر على الزر إعادة المحاولة
IDIGNORE: تم النقر على الزر تجاهل
IDYES: تم النقر على الزر نعم
IDNO: تم النقر على الزر لا
* أمثلة:
1. المثال التالي يعرض رسالة بـ 3 أزرار (نعم - لا - إلغاء الأمر) (أو Yes - No - Cancel) مع رمز السؤال (هلامة الاستفهام) كرمز للرسالة:
procedure TForm1.Button1Click(Sender: TObject);
var
AResult: Integer;
begin
AResult := Application.MessageBox('Please select you answer.', 'Try it!', MB_ICONQUESTION or MB_YESNOCANCEL);
case AResult of
IDYES: ShowMessage('You selected "YES"');
IDNO: ShowMessage('You selected "NO"');
IDCANCEL: ShowMessage('You selected "CANCEL"');
end;
end;2. المثال التالي يعرض رسالة معربة (من اليمين إلى اليسار) لتأكيد حذف ملف مع رمز التحذير (علامة تعجب)، و زرين هما نعم و لا (أو Yes و No) مع تحديد الزر الثاني (لا أو No) كزر افتراضي:
procedure TForm1.Button1Click(Sender: TObject);
begin
if Application.MessageBox('هل تريد بالتأكيد حذف الملف؟',
'تأكيد حذف',
MB_ICONEXCLAMATION // رمز الرسالة
or MB_YESNO // زران: نعم - لا
or MB_DEFBUTTON2 // الزر الثاني افتراضي
or MB_RIGHT or MB_RTLREADING // تعريب الرسالة
) = IDYES then begin
// إجراءات الحذف
end;
end;** لاحظ أن عنوان الرسالة و نص الرسالة من النوع PChar و ليس String و هذا قد يحتاج إلى عمليات تحويل (Type casting) كثيرة خاصة إذا كان جزء من نص الرسالة سنأخذه من مكون مثل Label أو Edit ... إلخ. و لتجنب ذلك - بالإضافة إلى تعريب الرسالة بحيث لا نحتاج دائماً إلى استعمال القيمتين MB_RIGHT و MB_RTLREADING فإنه قد يكون من المستحسن تعريف دالة عامة لاستدعاء الوظيفة MessageBox، و يمكن أن تكون كالتالي:
interface
// ...
// ...
function MsgBox(AText: string; ACaption: string = ''; AFlags: Integer = MB_OK; ARightToLeft: Boolean = True);
// ...
implementation
// ...
function MsgBox(AText: string; ACaption: string; AFlags: Integer; ARightToLeft: Boolean): Integer;
var
ATitle: string;
AOptions: Integer;
begin
ATitle := ACaption;
if ATitle = '' then ATitle := Application.Title;
AOptions := AFlags;
if ARightToLeft then AOptions := AOptions or MB_RIGHT or MB_RTLREADING;
Result := Application.MessageBox(PChar(AText), PChar(ATitle), AOptions);
end;* ثم يمكننا استدعاء الدالة MsgBox كالتالي مثلاً:
if MsgBox(Edit1.Text, 'تجربة', MB_ABORTRETRYIGNORE) = IDABORT then
نرجو الاستفادة و السلام.
وَ قُلِ اعْمَلُوا فَسَيَرَى اللهُ عَمَلَكُمْ وَ رَسُولُهُ وَ الْمُؤْمِنُونَ
صدق الله العظيم
السلام عليكم و رحمة الله تعالى و بركاته
أخي الكريم
مشكور على المعلومات القيمة
و جعلها الله في ميزان حسناتك
دمتم