PDA

View Full Version : نحوی کار event ها در دلفی



delphi developer
دوشنبه 11 اردیبهشت 1385, 08:52 صبح
فرض کنید یک کلاس را از یکی از کلاس ها ی پایه دلفی ارث برده باشیم.
حالا برای اینکه بتوانیم event هایی را که کلاس پایه داره handle کنیم چه چیزی باید به کلاس خودمون اضافه کنیم؟؟؟

ghabil
دوشنبه 11 اردیبهشت 1385, 16:18 عصر
منظورت از Handel کردن چیه ؟ Event ها Procedure Pointer های هستند که هنوز Set نشدن حالا چطوری میخوای تو کلاس Handel بشن ؟ اگر بتونی بیشتر توضیح بدی میخوای چی کار کنی شاید بشه توضیح داد ولی دیروز به یک نفر که میخواست یک Event رو دینامیکی ست بکنه توضیح دادم (در مورد منو بود) شاید کارتو راه بندازه .

SH.Daneshvar
دوشنبه 11 اردیبهشت 1385, 17:47 عصر
بیشتر توضیح بده ؟
میخواهی چیکار کنی ؟
چون این کار بستگی به این داره که کلاس پایه شما چی کار کرده ؟

در کلاس های VCL بیشتر به این شکل عمل میکنن که مثلا برای رویداد OnClick یک متد Virtual به
نام DoClick گذاشته. حالا شما این DoClick رو توی کلاس مشتق شده Override کن.
البته این یه حالت استاندارد هست.

delphi developer
پنج شنبه 14 اردیبهشت 1385, 10:23 صبح
دقیقاً همون کاری را که برای ست دینامیک event ها توضیح دادید مد نظرم بود.
ولی اگر خودمون از کلاس TButton یک کلاس دیگر به راث ببریم و بخواهیم این کار را بکنیم چی؟( نه اینکه از TButton یک شی بسازیم)
در ضمن برای انکه مثل C# بتوان event ای ایجاد کرد که وقتی raise می شود تمام کلاس هایی که آن event را Handel کردن باخبر بشوند چه کار می شود کرد؟(مثلا تغییر نوع ماشین باید توسط
کلاس تعمیر گاه و حسابداری و ... Handle شود)

ghabil
پنج شنبه 14 اردیبهشت 1385, 13:08 عصر
بیبین در صورتی که داری کامپوننت می نویسی دیگه نباید بری سراغ Event بری(یعنی نباید Event رو مقدار دهی بکنی) بلکه باید بری روتینی که Event رو صدا میزنه رو پیدا کنی و Overrideش بکنی بعنوان یک کامپوننت نویس تو باید Eventرو در اختیار End User (کسی که از روی کلاست یک آبجکت میسازی) بزاری . که همونطوری که دوستمون هم اینجا گفته اکثرا تو VCL هر Event رو یک روتین با نام Do + نام Event بدون On صدا میکنه (نه همیشه البته)
برای اینکه قشنگه نکاه رو متوجه بشی این یک بخش از کد Click در TControl.Click هست که همیشه برای ایونتهای دیگه هم کم و بیش شبیه اینه :
بیبین در صورتی که داری کامپوننت می نویسی دیگه نباید بری سراغ Event بری(یعنی نباید Event رو مقدار دهی بکنی) بلکه باید بری روتینی که Event رو صدا میزنه رو پیدا کنی و Overrideش بکنی بعنوان یک کامپوننت نویس تو باید Eventرو در اختیار End User (کسی که از روی کلاست یک آبجکت میسازی) بزاری . که همونطوری که دوستمون هم اینجا گفته اکثرا تو VCL هر Event رو یک روتین با نام Do + نام Event بدون On صدا میکنه (نه همیشه البته)
برای اینکه قشنگه نکاه رو متوجه بشی این یک بخش از کد Click در TControl.Click هست که همیشه برای ایونتهای دیگه هم کم و بیش شبیه اینه :

if Assigned(FOnClick) then
FOnClick(Self);
یعنی کامپوننت نویس کارهاشو تو کلیک مینویسی آخرش نگاه میکنه اگر استفاده کننده هم در OnClick چیزی نوشته باشه اون رو هم اجرا میکنه . پس حالا تو بعنوان کامپوننت نویس باید این Click رو Override کنی.