PDA

View Full Version : Assign رویداد به همه آبجکت ها



hojjatcroos
سه شنبه 04 اسفند 1388, 07:25 صبح
سلام چه طور می توان یک رویداد مانند OnMouseMove رو به همه اشیاء Assign کرد.با تشکر

majid2230
سه شنبه 04 اسفند 1388, 07:32 صبح
می تونید یک Procedure در قسمت Public فرم ( یا هر جای دیگری ! ) ایجاد کنید و بعد مقدار مثلا OnClick اشیا رو برابر Procedure ساخته شده قرار بدید ، مثال :
view source (http://barnamenevis.org/forum/showthread.php?t=204854#viewSource)
print (http://barnamenevis.org/forum/showthread.php?t=204854#printSource)? (http://barnamenevis.org/forum/showthread.php?t=204854#about)

01.type
02. TForm1 = class(TForm)
03. BitBtn1: TBitBtn;
04. procedure FormCreate(Sender: TObject);
05. private
06. { Private declarations }
07. public
08. procedure MyOnClick(Sender : TObject);
09. { Public declarations }
10. end;
11.
12.var
13. Form1: TForm1;
14.
15.implementation
16.
17.{$R *.dfm}
18.
19.procedure TForm1.MyOnClick(Sender : TObject);
20.begin
21. ShowMessage('Hi ... !');
22.end;
23.
24.procedure TForm1.FormCreate(Sender: TObject);
25.begin
26. BitBtn1.OnClick := Form1.MyOnClick;
27.end;



به این نکته توجه کنید که Procedure ساخته شده باید Signature یا امضاء مشابهی با رویدادی که می خواهید Procedure رو به اون نسبت بدید داشته باشه ، منظور از امضاء همون عبارت Sender : TObject یا درواقع آرگومانهای ورودی Procedure هست ...

برای اطلاعات بیشتر در این زمینه هم می تونید به این صفحه (http://www.delphiplus.mihanblog.com/post/39) مراجعه کنید ...
فکر کنم این توضیح آقای Mahmood_N (http://barnamenevis.org/forum/member.php?u=16833) مشکل شما رو حل کنه .

hojjatcroos
سه شنبه 04 اسفند 1388, 13:43 عصر
ممنون.نکته این جا است که تعداد کامپوننت های ما معلوم نیست.فرض کنید می خواهید به 10و20 یا 30 دکمه این رویدادها Assign بشه.

Mahmood_M
چهارشنبه 05 اسفند 1388, 01:13 صبح
ممنون.نکته این جا است که تعداد کامپوننت های ما معلوم نیست.فرض کنید می خواهید به 10و20 یا 30 دکمه این رویدادها Assign بشه.
تعدادش مهم نیست ، به شکل زیر عمل کنید ، فرض کنید قصد داریم Procedure ای با نام OnMyClick رو به رویداد OnClick تمام کامپوننتهای از نوع TBitBtn در Form1 اختصاص بدیم :
procedure TForm1.FormCreate(Sender: TObject);
var
I : Integer;
begin
for I := 0 to Form1.ComponentCount - 1 do
begin
if Components[I].ClassName = 'TBitBtn' then
(Components[I] as TBitBtn).OnClick := MyOnClick;
end;
end;
OnMyClick رو هم باید به صورت زیر تعریف کنیم ( مثلا ) :
procedure TForm1.MyOnClick(Sender : TObject);
begin
ShowMessage('I go to School everyday by bus !');
end;
به Signature مربوط به Procedure ساخته شده توجه کنید ، باید شبیه به رویداد اصلی شیء باشه ...
نکته ی آخر اینکه Procedure رو باید در قسمت Public فرم ( یا ... ) تعریف کرده باشید :
public
procedure MyOnClick(Sender : TObject);

سلام چه طور می توان یک رویداد مانند OnMouseMove رو به همه اشیاء Assign کرد.با تشکر
اگر منظورتون اینه که رویداد OnMouseMove در یک شیء ( مثلا یک TBitBtn ) تعریف شده و می خواید که برای سایر TBitBtn ها هم این رویداد رو تعریف کنید می تونید به جای تعریف Procedure مستقیما رویداد onMouseMove شیء مورد نظر رو به سایر دکمه ها یا اشیاء نسبت بدید :
BitBtn1.OnMouseMove := BitBtn2.OnMouseMove;
در اینجا (http://www.delphiplus.mihanblog.com/post/39) هم یک مقاله در همین زمینه هست همراه با یک مثال ، علاوه بر این این موضوع چندین بار در سایت مطرح شده ، اگر در سایت جستجو کنید فکر کنم چند نمونه ی دیگه پیدا کنید ...

موفق باشید ...

hojjatcroos
چهارشنبه 05 اسفند 1388, 09:17 صبح
ممون آقای مهری مثل همیشه عالی بودیک سوال داشتم البته بی ربط به این موضوع.چه طور میشه کامپوننت هایی مثل combobox رو در حالت اجرا در فرم جابه جا کرد

Felony
چهارشنبه 05 اسفند 1388, 09:30 صبح
فایل ضمیمه یه نمونه هست ، یه کامپوننت هم چند وقت پیش یکی از دوستان گزاشته بود .

hojjatcroos
چهارشنبه 05 اسفند 1388, 09:40 صبح
ممنون.خوب مشکل ما این هست که یک ComBoBox هیچ کدوم از این رویداد ها را ندارد
MouseMove
MouseUp
MouseDown
یک سوال دیگه هم داشتم این طور که آقای مهری گفتن پس باید نوع کلاس اون کامپوننت مشخص باشه.

Felony
چهارشنبه 05 اسفند 1388, 10:07 صبح
در مورد سوال اولتون که گفتم ، چند وقت پیش یکی از دوستان همین سوال رو داشت و یکی از دوستان کامپوننتی رو معرفی کرد ، دنبالش بگردید پیدا میکنید .

در مورد سوال دوم هم بله باید نوع کلاس رو بدونید ، چون اگر کلاس کنترل جاری رو چک نکنید با مشکل مواجه میشید ، ممکنه کنترل جاری مثلا یک تایمر باشه که رویداد OnClick نداره که بخواد بهش رویدادی اختصاص پیدا کنه .

hojjatcroos
چهارشنبه 05 اسفند 1388, 10:20 صبح
نیاز به کامپوننت نیست این یک نمونه.فقط شما بگید به جای
(Components[i] as TBitBtn).OnClick := MyOnClick;
TBitBtn چه عبارتی رو قرار بدم تا همه اشیاء فرم من رو شامل بشه چون این نمونه سورس رو با درگ کردن درست کردم و فکر می کنم همه اشیاء این خاصیت رو دارا باشند.

Felony
چهارشنبه 05 اسفند 1388, 11:34 صبح
TBitBtn چه عبارتی رو قرار بدم تا همه اشیاء فرم من رو شامل بشه چون این نمونه سورس رو با درگ کردن درست کردم و فکر می کنم همه اشیاء این خاصیت رو دارا باشند.
به جای TBitBtn بنویس TControl تا همه اشاء رو شامل بشه ، زمانی این مورد کاربرد داره که تو فرمت هیچ کنترل Non Visual وجود نداشته باشه ( مثل Timer , PopupMenu و ... ) چون این کنترل ها رویداد درگ ندارن ، البته شاید بتونی تو یک بلوک Try Except بهشون رویداد اختصاص بدی که اگه کنترل هات همچین رویدادی نداشتن از دادن پیغام خطا صرف نظر کنه !

اون کامپوننتی که گفتم یکی از کاربرا معرفی کرد یه مشکل داشت که من برطرف کردمش و قرار دادم ولی الان بهش دسترسی ندارم تا ضمیمه کنم .

Felony
چهارشنبه 05 اسفند 1388, 11:43 صبح
این هم از اون کامپوننتی که میگفتم ، از ضمیمه دریافتش کنید .

hojjatcroos
چهارشنبه 05 اسفند 1388, 12:00 عصر
خیلی ممنون.جالب بود چون هدف من درست کردن یک نرم افزار اوتوران ساز بود.راستی از Tcontrol خطا می گیره

Mahmood_M
چهارشنبه 05 اسفند 1388, 15:30 عصر
خیلی ممنون.جالب بود چون هدف من درست کردن یک نرم افزار اوتوران ساز بود.راستی از Tcontrol خطا می گیره
نوعهای TControl یا TWinControl و یا TGraphicControl و ... در حالت عادی و به صورت خالص ! Event ای ندارند ، باید مشتقات اونها رو چک کنید ، مثل TBitBtn یا TEdit ...
با توجه به اینکه می خواید یک نرم افزار Autorun ساز بسازید ، پس نوع ابزارهایی که در اختیار کاربر می زارید مشخص هست ، می تونید برای تشخیص هرکدوم نام کلاسش رو شرط قرار بدید ...

...