PDA

View Full Version : سوالی در موردMessageDlg



ELABAA
سه شنبه 20 مرداد 1388, 11:55 صبح
سلام دوستان

چطور می تونیم پیام OK or Cancel ,...



دستور ;(MessageDlg( ' payam karbar ',mtCustom,[mbYes,mbCancel], 0



رو به صورت فارسی نشون بدیم یعنی به جای کلمه OK ، بله و یابه جای Cancel کلمه انصراف رو نمایش بده :متفکر:



باتشکرات فراوان

Hsimple11
سه شنبه 20 مرداد 1388, 12:01 عصر
قبلا آقای احدی فکر کنم توی سایت گذاشته بودند :


function TSplash.FarsiMsg(m:string;mtype:TMsgDlgType;mb:TMs gDlgButtons):TModalResult;
var
fd1:TForm;
begin
fd1:=CreateMessageDialog(m,mtype,mb);
fd1.BiDiMode:=bdRightToLeft;
fd1.Caption:='نام برنامه';
fd1.Font.Name :='Tahoma';
fd1.Font.Charset := ARABIC_CHARSET;
fd1.Font.Size := 8;
TButton(fd1.Components[2]).caption:='خیر';
TButton(fd1.Components[3]).caption:='بلی';
Result:=fd1.ShowModal;
fd1.Free;
end;


این فانکشن رو میتونید توی Public Implementation یونیت قرار بدید تا در تمام فرمها بتونید ازش استفاده کنید. نحوه استفادشم مثل همون MessageDlg هست.

Saeed_m_Farid
سه شنبه 20 مرداد 1388, 13:12 عصر
قبلا آقای احدی فکر کنم توی سایت گذاشته بودند :


function TSplash.FarsiMsg(m:string;mtype:TMsgDlgType;mb:TMs gDlgButtons):TModalResult;
var
fd1:TForm;
begin
fd1:=CreateMessageDialog(m,mtype,mb);
fd1.BiDiMode:=bdRightToLeft;
fd1.Caption:='نام برنامه';
fd1.Font.Name :='Tahoma';
fd1.Font.Charset := ARABIC_CHARSET;
fd1.Font.Size := 8;
TButton(fd1.Components[2]).caption:='خیر';
TButton(fd1.Components[3]).caption:='بلی';
Result:=fd1.ShowModal;
fd1.Free;
end;این فانکشن رو میتونید توی Public Implementation یونیت قرار بدید تا در تمام فرمها بتونید ازش استفاده کنید. نحوه استفادشم مثل همون MessageDlg هست.
دستتون درد نکنه ولی فکر می کنم این کد مشکل داره.


اگه غیر از دو دکمه حالت دیگه ای پاس داده بشه، تابع می ترکه! try..except هم نداره که خطا رو هندل کنه، ضمناً نگاه نمی کنه ببینه چه دکمه ای پاس دادیم، هر چی بدی، "بلی" و "خیر" تولید میکنه!
فکر می کنم تابع Public نمی تونه عضو یه کلاس (TSplash.FarsiMsg) باشه، مگه اینکه static تعریفش کنیم، که اینکار هم صورت نگرفته، یعنی مجبوریم در هر صورت به فرم Splash داشته باشیم که AutoCreate هم باشه، اگه اونو Free کنیم هم این تابع دیگه کار نمی کنه!
آبجکت محلی fd1 رو که Free می کنیم، لازم نیست هندل بهش اختصاص بدیم. تنها چیزی که لازمه مقدار بازگشتی TModalResult از CreateMessageDialog هست که بعد دادن Result دیگه fd1 لازم نیست.

یعنی کد رو میشه به صورت زیر نوشت تا واسه همه حالتها جواب بده :



(************************************************* ***************)

type
TButtonNames = array[TMsgDlgBtn] of string;

const
ButtonNames: array[0..1] of TButtonNames = (
('Yes', 'No', 'OK', 'Cancel',
'Abort', 'Retry', 'Ignore',
'All', 'NoToAll', 'YesToAll', 'Help'),
('بلي', 'خير', 'تاييد',
'لغو', 'انصراف', 'تجديد',
'صرفنظر', 'همه', 'نه به همه', 'بلي به همه', 'راهنمايي'));

Function FarsiMsg(const m: string;
mtype: TMsgDlgType;
mb: TMsgDlgButtons): TModalResult;
var
btn: TMsgDlgBtn;
begin
with CreateMessageDialog(m, mtype, mb) do try
BiDiMode := bdRightToLeft;
Caption := 'پیغام سیستم';
Font.Name := 'Tahoma';
Font.Charset := ARABIC_CHARSET;
Font.Size := 8;

for btn := Low(TMsgDlgBtn) to High(TMsgDlgBtn) do
if btn in mb then
TButton(FindComponent(ButtonNames[0, btn])).Caption :=
ButtonNames[1, btn];

Result := ShowModal;
finally
Free;
end;
end;

(************************************************* ***************)


فعلاً همین ها به ذهنم رسید، موفق باشید.

پ. ن. : اگه کسی تونست این کد رو (آرایه ButtonNames : const) طوری paste کنه که درست نشون داده بشه (تو یه پست جدید)؛ قول میدم از 10 تا پست آخرش تشکر کنم! یعنی همونطوری که تو دلفی نمایش داده میشه، اینجا هم همونطوری نمایش بده :

http://www.mypicx.com/uploadimg/476705394_08112009_1.jpg

Hsimple11
چهارشنبه 21 مرداد 1388, 01:31 صبح
1. اگه غیر از دو دکمه حالت دیگه ای پاس داده بشه، تابع می ترکه! try..except هم نداره که خطا رو هندل کنه، ضمناً نگاه نمی کنه ببینه چه دکمه ای پاس دادیم، هر چی بدی، "بلی" و "خیر" تولید میکنه!
ممنون از توجه شما ولی من هم گفتم که این کد قبلا بصورت کامل در سایت آورده شده و جستجو میکردید کاملش بود.


2. فکر می کنم تابع Public نمی تونه عضو یه کلاس (TSplash.FarsiMsg) باشه، مگه اینکه static تعریفش کنیم، که اینکار هم صورت نگرفته، یعنی مجبوریم در هر صورت به فرم Splash داشته باشیم که AutoCreate هم باشه، اگه اونو Free کنیم هم این تابع دیگه کار نمی کنه!
بازم ممنون! ولی اینقدر عجولانه پست نزنید. این معلومه که این کد رو Paste کردم آخه! البته نیازی به تغییر کد نیست. فرض کنید MainForm فرم Splash هست.



در ضمن کافیه توی گوگل یا حتی SwissDelphiCenter یه جستجو میکردید. عینا تمامی این کدها وجود داره.

موفق باشید.