PDA

View Full Version : سوال: چرا کامپوننتی درحال طراحی تغییرات را درست نشان میدهد اما هنگام اجرا کار خودش را میکند؟



ariopax
شنبه 12 مهر 1393, 00:39 صبح
سلام خدمت همه ی دوستان .


برای شمسی کردن تقویم کامپوننت TMS Intraweb تغییراتی در یونیت IWTMSCAL.Pas داده ام .تغییرات در متد paint وcreate میباشد.هنگامی که یک نمونه از آن کامپوننت را روی فرم میگذارم .تمامی تغییرات (ازجمله تعداد روزها درماه ) و نشان دادن روز وماه وسال شمسی درست است .اما هنگامی که برنامه را اجرا میکنم .تعداد روزها در ماه به همان صورت میلادی نمایش داده میشوند.یعنی :

adaysinmonth:array[1..13] of word = (31,28,31,30,31,30,31,31,30,31,30,31,29);

درضمن بگویم که تعداد روزها در متد iwpaint درتقویم چیده میشوند.

از دوستان عزیز تقاضای کمک و راهنمائی دارم.

یوسف زالی
شنبه 12 مهر 1393, 01:53 صبح
سلام. دو تا احتمال داره:
1- استفاده از ComponentState در سورس کامپوننت
2- استفاده از هک کامپوننت

روش اول رو با جستجو می تونید حل کنید. روش دوم خیلی داستان داره و همیشه به راحتی قابل حل نیست. گاهی هیچ راهی نداره!

بگردید ببینید کدومشه.

ariopax
شنبه 12 مهر 1393, 21:13 عصر
سلام

در سورس یونیت جستجو کردم .متاسفانه از ComponentState استفاده نکرده.

حالا اگه بخوام MonthDays که در SysUtils تعریف شده ودراین کامپوننت uses شده رو تغییر بدم .چکارباید بکنم .من حتی یه کامپوننت از روی تقویم vcl ایجادکردم و یک ثابت بنام monthdays با تعداد روزهای شمسی تعریف کردم .ولی تعدادروزها همون میلادی موند.بنظرم اگه بتونم این متغییر رو تغییر بدم .ودر create استفاده کنم حل بشه .اگه امکان داره طریقه تغییر این ثابت رو بفرمائید.
MonthDays: array [Boolean] of TDayTable =
((31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29),
(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 30));

باتشکر

یوسف زالی
یک شنبه 13 مهر 1393, 01:05 صبح
اگر می خواهید چیزی رو که از یک یونیت دیگه داره میاد تغییر بدید دو تا راه دارید:
1- نام یونیت خودتون رو در هر کجا که داره استفاده می شه قبل از اون چیز قرار بدید. مثلا MyUnit.Days
2- نام یونیت خودتون رو بعد از نام یونیت مورد نظر در uses اضافه کنید!!!!

ariopax
یک شنبه 13 مهر 1393, 01:43 صبح
سلام
کاردوم رو انجام دادم ولی چرا جواب در دو دستور متفاوته ؟

ShowMessage('Days in February 2014 = '+IntToStr(DaysInAMonth(2014, 2)));
ShowMessage('Days in February 2014 = '+IntToStr(MonthDays[IsLeapYear(2014)][2]));



جواب اولیه =29
جواب دومی =31
آیا این ثابت در sysutil تغییر کرده است یا خیر؟اگر کامپوننتی که از این ثابت تعداد روزها را میگیرد.31 را محاسبه خواهد کرد یا 29 را؟

ariopax
یک شنبه 13 مهر 1393, 02:05 صبح
سلام مجدد

یه کامپوننت از روی کامپوننت تقویم دلفی درست کردم .در اونجا monthdays رو برای فوریه 31 نمایش میدهد.اما تقویم 28 روز را نمایش میدهد.پس فکر من اشتباه بود وباید دنبال راه دیگه ای بود.لطفا درمورد روش دوم (هک کامپوننت ) راهنمائی فرمائید.

ariopax
یک شنبه 13 مهر 1393, 19:22 عصر
سلام
من یه خصوصیت فقط خواندنی بنام Fmonthday در publish کامپوننت موردنظر ایجادکردم و در Create آنرا مقداردهی کردم .که برای ماههای مورد نظر هنگامی که کامپوننت را روی فرم میگذارم دقیقا همان چیزی است که من میخواهم .حتی آنرا توسط Showmessage بعدازاجرای برنامه وهنگلامی که تعداد روزها در تقویم تغییر کرده تریس کردم همان تعدادروزهای موردنظر رانمایش میدهد درصورتیکه تقویم در حال نمایش 31 روز است .
آیا ازاین خصوصیت استفاده نشده ؟

ariopax
دوشنبه 14 مهر 1393, 19:29 عصر
سلام خدمت دوستان

من متوجه شدم که این کامپوننت چون از نوع اینتراوب است .تابعRenderHTML هنگام اجرا فراخوانی میشودودراین تابع نیز ازفایل Resource بااستفاده ازدستورGetResourceTextاستفاده کرده .اما من به محض باز کردن فایل مربوطه وحتی بدون تغییر نیز نمیتوانم کامپوننت را کامپایل کنم.

راهنمائی لطفا