1. مهمان گرامی، جهت ارسال پست، دانلود و سایر امکانات ویژه کاربران عضو، ثبت نام کنید.
    بستن اطلاعیه

Class Helper ها در دلفی

شروع موضوع توسط hector2141 ‏11/9/12 در انجمن Delphi

  1. کاربر ارشد

    تاریخ عضویت:
    ‏6/9/12
    ارسال ها:
    14,318
    تشکر شده:
    2,702
    امتیاز دستاورد:
    0
    حرفه:
    daneshjo
    همونطور که از اسم Class Helper ها مشخصه راه حلی برای کمک به کلاس های موجود هستند ! یعنی چی ؟
    یعنی به کمک اونها میتونید پراپرتی و متد به کلاس موجود اضافه کنید و کلاس موجود رو بدون درگیر شدن با مباحث وراثت توسعه بدید .

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

    [TABLE]
    [TR]
    [TD="class: gutter"]1
    2
    3
    4
    5
    [/TD]
    [TD="class: code"]type
    TEditNumberCheckHelper = class Helper for TEdit
    public
    function IsNumericCharInText: Boolean;
    end;

    [/TD]
    [/TR]
    [/TABLE]




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

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

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

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

    [TABLE]
    [TR]
    [TD="class: gutter"]1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [/TD]
    [TD="class: code"]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;

    [/TD]
    [/TR]
    [/TABLE]




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

    [TABLE]
    [TR]
    [TD="class: gutter"]1
    2
    [/TD]
    [TD="class: code"]if Edit1.IsNumericCharInText then
    ShowMessage('The text contain numeric charecter');

    [/TD]
    [/TR]
    [/TABLE]




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

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

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

    [TABLE]
    [TR]
    [TD="class: gutter"]1
    2
    3
    4
    5
    6
    [/TD]
    [TD="class: code"]type
    TEditNumberCheckHelper = class Helper for TEdit
    public
    fField: Boolean;
    function IsNumericCharInText: Boolean;
    end;

    [/TD]
    [/TR]
    [/TABLE]




    و راه حل :

    [TABLE]
    [TR]
    [TD="class: gutter"]1
    2
    3
    4
    5
    6
    [/TD]
    [TD="class: code"]type
    TEditNumberCheckHelper = class Helper for TEdit
    public
    class var fField: Boolean;
    function IsNumericCharInText: Boolean;
    end;

    [/TD]
    [/TR]
    [/TABLE]




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