PDA

View Full Version : سوال: index و default در property



php_qq
دوشنبه 15 شهریور 1389, 18:12 عصر
سلام به همگی
من داشتم لینک زیر که در مورد property بود یه نیگا مینداختم ولی اون قسمتی که در مورد index بود رو نفهمیدم یعنی نفهمیدم این ایندکس که استفاده کرده توی مثالش بدرد چه می خوره اگه نباشه چی میشه!


http://www.delphibasics.co.uk/RTL.asp?Name=Property

و اینکه می شه یه مثال ساده بزنید که استفاده از default و nodefault رو هنگام استفاده از property متوجه شم! یادم رفته :بامزه: و اینکه اگر default یا nodefault رو ننویسیم کدوم رو در نظر می گیره؟

(اگه میشه یکم توضیح بدید چون امکان اجرای کد رو در حال حاضر ندارم)
مرسی :لبخند:

vcldeveloper
چهارشنبه 17 شهریور 1389, 00:36 صبح
اون Index ایی که در اون مثال استفاده شده، در جاهای مختلف کارکرد مختلف داره. اون Index هایی که به صورت زیر نوشته میشه:

Property Name : Type Index Constant write Setter;
در واقع برای زمانی هست که شما بخواید از یک متد به عنوان متد getter یا setter چند property استفاده کنید، و برای هر کدومشون یک متد جدید تعریف نکنید.
در اون مثال، اون Property ها ایندکس گزاری شدند، و همگی از متد GetCoords به عنوان Getter استفاده می کنند. متد GetCoords برای اینکه متوجه بشه مقدار کدوم property باید برگشت داده بشه، از اون Index استفاده میکنه. معمولا این روش به ندرت استفاده میشه.

یک حالت دیگه، این هست:

Property Name[Index : IndexType] : BaseType read Getter;

اینجا به جای عبارت Index شما می تونید اسم هر متغیری رو قرار بدید. این یک خصوصیت ایندکس دار هست، که مثل یک آرایه عمل میکنه، یعنی مقداری که شما از طریق پارامتر Index به این خصوصیت میدید، مشخص میکنه که چه مقداری باید توسط خصوصیت برگشت داده بشه. از این حالت زیاد استفاده میشه، بخصوص در کلاس هایی که به صورت List یا Collection هستند.


اینکه می شه یه مثال ساده بزنید که استفاده از default و nodefault رو هنگام استفاده از property متوجه شم! دو نوع default داریم؛ یک حالت default ایی هست که بعد از آخرین سیمی کالن گذاشته میشه:

Property Name[Index : IndexType] : BaseType write Setter; default;
این یعنی، این خصوصیت، خصوصیت پیش فرض این کلاس هست، و اگر شما در هنگام استفاده از این کلاس، نامی برای خصوصیت مربوطه ننویسید، دلفی به طور پیش فرض، اینطور در نظر میگیره که شما دارید از این خصوصیت استفاده می کنید. این حالت فقط برای خصوصیات ایندکس دار قابل استفاده هست. در همون مثال، خصوصیت Coords به صورت پیش فرض تعریف نشده، ولی اگر به صورت پیش فرض تعریف می شد، شما می تونستید به جای نوشتن:


MyRect.Coords[0]بنویسید:

MyRect[0]خصوصیت default که قبل از آخرین سیمی کالن درج بشه، فقط برای خصوصیت ordinal معتبر هست، و مقدار پیش فرض اون خصوصیت را تعیین می کنه. البته این مقدار پیش فرض فقط برای تعیین چگونگی ذخیره کردن مقدار خصوصیت در فایل DFM هست؛ یعنی به دلفی میگه که اگر مقدار این خصوصیت، همین مقدار پیش فرض بود، لزومی نداره که در فایل DFM مقدارش ذخیره بشه، ولی اگر نبود، باید مقدار خصوصیت ذخیره بشه. دقت کنید که این به معنی آن نیست که هر مقداری شما اینجا قرار بدید، کلاس به طور خودکار آن خصوصیت را برای شما با آن مقداردهی بکنه!
حالت پیش فرض دلفی برای این کار nodefault هست، یعنی مقدار خصوصیت را، در هر شرایطی، در DFM ذخیره کنه.

خصوصیت stored مشخص میکنه که آیا اصلا مقدار اون خصوصیت باید در DFM ذخیره بشه یا نه، اگر Stored مساوی False باشه، دلفی مقدار اون خصوصیت رو اصلا در DFM ذخیره نمیکنه. به طور پیش فرض، مقادیر خصوصیات (البته خصوصیاتی که در published تفریف شده باشند) در DFM ذخیره میشند.

SAASTN
چهارشنبه 17 شهریور 1389, 21:31 عصر
خصوصیت default که قبل از آخرین سیمی کالن درج بشه، فقط برای خصوصیت ordinal معتبر هست، و مقدار پیش فرض اون خصوصیت را تعیین می کنه. البته این مقدار پیش فرض فقط برای تعیین چگونگی ذخیره کردن مقدار خصوصیت در فایل DFM هست؛ یعنی به دلفی میگه که اگر مقدار این خصوصیت، همین مقدار پیش فرض بود، لزومی نداره که در فایل DFM مقدارش ذخیره بشه، ولی اگر نبود، باید مقدار خصوصیت ذخیره بشه. دقت کنید که این به معنی آن نیست که هر مقداری شما اینجا قرار بدید، کلاس به طور خودکار آن خصوصیت را برای شما با آن مقداردهی بکنه!
یه توضیح اضافی: توی ObjectInspector اگه دقت کرده باشید(حتما دقت کردید!) مقادیر بعضی از property ها با خطوط ذخیم یا Bold نوشته شدن و بعضی مقادیر با خطوط نازک و معمولی. property های که مقدار default برای اونها تعریف شده باشه و مقدارشون برابر default باشه با خطوط نازک نوشته می شن و property هایی که Default برای اونها تعریف نشده باشه یا مقدارشون برابر Default نباشه با خطوط ضخیم نوشته می شن.