رویداد ها در کامپوننت
-----------------------
این جلسه در مورد رویداد ها صحبت می کنم.
رویداد ها چیزی جز نگهدارنده ی آدرس یک متد نیستند.
رویداد در حقیقت مثل یک متغیر از نوع پروسیجر است که در مواقعی تصمیم می گیریم اون رو کال کنیم.
این مثال رو ببینید:
var
x: procedure(Sender: TObject);
procedure Proc1(Sender: TObject);
begin
ShowMessage('Proc1 for ' + Sender.ClassName);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
x := Proc1;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
x(Sender);
end;
در اینجا x یک نگه دارنده آدرس پروسیجر است.
نکته:
برای ایجاد یکی از همین نگه دارنده ها در Property حتما باید نوع اون متد باشه، یعنی این که پروسیجری از یک شی باشه.
مثال:
x: procedure(Sender: TObject) of Object;
یا حتی:
x: TNotifyEvent;
خب، اگر همین متغیر رو به عنوان یک خصیصه در یک کلاس بگذاریم، یعنی یک رویداد درست کردیم!
همین!
فقط باید تحت شرایطی اون رو کال کنیم.
برای کال کردن اون هم باید قبلش تست کنیم ببینیم این متغیر آدرسی رو در خودش نگه داشته یا نه.
ببینید،
وقتی روی یک فرم یک دکمه می گذارید و روش کلیک می کنید تا رویداد OnClick براتون ایجاد بشه، در حقیقت در DFM یک انتصاب برای یک متغیر رویداد انجام می شه.
می تونید این رویه رو با View as Text فرم مشاهده کنید.
توصیه مهم:
وقتی یک رویداد درست می کنید برای جلوگیری از تکرار و نیز برای کنترل روی رویداد در کلاس های مشتق شده، لازمه که یک پروسیجر در قسمت Protected اضافه کنید که Virtual (یا Dynamic) باشه.
درون این پروسیجر تست انتصاب برای رویداد و کارهای لازمه رو انجام می دید. هر کجا لازمه این پروسیجر رو کال می کنید. در کلاس های مشتق شده هم دستتون بازه که رفتار اون رو اصلاح کنید.
در همین مثال که زده شد، رویداد OnTick رو ببینید.
procedure DoTick(Sender: TObject); virtual;
.
.
property OnTick: TNotifyEvent read FOnTick write FOnTick;
ببینید در کجا کال می شه:
FTimer.OnTimer := DoTick;
این یعنی هروقت تایمر رویدادش اتفاق افتاد رویداد ما رو جاش بگذار.
و چگونه رویداد ران می شه:
.
.
if Assigned(FOnTick) then
FOnTick(Self);
یک مثال دیگه رو ببینیم. می خواهیم ببینیم که رویداد OnDropDown شی ComboBox کی کال می شه و چطور می تونیم کارکردش رو در یک کلاس مشتق شده عوض کنیم.
- یک کمبوباکس روی فرم بگذارید.
- با کنترل کلیک روی تعریف اون یعنی TComboBox به تعریف اون برید.
- همون طور که می بینید فقط میدان دید خصیصه ها افزایش داشته. پس همین خصیصه رو باید در یکی از کلاس های بالاتر دنبال کنیم.
- روی TCustomComboBox هم کنترل کلیک
- در اینجا خبری ازش نیست. پس از کلاس بالاتر یعنی TCustomCombo
- رویداد مورد نظر همین جاست. دنبال نگه دارنده ی این رویداد یعنی FOnDropDown می گردیم.
- در متد DropDown یک مورد پیدا می شه. با کلید های Shift Ctrl ArrowUp به اعلان این پروسیجر می ریم.
- همون طور که می بینید در Protected و از نوع Dynamic تعریف شده.
- از این به بعدش خیلی مهم نیست، خود کلاس می دونه چه موقع این رویداد رو از طریق این متد کال کنه. کافیه در کلاس مشتق شده این متد رو OverRide کنید و به جای کاری که پیش فرض انجام می شه، هنگام اتفاق افتادن DropDown کاری رو که دوست دارید انجام بدید.
فعلا تا جلسه ی بعدی خدانگهدار.