ورود

View Full Version : مشکل در Override رویداد OnEnter یک Edit



volvo B12
یک شنبه 08 شهریور 1388, 03:29 صبح
با سلام
من یک کامپوننت جدیدی می خوام بنویسم که لازم دارم رویدادهای OnEnter و OnChangeو OnExit کلاس پایه اون که یک TEdit هست رو OVerride کنم اما دلفی اجازه override رو برای رویدادهای onenter و onexit نمی ده؟
چه طور می شه این دو رویداد رو نوشت؟
پیغام خطای هنگام کامپایل :
Method 'Enter' not found in base class
ضمنا تعریف رویداد را هم به صورت زیر انجام دادم :
public
{ Public declarations }
Constructor Create(AOwner : TComponent); Override;
procedure Enter; Override;


با تشکر

volvo B12
دوشنبه 09 شهریور 1388, 01:13 صبح
بابا فعال های این سایت قبلا خیلی فعال تر بودن:قهقهه:
دوستان هیچ کس نیست که بتونه ما رو کمک کنه:ناراحت:
اگه کسی لطف کنه و بگه واسه نوشتن و Override رویدادهای OnEnter و OnExit کامپوننتی که از یک TCustomEdit ارث بری کرده چی کار باید کرد ممنونش میشم:بوس:

vcldeveloper
دوشنبه 09 شهریور 1388, 02:58 صبح
دوستان هیچ کس نیست که بتونه ما رو کمک کنه
شما می دونید override کردن یک متد در یک کلاس یعنی چی؟ یعنی ملغی کردن یک متد Virtual موجود در یک کلاس پایه توسط کلاس فرزند، و جایگزینی آن متد با یک متد دیگه. پس باید برای override کردن یک متد دو شرط وجود داشته باشه:
1- همچین متدی اصلا در کلاس پایه وجود داشته باشه.
2- طراح کلاس پایه آن متد را بصورت virtual یا dynamic تعریف کرده باشه، تا کلاس های فرزند بتوانند آن را override کنند.

وقتی یکی از این دو شرط واقع نشده باشه، override کردن متد معنی نمیده. شما متد Enter در کد بالا را از کجا آوردید؟! توی کلاس TEdit یا کلاس های والد آن همچین متدی می بینید؟! همینطوری که نمیشه شما یک اسمی بنویسید و به کامپایلر بگید، Overrideاش کن!



واسه نوشتن و Override رویدادهای OnEnter و OnExit کامپوننتی که از یک TCustomEdit ارث بری کرده چی کار باید کرد
رویداد را override نمی کنند، بلکه اول سعی می کنند بررسی کنند مکانیزم فراخوانی آن رویداد چی هست، یعنی چه چیزی باعث فراخوانی آن رویداد میشه، و آن چیز توسط آن کلاس به چه شکلی مدیریت میشه. اگر در روال مدیریت آن متدی برای override وجود داشت، آن را override می کنند، وگرنه، سعی می کنند عامل ایجاد رویداد را قبل از آنکه به کلاس پایه برسد، و پردازش شود، خودشان پردازش کنند.

برای TCustomEdit، در صورت ورود یا خروج به کنترل مربوطه، پیام CM_ENTER و CM_EXIT تولید میشند. پس یک راه نوشتن message handler برای این پیام ها هست.
اما خودِ TCustomEdit برای کنترل مکانیزم فراخوانی OnEnter و OnExit از دو متد DoEnter و DoExit که بصورت dynamic در کلاس والد آن (TWinControl) تعریف شدند، استفاده میکنه.

شرط ابتدایی نوشتن کامپوننت این هست که شما اول با کلاسی که میخواید ازش کامپوننت جدید را مشتق بگیرید، آشنا باشید، و طرز کارش را بدانید، نه اینکه بر اساس حدس و گمان کار کنید.

volvo B12
جمعه 13 شهریور 1388, 00:01 صبح
با سلامی مجدد
طبق معمول همیشه باز هم آقای کشاورز کاربر بی تجربه ای مثل من رو شرمنده کردن :تشویق:
همونطور که گفته بودم من می خوام کامپوننت Edit رو واسه برنامه هام جهت گرفتن مقادیر مثبت و منفی عددی (شامل اعشاری) سفارشی کنم ضمن اینکه دوست دارم هنگام تایپ عدد یه بالون که اون هم سفارشی هستش روی Edit نمایش داده بشه و معادل حروفی اون رو برام بنویسه
نسخه ساده و ابتدایی این کامپوننت قابل توسعه رو (در حقیقت فایل pas. اون رو) همراه با یک فایل DLL شامل توابع مورد نیاز برنامه اینجا گذاشتم و توضیحات مورد نیاز رو هم داخلش دادم لطفا پس از بررسی اون اگر ایده ای برای کاراتر و مفیدتر شدن این کامپوننت دارید نظر بدید.
اگر هم کسی اون رو توسعه داد لطفا برای بقیه هم آپلودش کنه. :تشویق:
با این کار حداقل به افرادی مثل آقای کشاورز می گیم ما متوجه زحمات شما هستیم.
از ته دل می گم : ممنون :چشمک:

volvo B12
جمعه 13 شهریور 1388, 00:20 صبح
ضمنا شاید بد نباشه بگم اون فایل DLL ای رو که در پست قبل همراه برنامه کامپوننت ادیت سفارشی فرستادم شامل 21 تابع و روال کاربردی و بهینه است.
یک فایل pdf شامل توابع اون Dll رو براتون اینجا گذاشتم میتونید از این فایل dll در برنامه هاتون به راحتی استفاده کنید.
توجه داشته باشید که اون dll بارها تست شده و تمامی توابع به صورت stdcall تعریف شده اند.
یک مثال کوچک برای استفاده از توابع و روال های مذکور :

نحوه تعریف تابع در dll
Function AttachDataBase(DBName, MDFNmae, LDFName : String; ADOQ : TADOQuery): Boolean; export; StdCall;

نحوه استفاده در برنامه (یک روش ساده)
Function AttachDataBase(DBName, MDFNmae, LDFName : String; ADOQ : TADOQuery): Boolean; export; StdCall; External 'CommonFunctions.dll';

نکات :
استفاده از یونیت sharemem در قسمت Usesهای پروژه
کپی فایل dll به همراه فایل borlndmm.dll در شاخه جاری یا شاخه سیستم ویندوز
تعریف تابع می تونه در جایی مثل public یا قبل از implementation باشه
چه قشنگ می شه اگه در دیتا ماژول برنامتون توابع رو تعریف کنید

هدف :
فقط تشکر بالاخص از آقای کشاورز :چشمک:

vcldeveloper
جمعه 13 شهریور 1388, 01:09 صبح
استفاده از یونیت sharemem در قسمت Usesهای پروژه
کپی فایل dll به همراه فایل borlndmm.dll در شاخه جاری یا شاخه سیستم ویندوز
تعریف تابع می تونه در جایی مثل public یا قبل از implementation باشه
چه قشنگ می شه اگه در دیتا ماژول برنامتون توابع رو تعریف کنید
از چه نسخه ایی از دلفی استفاده می کنید؟ اگر از نسخه های جدید استفاده می کنید (دلفی 2007 به بعد)، بجای ShareMem از SimpleShareMem استفاده کنید، تا هم مجبور نباشید borlandmm.dll را با برنامه منتقل کنید، هم کارایی برنامه شما بخاطر استفاده از ShareMem به مقدار زیادی کاهش پیدا نکنه.

هر چند ایده وابسته کردن یک کنترل مثل Edit به وجود یک DLL کار جالبی نیست، و برای این کار در دلفی از Package استفاده میشه، تا در صورت استفاده کاربر از اون Edit، نیاز به هیچ DLL ایی نباشه.

volvo B12
شنبه 14 شهریور 1388, 01:24 صبح
با سلام مجدد و آرزوی قبولی طاعات و عبادات

از چه نسخه ایی از دلفی استفاده می کنید؟
من از دلفی 7 استفاده می کنم؟

اگر از نسخه های جدید استفاده می کنید (دلفی 2007 به بعد)، بجای ShareMem از SimpleShareMem استفاده کنید، تا هم مجبور نباشید borlandmm.dll را با برنامه منتقل کنید، هم کارایی برنامه شما بخاطر استفاده از ShareMem به مقدار زیادی کاهش پیدا نکنه.

بله همونطور که شما گفتید و تا اونجایی که اطلاعات اندک من جواب می ده چاره ای نیست که کاربر برنامه نویس برای استفاده از این جور کامپوننتها (دارای کلی تابع و روال) که از DLL (شامل اون توابع و روالها) استفاده می کنند یونیت مذکور رو به صورت دستی در یونیت اصلی پروژه use کنه!
حالا با حرف شما

برای این کار در دلفی از Package استفاده میشه، تا در صورت استفاده کاربر از اون Edit، نیاز به هیچ DLL ایی نباشه.
(البته اگه درست متوجه شده باشم) توی پکیجی که برای کامپوننت درست می کنیم باید تمامی توابع و روال های (مورد نیاز) داخل dll رو با ساختارشون کپی کنیم!!!
یا نه منظورشما اینه که یونیت مربوط به کامپوننت رو در کنار یونیت مربوط به dll بذاریم و اونها رو باهم pak کنیم!!!
در هر دو صورت مزیتش نسبت به روش قبلی چیه؟
این همه درسر فقط واسه خاطر منتقل نکردن dll ؟
یا نه نکته فنی دیگه ای هست که طبق معمول ما نمی دونیم؟
اگه فهم من از منظور شما درست نیست چطور می شه پکیج مورد نظر شما (شامل dll و یونیت های مورد نیاز) رو با دلفی 7 درست کرد؟

vcldeveloper
شنبه 14 شهریور 1388, 02:25 صبح
در هر دو صورت مزیتش نسبت به روش قبلی چیه؟
این همه درسر فقط واسه خاطر منتقل نکردن dll ؟
یا نه نکته فنی دیگه ای هست که طبق معمول ما نمی دونیم؟
اگه فهم من از منظور شما درست نیست چطور می شه پکیج مورد نظر شما (شامل dll و یونیت های مورد نیاز) رو با دلفی 7 درست کرد؟
Package در دلفی یک مفهوم خاص داره، و منظور از آن این نیست که یک سری چیز در کنار هم Pack شوند. Package در دلفی نوع خاصی از DLL هست که قابلیت های بیشتری نسبت به یک DLL استاندارد دارد. به عنوان مثال، تمام کامپوننت هایی که شما در دلفی نصب می کنید، در Packageهایی قرار دارند.

مزیت Package نسبت به یک DLL استاندارد اولا این هست که مدیریت حافظه با برنامه استفاده کننده یکپارچه هست؛ ثانیا امکان تعریف کلاس و استفاده از کلاس ها بطور مستقیم در برنامه استفاده کننده وجود داره، ثالثا در صورت استفاده از Package اختیار با برنامه نویس هست که آیا Package با برنامه روی سیستم مقصد منتقل بشه یا نه: اگر برنامه با فعال بودن گزینه Build for runtime packages کامپایل بشه، به Package نیاز هست، و اگر این گزینه غیر فعال باشه (گزینه پیش فرض)، دلفی فقط اون بخش هایی از کد Package که در فایل EXE استفاده شده را به فایل EXE لینک میکنه، در نتیجه از یک طرف کدهای استفاده نشده در برنامه با برنامه منتقل نمیشه، و از طرف دیگه، نیازی به انتقال Package به سیستم کاربر نخواهد بود.

علت اینکه در برنامه های عادی دلفی شما نیازی به فایل های جانبی ندارید، و فقط یک فایل EXE را به سیستم مقصد منتقل می کنید، همین Package ها هستند. تمام کامپوننت های استاندارد دلفی و تمام کامپوننت های دیگه ایی که شما روی دلفی نصب می کنید، بصورت Package هستند.

درباره Package ها قبل از این زیاد بحث شده، می تونید به همان بحث های گذشته مراجعه کنید.

volvo B12
سه شنبه 17 شهریور 1388, 00:15 صبح
با سلامی مجدد
آقای کشاورز ضمن تشکر مجدد اگر یک لینک خوب و یا راهنمای تر و تمیز راجع به packageها دارید اون رو هم مرحمت بفرمائید. خیلی مشتاق شدم برم تو خط packageها. چرا که با گفته شما یکی از مزایای بزرگش تخصیص حافظه اشتراکی بین برنامه و dll ما هستش و این خیلی به درد می خوره.

مزیت Package نسبت به یک DLL استاندارد اولا این هست که مدیریت حافظه با برنامه استفاده کننده یکپارچه هست؛
در مجموع با اوصافی که شما کردید، بر خلاف گذشته باید بپرسیم با وجود package ها چه دلیلی واسه تولید و استفاده از dll یا کامپوننت وجود داره؟

vcldeveloper
سه شنبه 17 شهریور 1388, 01:20 صبح
در مجموع با اوصافی که شما کردید، بر خلاف گذشته باید بپرسیم با وجود package ها چه دلیلی واسه تولید و استفاده از dll یا کامپوننت وجود داره؟
Package یک نوع فرمت اختصاصی برای دلفی و C++ Builder هست، در سایر زبان ها نمی تونید از آنها استفاده کنید؛ برای همین همچنان از DLL استفاده میشه، چون DLL وابسته به زبان خاصی نیست.

بحث کامپوننت جدا از Package نیست، همانطور که قبلا هم گفتم، هر کامپوننت در دلفی برای اینکه نصب بشه، باید در یک Package قرار داشته باشه؛ تمام کامپوننت هایی که شما در دلفی از آنها استفاده می کنید، در داخل Package هایی قرار دارند. Package های کامپایل شده دلفی پسوند BPL دارند، و شما می تونید Package های استاندارد دلفی را در پوشه System32 ویندوز خودتان پیدا کنید. Packageهای مربوط به کامپوننت هایی که خودتان نصب می کنید، معمولا در پوشه BPL دلفی ساخته میشند. مسیرش از داخل تنظیمات دلفی قابل تغییر هست.
اگر پروژه بصورت run with runtime packages کامپایل بشه، باید فایل های BPL استفاده شده در برنامه را با برنامه به سیستم کاربر منتقل کنید، وگرنه هر کدی که در هر Package ایی در برنامه استفاده شده باشه، دلفی آن را به فایل EXE لینک میکنه، تا فایل EXE برای اجرا نیاز به فایل دیگه ایی نداشته باشه.

درباره Package ها در همین تالار دلفی سایت صحبت شده، و مقاله معرفی شده.

volvo B12
سه شنبه 17 شهریور 1388, 01:57 صبح
ضمن تشکر از آقای کشاورز
به عنوان آخرین بحث در این تاپیک می شه یه توضیحی هم راجع به کامپوننتهای ترکیبی و یا همون superComponentها بدید؟
اگر هم مثالی ساده ولی کاربردی از این نوع کامپوننتها دارید (چه حرفیه حتما دارید!!!) محبت کنید و اونو برامون بفرستید.
فکر می کنم بررسی مثالها راه خوبیه برای هجرت از سطح مبتدی به سطح متوسط اونم کامپوننتی که توسط استاد بزرگ دلفی آقای کشاورز نوشته شده باشه:چشمک:

vcldeveloper
سه شنبه 17 شهریور 1388, 14:44 عصر
می شه یه توضیحی هم راجع به کامپوننتهای ترکیبی و یا همون superComponentها بدید؟
متوجه منظورتون نمیشم. منظورتون کلاس هایی هست که بصورت Composite یا Aggregate با هم در ارتباط هستند؟

volvo B12
پنج شنبه 19 شهریور 1388, 23:27 عصر
با سلامی مجدد خدمت استاد بزرگ جناب کشاورز عزیز

متوجه منظورتون نمیشم.
منظورم یه چیزی مثل توضیحات این لینک هستش :
http://www.barnamenevis.org/forum/showthread.php?t=129927
البته دوستمون توی پست مذکور در لینک بالا زحمات زیاد و البته بسیار مفیدی کشیدند ولی من به چیزی شبیه یک PersianCalendar نیاز دارم. کامپوننتی که خود از حدود 30 button , یک Panel و چند Label و دو Edit و چند کامپوننت دیگر از این دست تشکیل شده است. که البته هر کدوم از اونها کلی متد و رویداد نیاز دارند.
فکر می کنم به این جور کامپوننتها Super Component میگن.
توی راهنمای برادر عزیزمون راهمنایی های خیلی زیادی راجع به رویدادهای زیر کامپوننتها نشده.
البته فکر می کنم یک مثال جامع ولی ساده کار آموزش های چند ده صفحه ای رو تو این زمینه می کنه.
ممنون

vcldeveloper
شنبه 21 شهریور 1388, 02:55 صبح
منظورم یه چیزی مثل توضیحات این لینک هستش
این یک قابلیت ساده IDE دلفی هست که می تونید چند کنترل را به شکل دلخواه روی یک کنترل Container بچینید، و با راست-کلیک بر روی آن، این مجموعه را بصورت یک کامپوننت در Repository دلفی ذخیره کنید.

البته در لینک اون مطلب اومده کار را گسترش داده، و یک سری از رویدادها و خصوصیات کامپوننت های فرزند را هم توسط کامپوننت ارائه کرده که به این کار میگن Decorate کردن.

برای کار شما، بستگی داره که دقیقا چیکار می خواید بکنید. می تونید کنترل هایتان را در زمان اجرا بسازید، یا از کد کامپوننت هایی مثل تقویم فارسی آقای خورسندی الگوبرداری کنید.

volvo B12
یک شنبه 22 شهریور 1388, 02:08 صبح
با سلام مجدد


برای کار شما، بستگی داره که دقیقا چیکار می خواید بکنید.

من می خوام یه کامپوننت تقویم درست کنم که امکاناتی نظیر امکانات ذیل را داشته باشه:
تواریخ شمسی - قمری - میلادی
امکان انتخاب چند روز از یک ماه توسط کاربر و بازگردانی روزهای انتخاب شده
امکان اتصال به دیتابیس جهت خواندن روزهای تعطیل و مناسبتهای هر تعطیلی
امکان سفارشی سازی این کامپوننت توسط کاربران برنامه ساز و کاربر نهایی(البته بعضی از خصیصه ها)
و ...

از کد کامپوننت هایی مثل تقویم فارسی آقای خورسندی الگوبرداری کنید.
این کامپوننت رو پیدا نکردم اگه می شه لینکش رو بذارید اما چند نمونه کامپوننت مرتبط دیدم تقریبا هیچکدوم امکاناتی که من مد نظرم هست رو ندارن؟
مثلا اغلب از گرید برای نمایش روزها استفاده می کنن (چون کار باهاش ساده هست) اما من می خوام از دکمه واسه این کار استفاده کنم یا استفاده از کمبو باکس برای انتخاب سال که جالب نیست. همه این اشکالات کوچیک یک طرف مهم اونه که در هیچ کامپوننتی به رویدادهای انتخاب یک یا چند روز و یا تغییر ماه و سال پاسخی داده نمی شه!
و از همه مهمتر به نمایش روزهای تعطیل و مناسبتها و مدیریت اونها توسط کاربر (حذف و اضافه روزهای تعطیل) اهمیتی داده نشده
و یا راهکاری برای نمایش یک راهنمای کوچک برای هر روز در نظر گرفته نشده
همه اینها و بسیاری دیگر ضرورت تولید یک کامپوننت کارا را نشان میدهد.
لطفا اگر مثالی در این رابطه دارید از ما دریغ نکنید همونطور که تا به حال از آموزشهاتون مارو بی نصیب نمی زاشتین
بازم ممنون

vcldeveloper
یک شنبه 22 شهریور 1388, 07:35 صبح
من می خوام یه کامپوننت تقویم درست کنم که امکاناتی نظیر امکانات ذیل را داشته باشه:
تواریخ شمسی - قمری - میلادی
امکان انتخاب چند روز از یک ماه توسط کاربر و بازگردانی روزهای انتخاب شده
امکان اتصال به دیتابیس جهت خواندن روزهای تعطیل و مناسبتهای هر تعطیلی
امکان سفارشی سازی این کامپوننت توسط کاربران برنامه ساز و کاربر نهایی(البته بعضی از خصیصه ها)
و ...
سورس کد کامپوننتی با این قابلیت ها در این انجم با نام xCalendar موجود است. کامپوننت توسط یکی از کاربران سایت نوشته شده. می تونید از همان کامپوننت استفاده کنید، یا از سورس آن الگو برداری کنید.

volvo B12
دوشنبه 23 شهریور 1388, 23:57 عصر
با سلامی مجدد خدمت دوستان
در ابتدا لازم می دونم از راهنمایی مثل همیشه مفید آقای کشاورز و معرفی لینک فوق العاده تشکر کنم.
در ادامه بواسطه تشکر و قدردانی از استاد کشاورز کامپوننتی که در ابتدای این پست قصد ساختنش را داشتم و حالا تکمیلش کردم را برای استفاده سایرین و علاقه مندان در سایت قرار می دم.
برای توضیح باید بگم که فایل زیپ ضمیمه شامل سورس اصلی کامپوننت (فایل .pas) به همراه بسته قابل نصب در دلفی 7 است. چنانچه کسی تمایل به مطالعه سورس کد این کامپوننت نداشت تنها کافی است فایل .dpk را نصب نماید.(البته با ایجاد مسیر متناظر در lib دلفی) و چنانچه هدف فردی استفاده از کد این کامپوننت ساده بود کافی است از فایل .pas پیوست استفاده نماید.
این پایان تاپیک حاضر است و خواهشمندم چنانچه تغییرات مفیدی در سورس این کامپوننت دادید آن را برای استفاده سایرین در سایت قرار دهید.
آقای کشاورز خیلی دوست دارم نظر شما را راجع به موارد فنی و غیره این کامپوننت بدانم.
والسلام

vcldeveloper
سه شنبه 24 شهریور 1388, 02:21 صبح
آقای کشاورز خیلی دوست دارم نظر شما را راجع به موارد فنی و غیره این کامپوننت بدانم.
من کد شما را اجرا نکردم که ببینم دقیقا چه کار میکنه، اما با خواندن کد این نکات به ذهنم رسید:

1- خصوصیت Author باید Read-only باشه.

2- وقتی قرار هست مقدار خصوصیت Author از طریق متد GetName خوانده بشه، فیلد FAuthor در کد هیچ کاری انجام نمیده، و باید حذف بشه.

3- متد ShowBaloonTip i همیشه برای کنترل Edit مربوطه به کار گرفته میشه، پس مقدار پارامتر Control آن همیشه Self هست؛ در نتیجه نیازی به وجود این پارامتر نیست.

4- نام خصوصیات را با پیشوند On شروع نکنید. هر چند مجاز به این کار هستید، ولی برنامه نویس دلفی عادت دارد که نام رویداد ها را با پیشوند On ببیند، پس بهتر هست نام خصوصیت OnEnterColor تغییر کند.

5- پارامتر SignedText مربوط به متد DeletePunctuationMarks بصورت Const به متد پاس داده شود:


function TMonyEdit.DeletePunctuationMarks(const SignedText : String) : String;
begin
Result := StringReplace(SignedText,PunctuationMark,[rfReplaceAll, rfIgnoreCase]);
end;


6- متدهای DoEnter و DoExit باید در پایان کارشان inherited را فراخوانی کنند، وگرنه کاربر امکان اختصاص دادن Event-handler به رویدادهای OnEnter و OnExit را نخواهد داشت.

7- در متد Create نیازی به دادن مقدار به خصوصیت Parent نیست. چون در زمانی که Create در حال اجرا ست، مقدار Parent = nil هست.

9- پول در انگلیسی با املای Money نوشته می شود، نه Mony.

10- برای کامپوننت آیکنی که در Component Palette دلفی نمایش داده شود، در نظر نگرفتید.

volvo B12
یک شنبه 29 شهریور 1388, 23:58 عصر
با سلام
اول از همه تشکر از استاد کشاورز به خاطر صرف زمان ارزشمندشون روی کد بنده (اجرش با خدا):چشمک:
دوم اینکه فکر می کنم تاپیک حاضر تاپیک بسیار خلاصه و البته کمی مفید شد برای افراد مبتدی تا مرز متوسط که می خوان یه کامپوننت سفارشی درست کنند اما وقت زیادی برای خواندن مطالب و مراجع مربوطه که بعضا حجیم و پرمطلب اند را ندارند و از طرفی چون کلا کارشون Develop نیست تمایلی به صرف هزینه زیاد برای یادگیری جامع این بحث رو ندارند. امیدوارم اگه مطالب اینجا گره ای از گره هاشون باز کرد استاد کشاورز رو دعا کنند.
سوم اینکه بنده حقیر تذکرات استاد کشاورز را بررسی کردم و مواردی برام لاینحل مونده که در ادامه آوردم. اگه ممکنه توی حل اینها منو راهنمایی کنید.


1- خصوصیت Author باید Read-only باشه.
2- وقتی قرار هست مقدار خصوصیت Author از طریق متد GetName خوانده بشه، فیلد FAuthor در کد هیچ کاری انجام نمیده، و باید حذف بشه.

درسته اما من با ایجاد خصوصیت فقط خواندنی کمی مشکل دارم. واسه همینه که از تابع GetName برای تعیین مقدار Author استفاده کردم.
اگرچه که من با مبانی ساخت خصوصیت فقط خواندنی آشنایی دارم، اما در عمل قادر به انجام آن نیستم.
من می دانم اگر خصوصیتی به شکل زیر تعریف گردد فقط خواندنی است و نمی توان مقدار آن را تغییر داد :
Property Author : String Read FAuthor;

که FAuthor در بخش Private به صورت زیر تعریف شده :
FAuthor : String;

در انتها هم در متد سازنده کلاس، این متغیر را مقدار دهی می کنیم.
اینها مبانی کار بود اما مشکل کار اینجاست که با وجود تعریف خصوصیت مذکور در بخش Published این خصوصیت در Object Inspector نمایش داده نمی شه!!! حالا بیایم یک Write هم به تعریف خصوصیت فوق اضافه کنیم می بینیم که در Object Inspector خصوصیت مورد نظر ظاهر شده ولی افسوس که توسط کاربر مقدار این خصوصیت قابل تغییر است یعنی فقط خواندنی نیست!!!
حال شما بگید برای ایجاد یک خاصیت فقط خواندنی که در لیست Object Inspector بیاید چه باید کرد؟


5- پارامتر SignedText مربوط به متد DeletePunctuationMarks بصورت Const به متد پاس داده شود:

چه دلیلی برای این کار وجود داره؟
شاید چون شما از تابع StringReplace برای انجام عمل مورد نظر استفاده می کنید پیشنهاد Const در نظر گرفتن پارامتر ورودی را دادید. یا نه دلیل دیگه ای داره مثل عدم پردازش روی پارامتر ورودی (SignedText)! یا ...


9- پول در انگلیسی با املای Money نوشته می شود، نه Mony

بیشتر از این خجالتم ندید استاد


10- برای کامپوننت آیکنی که در Component Palette دلفی نمایش داده شود، در نظر نگرفتید.

من نمی دونم چطور می توان این کار رو انجام داد اما تا این حد می دونم که هنگام ساخت بسته یک سری تنظیمات رو می توان اعمال کرد به این صورت که در دیالوگ (پنجره کوچک) Package توسط کلید Options می توان خواصی چون Description فایل و نسخه اون و یا عنوان شرکت و مواردی این چنینی رو مشخص کرد اما آیکن رو نمی دونم؟ اگه ممکنه در این رابطه قدری توضیح بدهید.
البته در این کامپوننت چون از کلاس TEdit ارث بری کردیم بنابراین آیکن آن هم همان آیکن Edit در Component Palette خواهد بود.

ممنون از راهنمایی هاتون

vcldeveloper
دوشنبه 30 شهریور 1388, 00:38 صبح
ن با ایجاد خصوصیت فقط خواندنی کمی مشکل دارم. واسه همینه که از تابع GetName برای تعیین مقدار Author استفاده کردم.
اگرچه که من با مبانی ساخت خصوصیت فقط خواندنی آشنایی دارم، اما در عمل قادر به انجام آن نیستم.
من می دانم اگر خصوصیتی به شکل زیر تعریف گردد فقط خواندنی است و نمی توان مقدار آن را تغییر داد :

Property Author : String Read FAuthor;


که FAuthor در بخش Private به صورت زیر تعریف شده :

FAuthor : String;


در انتها هم در متد سازنده کلاس، این متغیر را مقدار دهی می کنیم.
اینها مبانی کار بود اما مشکل کار اینجاست که با وجود تعریف خصوصیت مذکور در بخش Published این خصوصیت در Object Inspector نمایش داده نمی شه!!! حالا بیایم یک Write هم به تعریف خصوصیت فوق اضافه کنیم می بینیم که در Object Inspector خصوصیت مورد نظر ظاهر شده ولی افسوس که توسط کاربر مقدار این خصوصیت قابل تغییر است یعنی فقط خواندنی نیست!!!
حال شما بگید برای ایجاد یک خاصیت فقط خواندنی که در لیست Object Inspector بیاید چه باید کرد؟

Object Inspector بصورت پیش فرض خصوصیات فقط-خواندنی را نمایش نمیده. شما اگر میخواید خصوصیت تان فقط-خواندنی باشه، ولی Object Inspector آن را بطور پیش فرض نمایش بده، باید برای Write آن از متدی استفاده کنید که کاری انجام نمیده:

TMyClass = class(TComponent)
private
function GetAuthorName: string;
procedure SetAuthorName(const Value: string);
published
property AuthorName read GetAuthorName write SetAuthorName;
end;

implementation

function TMyClass.GetAuthorName: string;
begin
Result := 'Author Name';
end;

procedure TMyClass.SetAuthorName(const Value: string);
begin
//Do nothing!
end;


چه دلیلی برای این کار وجود داره؟
شاید چون شما از تابع StringReplace برای انجام عمل مورد نظر استفاده می کنید پیشنهاد Const در نظر گرفتن پارامتر ورودی را دادید. یا نه دلیل دیگه ای داره مثل عدم پردازش روی پارامتر ورودی (SignedText)! یا ..
چون کامپایلر یک بلوک try-finally مخفی به کد اضافه میکنه، تا در صورتی که پارامتر string در کد تغییر کرد، مقدار Reference Count آن را تنظیم کند. وقتی پارامتر String قرار نیست در تابع تغییر داده بشه، بهتر هست که بصورت Const تعریف بشه، تا کامپایلر کد اضافه برای آن تولید نکنه.


من نمی دونم چطور می توان این کار رو انجام داد اما تا این حد می دونم که هنگام ساخت بسته یک سری تنظیمات رو می توان اعمال کرد به این صورت که در دیالوگ (پنجره کوچک) Package توسط کلید Options می توان خواصی چون Description فایل و نسخه اون و یا عنوان شرکت و مواردی این چنینی رو مشخص کرد اما آیکن رو نمی دونم؟ اگه ممکنه در این رابطه قدری توضیح بدهید.
البته در این کامپوننت چون از کلاس TEdit ارث بری کردیم بنابراین آیکن آن هم همان آیکن Edit در Component Palette خواهد بود.
یک آین در سایز آیکن های کامپوننت های دلفی در Components Palette ایجاد کنید، و آن را بصورت یک فایل Resource کامپایل کنید. در این فایل Resource، آیکن مربوط به هر کامپوننت باید هم نام کامپوننت باشه، و بصورت حروف بزرگ نوشته شده باشه. این Resource را به پروژه اضافه کنید، و پروژه را Build کنید، تا دلفی از آیکن اختصاص داده شده برای کامپوننت استفاده کنه.

volvo B12
دوشنبه 30 شهریور 1388, 01:21 صبح
و آن را بصورت یک فایل Resource کامپایل کنید.
من راجع به فایل های مذکور (resourceها) اطلاعات کمی دارم لطفا راهنمایی بفرمایید که چگونه این کار رو بکنم. یعنی فایل آیکونم رو کجا قرار بدم و بعد کامپایلش کنم؟

vcldeveloper
سه شنبه 31 شهریور 1388, 01:03 صبح
درباره چگونگی ساخت Resource، کامپایل آن، و استفاده از آن در برنامه، چندین تاپیک در این تالار وجود داره. همین عبارت Resource را اگر جستجو کنید، به نتیجه می رسید.

volvo B12
جمعه 24 مهر 1388, 20:03 عصر
با سلامی مجدد پس از وقفه ای طولانی
همونطور که در چند پست گذشته گفته بودم کد کامل شده کامپوننت مخصوص ورود عدد که نتیجه زحمات استاد کشاورز هست رو در اینجا قرار می دم.

ضمنا درون فایل زیپ ضمیمه علاوه بر کد کامپوننت(فایل pas.) فایل قابل نصب در دلفی 7(فایل dpk.) نیز قرار داده شده است.

یا حق