Felony
شنبه 24 تیر 1391, 22:37 عصر
سلام ؛
تا به حال چند بار تو این بخش دیدم که دوستان دنبال کامپوننت های آماده ای هستن که کوچکترین نیازشون رو بی دردسر براشون محیا کنه ؛ مثلا تو یکی از تاپیک های که امروز بهش برخوردم و باعث شد این مقاله کوتاه رو بنویسم دوستی نیاز به کامپوننتی شبیه 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 ها و متدهای موجود در کلاس پایه مورد نظر رو هم تغییر بدید .
موفق باشید .
تا به حال چند بار تو این بخش دیدم که دوستان دنبال کامپوننت های آماده ای هستن که کوچکترین نیازشون رو بی دردسر براشون محیا کنه ؛ مثلا تو یکی از تاپیک های که امروز بهش برخوردم و باعث شد این مقاله کوتاه رو بنویسم دوستی نیاز به کامپوننتی شبیه 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 ها و متدهای موجود در کلاس پایه مورد نظر رو هم تغییر بدید .
موفق باشید .