سلام ؛

تا به حال چند بار تو این بخش دیدم که دوستان دنبال کامپوننت های آماده ای هستن که کوچکترین نیازشون رو بی دردسر براشون محیا کنه ؛ مثلا تو یکی از تاپیک های که امروز بهش برخوردم و باعث شد این مقاله کوتاه رو بنویسم دوستی نیاز به کامپوننتی شبیه CheckListBox داشت که قابلیت ذخیره کد برای هر آیتم یا ... هم داشته باشه .

به شخصه همیشه ترجیح میدم ابزارهای مورد نیاز در برنامه هام رو خودم طراحی کنم و از ابزارهای آماده استفاده نکنم مگر پیاده سازی آیتم مورد نیاز پیچیده و زمان بر باشه ؛ در این نوع موارد اگر قصد استفاده مکرر از ابزار طراحی شده باشه بهترین راه ساخت یک کامپوننت از پایه یا مشتق کردن از کلاس های موجود و اضافه کردن آیتم های مورد نیاز هست که برای دوستان تازه وارد سردرگم کننده هست و برای دوستان اهل فن هم اگر با مشکل زمان دست و پنجه نرم کنند استرس زا !

با توجه به اینکه مطمئن هستم 99% دوستان از Class Helper ها و کاربرد و نحوه کار با اونها هیچ اطلاعاتی ندارند تصمیم گرفتم این مقاله کوتاه رو بنویسم .

زیادی مقدمه گفتم .. !

همونطور که از اسم Class Helper ها مشخصه راه حلی برای کمک به کلاس های موجود هستند ! یعنی چی ؟
یعنی به کمک اونها میتونید پراپرتی و متد به کلاس موجود اضافه کنید و کلاس موجود رو بدون درگیر شدن با مباحث وراثت توسعه بدید .

مثلا کلاس TEdit رو در نظر بگیرید ؛ میخواهیم تابعی به این کلاس اضافه کنیم که بررسی کنه ببینه داخل متن وارد شده ( Text ) کارکتر عددی هست یا نه ، خوب این کار به راحتی با استفاده از Class Helper ها قابل پیاده سازی هست :

type
TEditNumberCheckHelper = class Helper for TEdit
public
function IsNumericCharInText: Boolean;
end;


در کد فوق Class Helper ی با نام TEditNumberCheckHelper برای کلاس TEdit تعریف شده که تابع IsNumericCharInText رو به کلاس TEdit اضافه میکنه .

توجه کنید که نمیتونید شیئتون رو از کلاس TEditNumberCheckHelper مشتق کنید و بسازید ، TEditNumberCheckHelper یک Class Helper هست و تغییرات رو روی کلاس اصلی مورد نظر ما ( در اینجا TEdit ) اعمال میکنه و اون رو توسعه میده .

پس با این توضیحات تمام کنترل های مشتق شده از TEdit دارای تابعی با نام IsNumericCharInText هستند !

حالا تابع IsNumericCharInText رو به صورت زیر تعریف میکنیم :

function TEditNumberCheckHelper.IsNumericCharInText: Boolean;
var
Ch: Char;
begin
Result := False;
// Check text for numeric charecter
for Ch in Text do
if Ch in ['0' .. '9'] then
Exit(True);
end;


به همین سادگی ؛ حالا یک شئ Edit روی فرمتون بزارید و تو یک دکمه کد زیر رو بنویسید و نتیجه رو ببینید :

  if Edit1.IsNumericCharInText then
ShowMessage('The text contain numeric charecter');


به همین شیوه میشه موارد مورد نیاز و یک بار مصرف رو بدون درگیر شدن با جزئیات و پیاده سازی های پیچیده و وراثت پیاده سازی کرد .

در آخر دقت کنید که در Class Helper ها امکان تعریف فیلد وجود نداره و اگر تصمیم به این کار داشتید فیلد ها رو باید از نوع Class Var تعریف کنید :

با این حساب کد زیر کامپایل نخواهد شد :

type
TEditNumberCheckHelper = class Helper for TEdit
public
fField: Boolean;
function IsNumericCharInText: Boolean;
end;


و راه حل :

type
TEditNumberCheckHelper = class Helper for TEdit
public
class var fField: Boolean;
function IsNumericCharInText: Boolean;
end;


در ضمن با استفاده از Class Helper ها میتونید رفتار Property ها و متدهای موجود در کلاس پایه مورد نظر رو هم تغییر بدید .

موفق باشید .