PDA

View Full Version : چطور میشه، به جای self ، از this استفاده کرد؟



Developer Programmer
سه شنبه 20 اسفند 1387, 11:16 صبح
میخواستم یه پراپرتی به اسم this تعریف کنم که مشابه self رفتار کنه

اینطوری تعریفش کردم


public
Form1: TForm1;
Property This : TForm1 read Form1 write Form1;
end;

var
Form1: TForm1;


با وجود اینکه Form1 دوبار تعریف شده، اما کامپایل میشه. اینطور تعریف کردن و استفاده از اون safe هست یا نه ؟

shervin farzin
سه شنبه 20 اسفند 1387, 12:17 عصر
سلام
از اونجايي كه مي خوايد This به Form1 اشاره كنه بايد نوع fThis رو هم از TForm1 انتخاب كنيد
همينطور مولفه هاي Proprty هم تغيير ميكنن .

private
fThis: TForm1;
public
property This: TForm1 read fThis Write fThis;

در مورد Connetion هم كه در بخش Public نوشتيد متجه نشدم كه خودتون سعي كردي يه
Connection بسازيد يا اون كامپوننت رو روي فرم داريد . اگه خودتون ميخوايد بسازيد كه اول
بايد Create بشه ، اگه روي فرم داريد به صورت خودكار اعلانش در بخش Published فرم
اضافه شده و در بخش Public ديگه اونو از شما قبول نميكنه .
موفق باشيد .

AliReza Vafakhah
سه شنبه 20 اسفند 1387, 14:01 عصر
میخواستم یه پراپرتی به اسم this تعریف کنم که مشابه self رفتار کنه

اینطوری تعریفش کردم


public
Form1: TForm1;
Property This : TForm1 read Form1 write Form1;
end;

var
Form1: TForm1;


با وجود اینکه Form1 دوبار تعریف شده، اما کامپایل میشه. اینطور تعریف کردن و استفاده از اون safe هست یا نه ؟

میشه دلیل این کار رو بگید آیا کنجکاوی هست که از this و مثل c عمل کنید ؟

vcldeveloper
سه شنبه 20 اسفند 1387, 17:25 عصر
از اونجايي كه مي خوايد This به Form1 اشاره كنه بايد نوع fThis رو هم از TForm1 انتخاب كنيد
برای کامپایل فرقی نمیکنه که شما فیلد مربوطه را با اسم fThis تعریف کنید، یا Form1. این فقط یک Convention هست که برای تعریف فیلد وابسته به یک property، به اول نام property حرف F اضافه می کنند.


میخواستم یه پراپرتی به اسم this تعریف کنم که مشابه self رفتار کنه
Self یک property عادی که جایی در کدهای TObject یا هر کلاس دیگه تعریف شده باشه، نیست! بلکه یک keyword زبان دلفی هست، و کامپایلر دلفی مفهوم آن را با توجه به کدی که در آن از Self استفاده شده، تعیین میکنه.
Self همیشه به نمونه شی ساخته شده از کلاس مربوطه اشاره میکنه، در حالی که Form1 تعریف شده در کلاس تو، به یک شی غیر از شی ایی که خودش در آن تعریف شده، اشاره میکنه. یعنی:

اگر من بنویسیم:

MyForm := TForm1.Create(nil);
در اون صورت، MyForm.This به MyForm اشاره نمیکنه، بلکه مقدارش nil هست. اگر هم به فرض در داخل constructor مربوط به TForm1 اینطوری بنویسم:


constructor TForm1.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Form1:= Self;
end;

مقدار This میشه همون MyForm. در اون صورت هم نیازی به This ندارم، چون MyForm را دارم. در واقع Self خارج از کدهای یک کلاس، برای کلاس های خارج آن کلاس مفهومی نداره.

اگر توضیح بدی که دقیقا هدفت از این کار چی هست، میشه راهکاری ارائه کرد.

shervin farzin
سه شنبه 20 اسفند 1387, 17:33 عصر
برای کامپایل فرقی نمیکنه که شما فیلد مربوطه را با اسم fThis تعریف کنید، یا Form1. این فقط یک Convention هست که برای تعریف فیلد وابسته به یک property، به اول نام property حرف F اضافه می کنند.
بله آقاي كشاورز ، متوجهم ، ولي منظور من اين نبود . كدي كه الان در پست 1 قرار داره اوني
نيست كه من بهش جواب دادم . احتمالا دوستمون اون كد رو تغيير دادن .

Developer Programmer
سه شنبه 20 اسفند 1387, 19:18 عصر
آیا کنجکاوی هست که از this و مثل c عمل کنید ؟

اگر توضیح بدی که دقیقا هدفت از این کار چی هست، میشه راهکاری ارائه کرد.
هدف خاصی ندارم، فقط از اونجایی که تازه گی ها دات نت میخونم و مرتب بین دلفی و دات نت سویچ میکنم.. این وسط، برخی چیزها از جمله this , self , me رو قاطی میکنم.
همینطوری تصمیم گرفتم ببینم میشه چیزی مثل this رو ساخت که در همه پروژه ها یه معنی داشته باشه یا نه.