PDA

View Full Version : آموزش: Class Helper ها در دلفی



Felony
شنبه 24 تیر 1391, 21: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 ها و متدهای موجود در کلاس پایه مورد نظر رو هم تغییر بدید .

موفق باشید .

BORHAN TEC
سه شنبه 25 مهر 1391, 00:18 صبح
سلام
در ادامه توضیحات آقا ماهان باید عرض کنم که ما در دلفی می توانیم از record helper هم استفاده کنیم که مثالی را در این رابطه در زیر قرار داده ام.
از آنجایی که این کد با داده های پایه کار می کند شما حداقل باید از Delphi XE3 استفاده کنید. به عبارت دیگر record helper برای کار با داده های پایه یکی از ویژگی هایی است که به RTL مربوط به Delphi XE3 اضافه شده است:
type
TIntegerHelper = record helper for Integer
function ToString: string;
end;

// ...

implementation

// ...

function TIntegerHelper.ToString: string;
begin
Result := System.SysUtils.IntToStr(Self)
end;

procedure TForm4.Button1Click(Sender: TObject);
var
I: Integer;
begin
I := Random(100);
caption := I.ToString;
end;

fahimi
پنج شنبه 25 آبان 1391, 21:08 عصر
با سلام
برای یک کلاس میشود چندتا Class Helper تعریف کرد.
من ّبرای Tedit دو تا Class Helper تعریف کردم ولی یک از آنها در Property اضافه میشود.

Felony
یک شنبه 28 آبان 1391, 16:49 عصر
برای یک کلاس فقط یک Class Helper میتونید تعریف کنید .