PDA

View Full Version : سوال: مقداردهی اولیه و کنترل نحوه بارگذاری کامپوننتها



ret_ie
شنبه 22 فروردین 1394, 23:49 عصر
با سلام خدمت تمامی دوستان ارجمندم
مشکلی به شرح زیر دارم و از اساتیدم ممنون میشم کمکم کنند:
یک کامپوننت نوشتم (شما فرض کنید به اسم TQuestion). مستحضرید که متد Constructor این کامپوننت در مواقع زیر اجرا میشه:
1- در حالت Design و وقتی کامپوننت رو از روی Palette می کشید و روی فرم می اندازید
2- وقتی پروژه ای / فرمی که حاوی این کامپوننت هست رو از روی دیسک باز می کنید (Open Saved Project)
3- هنگام Run شدن پروژه

من متد Constructor رو تنظیم کردم تا به برخی از Property های کامپوننت TQuestion مقدار اولیه بده. تلاش بنده این بود که این مقداردهی اولیه تنها در حالت شماره 1 ذکر شده انجام بشه. اما با وجودیکه اطمینان دارم مقادیر این Propertyها در فایل DFM ذخیره (یا همون Stream) شدند، اما هربار که پروژه باز میشه (حالت شماره 2) و قبل از اجرا (حالت شماره 3) بازهم مقادیر پیش فرض جایگزین مقادیر Set شده میشه و داستانی میشه که حدسش دور از ذهن بزرگوارانم نیست.

چطور میتونم بین حالتهای 1 تا 3 فوق تفاوت قایل شم. البته اینو بگم که افزودن شرط (if csDesigning in ComponentState) هم بی فایده بوده...

یوسف زالی
یک شنبه 23 فروردین 1394, 00:38 صبح
سلام.
یک کامپوننت هم در زمان طراحی و هم در زمان اجرا سازندش رو ران می کنه.
بین این دو زمان می شه با همون شرطی که گفتید تفاوت قائل شد.
احتمال خیلی زیاد مشکل از همون DFM باشه.
وقتی کامپوننت رو روی فرم گذاشتید و مقادیر رو ست کردید، روی فرم راست کلیک کنید ببینید همه چیز در اون ست شده یا نه.
این کار رو می تونید در خود فایل هم ببینید.
اگر ست شده باشه، اول متد سازنده کامپوننت فراخوانی می شه، کدهای درون متد و پیش فرض ها لود می شوند، بعد می ره سراغ تک تک مقادیر DFM .
اگر مشکل در DFM نبود، سورس رو بدید بررسی کنم.

ret_ie
جمعه 04 اردیبهشت 1394, 09:55 صبح
جناب you-See عزیز و سایر دوستانی که احیانا به هر دلیلی این مطلب رو خوندید.
بالاخره بعد هفته ها زیر و رو کردن و دیباگ کردن کد ، فهمیدم مشکل چی بود. وظیفه دونستم با شما در میان بزارم:
در خصوص Property های نوع String ، دلفی مقدار رشته تهی رو در DFM ذخیره نمی کنه. یعنی اگه آبجکت شما یک Property به نام مثلا PicturePath داشته باشه و در Constructor مقدار اون رو به xxx تغییر بدید: هر بار که تو Formها مقدار این Property رو بزارید "" اون وقت مقداری که در RunTime مشاهده می کنید همون xxx هست. یعنی مقادیر رشته تهی در DFM ذخیره نمی شن.

ehstrn2010
شنبه 05 اردیبهشت 1394, 10:49 صبح
اگر اشتباه نکنم:
کلیه مقادیر پیش فرض ذخیره نمی شوند - شما می توانید مقدار پیش فرض را تعیین کنید (البته این مقدار ارتباطی به بارگذاری مقادیر ندارد ، شما همچنان باید مقادیر اولیه را بارگذاری کنید) - به کد زیر نگاه کنید:

property color_Footer_1:tcolor read Ffootercolor1 write Ffootercolor1 default clwhite;
property color_Footer_2:tcolor read Ffootercolor2 write Ffootercolor2 default clSilver;
property color_Footer_style:TgradiantStyle read Fcolor_Footer_style write Fcolor_Footer_style default TgradiantStyle(0);
property Font_Footer:Tfont read Ffooterfont write setfooterfont stored true;

ret_ie
یک شنبه 06 اردیبهشت 1394, 23:36 عصر
اگر اشتباه نکنم:
کلیه مقادیر پیش فرض ذخیره نمی شوند - شما می توانید مقدار پیش فرض را تعیین کنید (البته این مقدار ارتباطی به بارگذاری مقادیر ندارد ، شما همچنان باید مقادیر اولیه را بارگذاری کنید) - به کد زیر نگاه کنید:

property color_Footer_1:tcolor read Ffootercolor1 write Ffootercolor1 default clwhite;
property color_Footer_2:tcolor read Ffootercolor2 write Ffootercolor2 default clSilver;
property color_Footer_style:TgradiantStyle read Fcolor_Footer_style write Fcolor_Footer_style default TgradiantStyle(0);
property Font_Footer:Tfont read Ffooterfont write setfooterfont stored true;

دوست عزیزم، ممنون از اینکه در بحث من شرکت کردید. اما اتفاقا من هم استفاده از stored رو تست کردم و نتیجه همچنان همان بود. در نهایت تنها کاری که تونستم انجام بدم استفاده از یک space به جای رشته تهی در propertyها بود...