# Native Code > برنامه نویسی در Delphi > مقالات مرتبط با Delphi/Win32 > آموزش: Class Helper ها در دلفی

## Felony

سلام ؛

تا به حال چند بار تو این بخش دیدم که دوستان دنبال کامپوننت های آماده ای هستن که کوچکترین نیازشون رو بی دردسر براشون محیا کنه ؛ مثلا تو یکی از تاپیک های که امروز بهش برخوردم و باعث شد این مقاله کوتاه رو بنویسم دوستی نیاز به کامپوننتی شبیه 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

سلام
در ادامه توضیحات آقا ماهان باید عرض کنم که ما در دلفی می توانیم از 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

با سلام
 برای یک کلاس میشود چندتا Class Helper تعریف کرد.
من ّبرای Tedit  دو تا Class Helper  تعریف کردم  ولی یک از آنها در Property اضافه میشود.

----------


## Felony

برای یک کلاس فقط یک Class Helper میتونید تعریف کنید .

----------

