View Full Version : مفهوم Procedure Of Object چیست ؟
rayangostar_co
سه شنبه 12 دی 1391, 11:52 صبح
با عرض سلام خدمت همه دوستان برنامه نویس
مفهوم دستور زیر و اکه کسی میدونه بگه .
توضیح کامل بدید ممنون میشم.
type
TClientStatus = procedure (const AClient: TClient) of Object;
یوسف زالی
سه شنبه 12 دی 1391, 11:57 صبح
سلام.
این یعنی یک نوع از نوع procedure که باید حتما در یک Object باشه.
مثال:
var
X: TClientStatus;
.
.
X := Obj1.OnSomething;
.
.
.
X; // running procedure
Felony
سه شنبه 12 دی 1391, 12:31 عصر
به اون نوع Method Pointer میگن ، در کل در در دلفی 2 نوع Method Pointer داریم ، اولی Method Pointer هایی که یک روال عادی به اون ها اختصاص داده میشه ، مثلا :
procedure test;
begin
ShowMessage('I''m test method');
end;
procedure TForm1.FormCreate(Sender: TObject);
var
aMethod: procedure;
begin
aMethod:= test;
aMethod;
end;
دومیMethod Pointer هایی که متدی از یک شئ مشتق شده از کلاس به اونها نسبت داده میشه ، همونطور که یوسف گفت ، Of Object به این معناست که این Method ی که قراره به این نوع داده اختصاص پیدا کنه باید متدی از یک شئ باشه ، مثل همون مثال پست قبلی ، دلیل این تفاوت این هست که کامپایلر باید بدونه به چه متدی باید اشاره کنه ، در حقیقت اون انتصاب یک اشاره گر از متد رو در اون Data Type ذخیره میکنه نه یک کپی از اون رو ، بنا براین ممکنه من در برنامم همچین کدی داشته باشم :
type
TMyClass1= class
procedure test;
end;
type
TMyClass2=class
procedure test;
end;
-----------------------------------
{ TMyClass1 }
procedure TMyClass1.test;
begin
ShowMessage('I''m test method from TMyClass1');
end;
{ TMyClass2 }
procedure TMyClass2.test;
begin
ShowMessage('I''m test method from TMyClass2');
end;
خوب وقتی یکی از متدهای test از 2 کلاس بالا رو به یک Method Pointer اختصاص میدیم ، کامپایلر باید بدونه به کدوم شئ در زمان فراخوانی Method Pointer باید ارجاع کنه و متد مورد نظر ما رو از اون شئ فراخوانی کنه یا نه ؟ اگر یک Method Pointer معمولی تعریف کنید کامپایلر در زمان فراخوانی متد نمیتونه تشخصی بده باید به کدوم کلاس برای اجرای این متد ارجاع کنه و از کامپایل برنامه جلوگیری میکنه ولی وقتی Method Pointer رو به صورت of Object تعریف کنید به کامپایلر میگید علاوه بر آدرس متد مورد نظر من ، آدرس شئ مورد نظر که این متد متعلق به اون هست رو هم در Method Pointer نگهداری کن ، با این کار وقتی متدی از یک شئ که از یک کلاس به ارث برده شده رو به Method Pointer تعریف شده اختصاص میدید هم آدرس شئ و هم آدرس اون متد ذخیره میشه و در هنگام فراخوانی کامپایلر دقیقا میدونه باید به فلان متد از فلان شئ از فلان کلاس مراجعه کنه .
موفق باشید .
vBulletin® v4.2.5, Copyright ©2000-1403, Jelsoft Enterprises Ltd.