ورود

View Full Version : تشخیص کلیک شدن دکمه



Delphi Skyline
پنج شنبه 13 اسفند 1383, 21:23 عصر
سلام
لطفا بگید چه طوری می شه اگر button1 کلیک شد برنامه بسته بشه (نه اینکه تو خوده button بنویسی بلکه مثلا از یک timer این شرط چک شود)
در کل:
یک timer چک کند که اگر button1 فشار داده شد برنامه بسته شود.
بای...

جمعه 14 اسفند 1383, 02:38 صبح
سوالت یک کم عجیب :گیج: و به طبع راهی هم که پیشنهاد میکنم عجیب و شاید مسخره باشه : خوب توی رویداد کلیک ات یک متغیر نوع boolean رو مقدار دهی کن و تو تایمر این مقدار رو چک کن .

به هر حال امیدوارم کارت را بیفته .
:موفق:

vcldeveloper
جمعه 14 اسفند 1383, 03:28 صبح
برای این کار باید یک Message Handler بنویسی تا WM_COMMAND رو هندل کنه:
در قسمت private از فرم برنامه:


procedure WMCOMMAND(var msg: TMessage); message WM_COMMAND;


و در قسمت Implementation از unit ایی که فرم در اون قرار داره، procedure فوق را بصورت زیر پیاده سازی کن:


procedure TForm1.WMCOMMAND(var msg: TMessage);
begin
if Msg.WParamHi = BN_CLICKED then
if Msg.lParam = Button1.Handle then
Close;
end;

در این کد فرض شده که دکمه مورد نظر Button1 هست.

توضیح کد هم ساده است:
هر وقت دکمه ای در داخل برنامه کلیک بشه، با BN_CLICKED فرم والد خودش رو با خبر می کنه.
BN_CLICKED از طریق پیغام WM_COMMAND برای فرم والد ارسال میشه.
برای اطلاعات بیشتر می تونی در Windows SDK - به همراه راهنمای دلفی نصب میشه - کلمات BN_CLICKED و WM_COMMAND رو جستجو کنی.

موفق باشی

Delphi Skyline
جمعه 14 اسفند 1383, 20:09 عصر
آقای کشاورز حالا مثلا برای چند دکمه چی؟ مثلا : button2 button4 ؟ متشکرم

vcldeveloper
شنبه 15 اسفند 1383, 02:10 صبح
آقای کشاورز حالا مثلا برای چند دکمه چی؟ مثلا : button2 button4 ؟ متشکرم
می تونی برای هر دکمه یه شرط بزاری:



if Msg.WParamHi = BN_CLICKED then
if Msg.lParam = Button2.Handle then
Close
else
if Msg.lParam = Button4.Handle then
//Do something else

Delphi Skyline
یک شنبه 16 اسفند 1383, 15:38 عصر
متشکرم آقای کشاورز .
من می خواهم با دستورات create یک دکمه بوجود بیارم و بعد این کارش کنم .
چه طوری می شه؟ متشکرم.
بای..
:flower:

vcldeveloper
دوشنبه 17 اسفند 1383, 02:27 صبح
اگر فرض بگیریم که شما دکمه ای (یا دکمه هایی) به این صورت ساختی:


var
MyButton : TButton;
begin
MyButton := TButton.Create(Form1);
MyButton.Parent := Form1; //or Self
MyButton.Name := 'MyButton1';
end;

می تونی کدی که در پست قبلی نوشتم رو بصورت زیر تغییر بدی:


if Msg.WParamHi = BN_CLICKED then
if Msg.lParam = TWinControl(Form1.FindChildControl('MyButton1')).H andle then
Close
else
if Msg.lParam = TWinControl(Form1.FindChildControl('MyButton2')).H andle then
//Do something else


البته من دقیقا متوجه نمیشم که چیکار میخوای بکنی...اما اگه قصدت فقط اینه که چند دکمه رو بصورت دینامیک ایجاد بکنی و همشون یه کار انجام بدن، راه آسونتری هم هست:
یک procedure در قسمت تعریف فورم ایجاد کن (معمولا در بخش Private):


private
{ Private declarations }
procedure DoSomething(Sender: TObject);


حالا هر دکمه ای که به صورت دینامیک میسازی، مقدار OnClick اون رو برابر با اسم procedure ایی که ساختی قرار بده. نتیجه میشه کدی شبیه به این:


var
MyButton : TButton;
i : word;
begin
i := 0;
MyButton := TButton.Create(Form1);
MyButton.Parent := Form1; //or Self
Inc(i);
MyButton.Name := 'MyButton' + i;
MyButton.OnClick := DoSomething;
end;

با این کار هر بار که یکی از دکمه هایی که بصورت فوق ساختی کلیک بشند، کدی که در procedure DoSomething وجود داره اجرا میشه.

Delphi Skyline
دوشنبه 17 اسفند 1383, 15:31 عصر
متشکرم آقای کشاورز . توانستم.
:flower: :flower: :flower: :flower: