PDA

View Full Version : showmessage بدون دکمه ok



khoshblagh
شنبه 21 دی 1387, 11:22 صبح
با سلام خدمت دوستان
کسی میدونه چطور یک showmessage بدون دکمه ok داشت. این نیاز به این خاطر است که فرضا اگر کاربر در یک فرم اقدام به ثبت اطلاعات جدید نمود. پنجره showmessage بعد از اعلام ثبت اطلاعات وارده بدون نیاز به زدن دکمه ok با اولین عمل کاربر خود به خود بسته شود.
باتشکر

hojjatcroos
شنبه 21 دی 1387, 12:39 عصر
خوب اول این فانکشن را در فرم کپی کنید
function EnumChildProc(Wnd: hWnd; SL: TStrings): BOOL; stdcall;
var
szFull: array[0..MAX_PATH] of Char; //Buffer for window caption
begin
Result := Wnd <> 0;
if Result then
begin
GetWindowText(Wnd, szFull, SizeOf(szFull)); // put window text in buffer
if (Pos(SL[0], StrPas(szFull)) > 0) // Test for text
and (SL.IndexOfObject(TObject(Wnd)) < 0) // Test for duplicate handles
then SL.AddObject(StrPas(szFull), TObject(Wnd)); // Add item to list
EnumChildWindows(Wnd, @EnumChildProc, Longint(SL)); //Recurse into child windows
end;
end;
function ClickButton(ParentWindow: Hwnd; ButtonCaption: string): Boolean;
var
SL: TStringList;
H: hWnd;
begin
SL := TStringList.Create;
try
SL.AddObject(ButtonCaption, nil); // First item in list is text to find
EnumChildWindows(ParentWindow, @EnumChildProc, Longint(SL));
H := 0;
case SL.Count of
1: ShowMessage('Window text not found.');
2: H := hWnd(SL.Objects[1]);
else
ShowMessage('Ambiguous text detected.');
end;
finally
SL.Free;
end;
Result := H <> 0;
if Result then PostMessage(H, BM_CLICK, 0, 0);
end;
حالا یک تایمر بر روی فرم قرار دهید و کد زیر را در آن بنویسید
procedure TForm1.Timer1Timer(Sender: TObject);
var
h:HWND;
begin
h:=FindWindow('TmessageForm','Project1');
if h>0 then
h:=FindWindow('TmessageForm','Project1');
h:=FindWindowEx(h,0,nil,'OK');
ShowWindow(h,SW_HIDE);
h:=FindWindow('TmessageForm','Project1');
if h>0 then
ClickButton(h,'OK')
end;
end.

m-khorsandi
شنبه 21 دی 1387, 13:14 عصر
var
MsgFrm: TForm;
begin
try
MsgFrm := CreateMessageDialog('Message', mtWarning, [mbYes]);
TButton(MsgFrm.FindComponent('YES')).Hide;
MsgFrm.ShowModal;
finally
MsgFrm.Free;
end;
end;


اين چند خط برای ساخت فرم پيغام بدون دكمه هست،
متغيری كه تعريف شده از كلاس TForm هست پس برای اون فرم ميتونی هر رويدادی رو بنويسی و استفاده كنی تا مثلاً با حركت ماوس، فرم بسته بشه.

hojjatcroos
شنبه 21 دی 1387, 15:33 عصر
ولی دوست عزیز اگه میشه اون آخرش هم که مربوط به بستن فرم هست توضیح بدید ممنون می شم

m-khorsandi
شنبه 21 دی 1387, 15:49 عصر
اگه قرار باشه اين فرم مدت زمانی نمايش داده بشه، خوب ميشه از تايمر (تقريباً از روشی كه شما نوشتيد) استفاده كرد( كه من پيشنهاد نميكنم) به اين صورت كه در زمان اجرا يك Timer برای متغير كلاس TForm ايجاد ميكنيم و متدی رو كه از قبل برای OnTimer نوشتيم رو به اون assign ميكنيم.



پنجره showmessage بعد از اعلام ثبت اطلاعات وارده بدون نیاز به زدن دکمه ok با اولین عمل کاربر خود به خود بسته شود.

برای اين روش هم ميشه يك متد برای OnClick فرم نوشت و در زمان اجرا اون متد رو به متغير فرم assign كرد. تا هر وقت كاربر روی فرم كليك كرد فرم بسته شود.

Felony
شنبه 21 دی 1387, 20:44 عصر
var
MsgFrm: TForm;
begin
try
MsgFrm := CreateMessageDialog('Message', mtwarning,[mbyes]);
TButton(MsgFrm.FindComponent('YES')).Hide;
MsgFrm.ShowModal;
finally
MsgFrm.Free;
end;
end;



آیا دلیلی داره که کلید رو خودمون بسازیم بعد خودمون هم مخفیش کنیم ؟ خوب از اول نسازیمش !

من کد رو اینطوری تغییر دادم ، باز هم کار کرد :



var
MsgFrm: TForm;
begin
try
MsgFrm := CreateMessageDialog('Message', mtwarning,[]);
MsgFrm.ShowModal;
finally
MsgFrm.Free;
end;
end;

hojjatcroos
یک شنبه 22 دی 1387, 09:39 صبح
میشه بگین چه طوری با کلیک کردن روی فرم فرم بسته می شه اگه میشه کدش بنویسید-با تشکر

khoshblagh
یک شنبه 22 دی 1387, 09:39 صبح
با تشکر از جناب آقای خرسندی و سایر دوستان.

جناب خرسندی من از کد شما استفاده کردم ولی باز بدون زدن دکمه بستن فرم اجرا نشد.
ظاهرا فرم به مرحله free نمیرسد.

ضمنا کد MsgFrm.Free را در رویداد موس نوشتم ولی ظاهرا اجرا نمیشود.

ممنون میشوم اگر روش صحیح استفاده از رویداد موس را با مثال درج نمائید.

با تشکر

m-khorsandi
یک شنبه 22 دی 1387, 10:15 صبح
آیا دلیلی داره که کلید رو خودمون بسازیم بعد خودمون هم مخفیش کنیم ؟ خوب از اول نسازیمش !
درسته، تا حالا به اين شكل امتحان نكرده بودم.
مرسی.


میشه بگین چه طوری با کلیک کردن روی فرم فرم بسته می شه اگه میشه کدش بنویسید-با تشکر

پروسيجر OnClick رو مثل كد زير بنويس :

procedure TForm1.MsgFrmOnClick(Sender: TObject);
begin
Screen.ActiveForm.Close;
end;





var
MsgFrm: TForm;
begin
try
MsgFrm := CreateMessageDialog('Message', mtwarning,[]);
MsgFrm.OnClick := MsgFrmOnClick;
MsgFrm.ShowModal;
finally
MsgFrm.Free;
end;
end;



من از کد شما استفاده کردم ولی باز بدون زدن دکمه بستن فرم اجرا نشد.
متوجه نشدم!

khoshblagh
چهارشنبه 02 بهمن 1387, 10:17 صبح
با سلام خدمت جناب آقای m-khorsandi

منظورم اینه که کد فوق را در دکمه ای که وظیفه اش ثبت اطلاعات و سپس اعلام ثبت میباشد قرار دادم ولی این پیام هم اگر چه دکمه OK ندارد ولی باز هم باید از دکمه بستن فرم در بالای سمت راست و با علامت X میباشد استفاده کنیم. احتمال من این است که رویداد دیگری باید استفاده شود.از طرفی اگر قرار باشد در روی فرم و یا هر جای دیگر با زدن کلید فرم بسته شود نیازی به داشتن پیام showmessage بدون دکمه Ok نبود.
شرمنده از تاخیر در ارسال پاسخ. متشکرم

m-khorsandi
چهارشنبه 02 بهمن 1387, 10:32 صبح
اعلام ثبت اطلاعات وارده بدون نیاز به زدن دکمه ok با اولین عمل کاربر خود به خود بسته شود.
من برداشتم از اولين عمل كاربر كليك روی قسمتی از فرم بود، شما بايد عمل مورد نظر رو تعيين كنيد تا امكان تصميم گيری در موردش وجود داشته باشه. به نظرم تايمر هم بد نيست.

hojjatcroos
چهارشنبه 02 بهمن 1387, 10:44 صبح
برای این کار دو تا تایمر رو ی فرم قرار بده اولی interval ش رو 1 کن و کدر زیر را براش قرار بده به جای Warning عنوان پیامت رو بگذار

procedure TForm1.Timer1Timer(Sender: TObject);
var
hwndHandle : THANDLE;
hMenuHandle : HMENU;
begin
hwndHandle := FindWindow(nil, 'Warning');
if (hwndHandle <> 0) then begin
hMenuHandle := GetSystemMenu(hwndHandle, FALSE);
if (hMenuHandle <> 0) then
DeleteMenu(hMenuHandle, SC_CLOSE, MF_BYCOMMAND);
end;
end;
تایمر دومی رو انورتالش رو مثلا 2500 کن و کد زیر رو توش قرار بده
procedure TForm1.Timer2Timer(Sender: TObject);
var
h:HWND;
begin
h:=FindWindow(nil,'Warning');
if h>0 then
begin
Screen.ActiveForm.Close;
end;
end;

khoshblagh
چهارشنبه 02 بهمن 1387, 12:27 عصر
منظور هر عمل دیگر مثلا زدن یک دکمه دیگر (جهت وارد کردن اطلاعات جدید یا دکمه خارج شدن از آن فرم) میباشد. ضمنا اگر درست فهمیده باشم کد را در جای مناسب قرار داده ام
در این صورت وقتی دکمه ثبت را جهت ثبت اطلاعات فشار میدهم بعد از نمایش اعلام مورد نظر فرم باز مانده و در این صورت هیچ دکمه ای در روی فرم اصلی فعال نمیشود.که البته به علت باز بودن فرم showmessage مربوطه میباشد.
البته تمام هدف از حذف دکمه Ok این بود که کاربر نیاز به زدن یک دکمه اضافه (منظور دکمه Ok) و تکراری نباشد. زیرا اگر این کاربر قرار باشد فرضا روزی 500 رکورد جدید به بانک اضافه نماید این عمل باعث خستگی اضافی و بیمورد وی میشود.
با تشکر

arash_ebrahimi_nk
چهارشنبه 02 بهمن 1387, 13:15 عصر
var
MsgFrm: TForm;
begin
MsgFrm := CreateMessageDialog('Message', mtwarning,[]);

MsgFrm.Show;

end;
end;

به جای ShowModal از Show استفاده کنید
متغییر MsgFrm رو بصورت عمومی تعریف کنید
در هر زمانی که میخواهید کد بستن و آزاد کردن MsgFrm رو فراخوانی کنید.
فکر کنم مشکلتون حل بشه.

mafazel
چهارشنبه 02 بهمن 1387, 13:24 عصر
سلام دوست عزیز
گویا شما میخواهید به کاربر یک پیغام بدید که اطلاعات با موفقیت ذخیره شده است. اولا چه نیازی به این کار هست؟؟. در ثانی ساده ترین و معمول ترین کار، نشان دادن پیغام در یکی از Panel های StatusBar است.
بعد از اون شما میتونید یک فرم بسازید که فقط یک پیغام رو نشون بده و BorderStyle اون bsNone بذارید تا دکمه ضربدر هم نداشته باشه و یک تایمر توی اون بذارید و با زدن دکمه ثبت و انجام ذخیره سازی، فرم پیغام رو نشون بدید و تایمر رو فعال کنید و در رویداد تایمر فرم رو ببندید. زمان تایمر رو هم خیلی کم بذارید.
اگه واقعا برنامه تون پیشرفته و با هزینه بالا و لوکس هست یک کامپوننت مثل بالون یا Assistant آفیس بذارید و اون پیغام رو نشون بدید.
سعی کنید از روشهای استاندارد استفاده کنید (اینجوری برنامه تون خیلی با کلاس تره و قاطی بزرگا می شید!!!) تا اینکه خودتون روشهای جدید اختراع کنید. مثلا قرار بر اینه که وقتی کاربر هم دکمه ثبت رو زد مطمئنه که ثبت میشه مگه اینکه خطایی رخ بده که باید کاربر اطلاع پیدا کنه - یا پنجره پیام باید دکمه تایید یا بستن داشته باشه.
به نظر من بیشتر از این روی این بحث وقت نذارید مگه اینکه کار جدی نباشه بخواهید روش ها رو آزمایش کنید.
موفق باشید.

m-khorsandi
چهارشنبه 02 بهمن 1387, 14:25 عصر
مواردی كه آرش گفت رو رعايت كن و كدت هم با توجه به توضيحاتت تقريباً بايد به اين شكل بشه :


procedure TForm1.Button1Click(Sender: TObject);
begin
MsgFrm := CreateMessageDialog('Message', mtwarning,[]);
MsgFrm.OnDeactivate := MsgFrmDeAct;
MsgFrm.Show;
end;

procedure TForm1.MsgFrmDeAct(Sender: TObject);
begin
MsgFrm.Close;
end;

khoshblagh
پنج شنبه 03 بهمن 1387, 09:04 صبح
میشه بگید MsgFrmDeAct چه نوع میباشد .چون برنامه خطا عدم تعریف میگیرد. ضمنا اگر امکان دارد در رابطه با خط زیر و نقش آن توضیح دهید. از شما و جناب آرش سپاس گذارم.
MsgFrm.OnDeactivate := MsgFrmDeAct;

khoshblagh
پنج شنبه 03 بهمن 1387, 09:18 صبح
تا اینکه خودتون روشهای جدید اختراع کنید.

جناب mafazel

اگر شما قبلا با فاکس پرو کار یا آشنا باشید در آنجا پنچره ای میتوانستید تعریف و پیام مورد نظر را بدون نیاز به زدن دکمه ای باز و بسته میشد.
این مربوط به یک زبان قدیمی و احتمالا متروک است. با این مقدمه به نظر شما من دارم روشهای جدیدی اختراع میکنم!!!
انتظار معقول از این سایت هست که به نیازهای ولو کوچک و بی ارزش مشتاقان جواب داده شود.
با تشکر از راهنمایی و اظهار نظرتان.

m-khorsandi
پنج شنبه 03 بهمن 1387, 11:13 صبح
procedure زير رو بايد تعريف كنی :


procedure MsgFrmDeAct(Sender: TObject);

اين procedure باعث ميشه تا وقتی روی فرم اصلی برنامه يا هر جای ديگه‌ای از برنامه‌ات كليك كردی فرم پيغام بسته بشه البته احتمالاً بايد MsgFrm.Release رو هم اضافه كنی تا هم حافظه‌ی مربوط به اين فرم آزاد بشه و هم در Create بعدی اشكالی پيش نياد.

khoshblagh
شنبه 05 بهمن 1387, 09:26 صبح
جناب m-khorsandi
احتراما با تعریف کد مشکل به لطف شما و سایر دوستان حل شد. میماند نوار بالای پنجره که با توجه به نوع مثلا information همین کلمه را در نوار عنوان نمایش میدهد. سئوال اینست که آیا راهی هست که همین کلمه را به فارسی ( اطلاعات)در روی نوار پنجره نوشت و اگر نمیشود آیا راهی هست که کلا این نوار نمایش داده نشود. با تشکر از زخمات شما.

m-khorsandi
شنبه 05 بهمن 1387, 09:40 صبح
متغير MsgFrm از نوع TFormهست، يعنی يك فرم، بنابراين مانند ساير فرم‌ها هر كاری كه با اين فرم بخوای ميتونی انجام بدی، يعنی اگر تو برنامه‌های معمولی عنوان فرم را با استفاده از Form.Caption := 'xxxx' تغيير ميدی، تو اين روش هم با اين كد ميتونی اين كار رو بكنی.

khoshblagh
شنبه 05 بهمن 1387, 12:16 عصر
جناب m-khorsandi
با سلام
ار راهنمایهای ارزشمندتان کامل تشکر دارم.

fahimi
جمعه 04 شهریور 1390, 19:16 عصر
مسیج شبیه به foxpro
یک panel روی فرم قرارداده(در کپشن عنوان پیام وفونت و رنگ را انتخاب) و وضعیت visible آنرا را false میکنیم . موقعیکه نیاز پیام دارم وضعیت visible آنرا را true lمیکنم و در timer بستگی زمان دلخواه و وضعیت visible آنرا را false تنظیم میکنم