View Full Version : FireMonkey Form Events!!!
ahmadi3d_ali
جمعه 29 مهر 1390, 18:24 عصر
سلام توی firemonkey در delphi xe2 رویداد های فرم حذف شدن و فقط چندتاش هستند
ورویداد هایی مثل onmousemove یا onmouseclick و ... برای فرم وجود ندارند
من احتیاج دارم که در برنامم به اینها دسترسی داشته باشم کسی ایده ای نظری چیزی داره .
(قبلا استفاده از panel و alclient کردن و استفاده از رویداد های اون را امتحان کردم ولی به کارم نیومد پس یه چیز دیگه بگید :D )
MohsenB
جمعه 29 مهر 1390, 21:02 عصر
سلام
این رویداد حذف نشده ، یه جورایی مخفی شده . کافیه آورایدش (Override) کنید :
این کد رو توی قسمت عمومی ( Public ) از فرمتون بزارین :
procedure MouseMove(Shift: TShiftState; X: Single; Y: Single); override;
بعدش ازش استفاده کنید . مثلا توی یه همچین روالی :
procedure TForm1.MouseMove(Shift: TShiftState; X, Y: Single);
begin
inherited;
\\کدهای مورد نیازتون
end;
موفق باشید
ahmadi3d_ali
جمعه 29 مهر 1390, 22:06 عصر
خیلی ممنون
فقط یه نکته ای این inherited برای چی هست؟ معنای مورثی میده فکر کنم
MohsenB
جمعه 29 مهر 1390, 23:50 عصر
سلام
به زبان ساده چون ما این رویداد رو اوراید کردیم باید یه جوری به خود فرم هم این رویداد صادر بشه . چون با دستور اوراید ، روال اوراید شده بجای تمام رویداد های ارث برده شده از آن صدا زده میشود که با اجرای دستور Inherited رویداد ارث برده شده صدا زده میشود .
موفق باشید
SAASTN
شنبه 30 مهر 1390, 22:35 عصر
این رویداد حذف نشده ، یه جورایی مخفی شده . کافیه آورایدش (Override) کنید :
در زبان مسطلح بین برنامه نویسا رویداد Property ای هست که از جنس اشاره گر به متد تعریف میشه. در واقع MouseMove رویداد نیست، بلکه متدی هست که مثلا باید رویداد OnMouseMove رو اجرا (Trigger) کنه. قصد ندارم با کلمات بازی کنم، اما بهتر بود جمله بالا اینطور بیان می شد: این رویداد برای فرمهای FireMonkey پیاده سازی نشده، اما شما می تونید با Override کردن متد MouseMove این رویداد رو شبیه سازی کنید.
برای بهتر مشخص شدن این تفاوت به این کد موجود در راهنمای دلفی توجه کنید:
program EventDemo;
{$APPTYPE CONSOLE}
type
{ Define a procedural type }
TPingEvent = procedure of object;
{ The observed object }
TObservedObject = class
private
FPing: TPingEvent;
public
property OnPing: TPingEvent read FPing write FPing;
{ Triggers the event if anything is registered }
procedure TriggerEvent();
end;
{ The listener }
TListener = class
procedure Ping;
end;
procedure TObservedObject.TriggerEvent;
begin
{ Call the registerd event only if there is a listener }
if Assigned(FPing) then
FPing();
end;
procedure TListener.Ping;
begin
Writeln('TListener has been pinged.');
end;
var
ObservedObject: TObservedObject;
Listener: TListener;
begin
{ Create object instances }
ObservedObject := TObservedObject.Create();
Listener := TListener.Create();
{ Register the event handler }
ObservedObject.OnPing := Listener.Ping;
{ Trigger the event }
ObservedObject.TriggerEvent();//Should output 'TListener has been pinged'
Readln; // Pause console before closing
end.
اگه به متد TControl.MouseMove در یونیت Controls نگاهی بندازید می بینید که دقیقا شبیه متد TriggerEvent هست. البته من به سورس FireMonkey دسترسی ندارم و مطمئن نیستم که همون منطق vcl اونجا هم پیاده شده باشه.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.