نمایش نتایج 1 تا 11 از 11

نام تاپیک: دستیابی به خصوصیات یک کامپوننت با استفاده از رشته نام آن کامپوننت

  1. #1
    کاربر تازه وارد آواتار u.2u.4u
    تاریخ عضویت
    خرداد 1386
    محل زندگی
    آزاد باش تا اونجا که می تونی
    پست
    99

    Question دستیابی به خصوصیات یک کامپوننت با استفاده از رشته نام آن کامپوننت

    باسلام خدمت همه دوستان و اساتید.
    فرض کنید یک کومبوباکس دارم به نام 'sharh1' و این نام را به عنوان یک رشته در کد در اختیار دارم. می خواهم به خصوصیات کومبوباکسی که این نام را دارد دست پیدا کنم مثلا اون را غیرفعال کنم. در ضمن نمی خواهم از روش بررسی تمام کامپوننت ها در یک حلقه که کدنویسی بیشتر نیاز داره و هم زمان زیاد می بره مانند تاپیک زیر استفاده کنم:
    https://barnamenevis.org/showth...ComponentCount
    پیشنهاد شما چیه؟ برای مثال می خواهم این کومبوباکس را disable کنم.
    با تشکر

  2. #2
    کاربر دائمی
    تاریخ عضویت
    بهمن 1381
    محل زندگی
    Iran
    پست
    304

    var
    strComponent :String;
    strClass :String;
    NewRef :TComboBox;
    begin

    strComponent := 'ComboBox1';
    strClass := 'TComboBox';

    NewRef := FindComponent(strComponent) as FindClass(strClass);

    NewRef.Visible := False;



    امیدوارم بدرت بخوره و مشکلت رو حل کنه!!!
    آخرین ویرایش به وسیله Mahmood_M : سه شنبه 25 آبان 1389 در 11:24 صبح

  3. #3
    کاربر تازه وارد آواتار u.2u.4u
    تاریخ عضویت
    خرداد 1386
    محل زندگی
    آزاد باش تا اونجا که می تونی
    پست
    99

    نقل قول: دستیابی به خصوصیات یک کامپوننت با استفاده از رشته نام آن کامپوننت

    دستتون درد نکنه. اما این خط:

    NewRef := FindComponent(strComponent) as FindClass(strClass);

    این ارور را می ده

    [DCC Error] Unit2.pas(59): E2010 Incompatible types: 'TComboBox' and 'TPersistent'

  4. #4
    کاربر تازه وارد آواتار u.2u.4u
    تاریخ عضویت
    خرداد 1386
    محل زندگی
    آزاد باش تا اونجا که می تونی
    پست
    99

    نقل قول: دستیابی به خصوصیات یک کامپوننت با استفاده از رشته نام آن کامپوننت

    با این کد مشکل حل شد:
    NewRef := FindComponent(strComponent) as TComboBox;

    حالا واقعا نمی دونم توی اون قسمتی که تغییر کرد چه مشکلی وجود داشت. باز هم تشکر می کنم.

  5. #5

    نقل قول: دستیابی به خصوصیات یک کامپوننت با استفاده از رشته نام آن کامپوننت

    نقل قول نوشته شده توسط u.2u.4u مشاهده تاپیک
    با این کد مشکل حل شد:
    NewRef := FindComponent(strComponent) as TComboBox;

    حالا واقعا نمی دونم توی اون قسمتی که تغییر کرد چه مشکلی وجود داشت. باز هم تشکر می کنم.
    مقدار برگشتی تابع FindClass از نوع TPersistent هست و برای همین نمیشه به TComboBox اون رو TypeCast کرد .

    در ضمن بهتره به جای استفاده از as - Cast از یک Hard - Cast امن استفاده کنید :


    var
    strComponent :String;
    NewRef :TComboBox;
    begin
    strComponent := 'ComboBox1';
    if FindComponent(strComponent) is TComboBox then
    NewRef := TComboBox(FindComponent(strComponent));
    end;

  6. #6

    نقل قول: دستیابی به خصوصیات یک کامپوننت با استفاده از رشته نام آن کامپوننت

    در ضمن بهتره به جای استفاده از as - Cast از یک Hard - Cast امن استفاده کنید
    در همچین سناریویی، همچین توصیه ایی نمیشه. کد شما از کد اولیه کارایی پایین تری داره، چون دارید دو بار با استفاده از FindComponent به دنبال کلاس مربوطه در بین کلاس های ریجستر شده می گردید، و یک بار هم برای مطابقت نوع کلاس، سلسله مراتب کلاس ها رو پیمایش می کنید.

    در کد اولیه یک بار جستجو در بین کلاس های رجیستر شده انجام میشد، و یک بار هم پیمایش سلسله مراتب کلاس ها. بعد از اون، استفاده از NewRef بدون سربار انجام میشد. البته امنیت کد هم به خوبی حفظ میشد، چون عملگر as در صورت مطابقت نداشتن نوع کلاس پیدا شده با نوع کلاس مورد نظر، یک Exception ایجاد میکنه.


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  7. #7
    کاربر تازه وارد آواتار u.2u.4u
    تاریخ عضویت
    خرداد 1386
    محل زندگی
    آزاد باش تا اونجا که می تونی
    پست
    99

    نقل قول: دستیابی به خصوصیات یک کامپوننت با استفاده از رشته نام آن کامپوننت

    ببخشید یه سوال دیگه دارم: اگر مانند کد آقای devil00x یعنی
    NewRef := FindComponent(strComponent) as FindClass(strClass);

    نوع کلاسمون هم یک رشته نامشخص باشه که بتونیم مثلا یک تابع درست کنیم که با تمام کلاسها کار کنه شما چه پیشنهادی می کنید؟

  8. #8

    نقل قول: دستیابی به خصوصیات یک کامپوننت با استفاده از رشته نام آن کامپوننت

    نقل قول نوشته شده توسط علی کشاورز مشاهده تاپیک
    در همچین سناریویی، همچین توصیه ایی نمیشه. کد شما از کد اولیه کارایی پایین تری داره، چون دارید دو بار با استفاده از FindComponent به دنبال کلاس مربوطه در بین کلاس های ریجستر شده می گردید، و یک بار هم برای مطابقت نوع کلاس، سلسله مراتب کلاس ها رو پیمایش می کنید.

    در کد اولیه یک بار جستجو در بین کلاس های رجیستر شده انجام میشد، و یک بار هم پیمایش سلسله مراتب کلاس ها. بعد از اون، استفاده از NewRef بدون سربار انجام میشد. البته امنیت کد هم به خوبی حفظ میشد، چون عملگر as در صورت مطابقت نداشتن نوع کلاس پیدا شده با نوع کلاس مورد نظر، یک Exception ایجاد میکنه.
    یا توجه به اینکه از نوع شئ ارسالی اطمینان داریم ( TComboBox ) حرف شما درسته ، من در کل گفتم ؛ حالا اگر کد رو به صورت زیر تغییر بدیم کارایی مشابهی خواهیم داشت ؟ :

     var
    strComponent: String;
    Temp: TComponent;
    NewRef: TComboBox;
    begin
    strComponent := 'ComboBox1';
    Temp:= FindComponent(strComponent);
    if Temp is TComboBox then
    NewRef := TComboBox(Temp);
    end;


    نقل قول نوشته شده توسط u.2u.4u مشاهده تاپیک
    ببخشید یه سوال دیگه دارم: اگر مانند کد آقای devil00x یعنی
    NewRef := FindComponent(strComponent) as FindClass(strClass);

    نوع کلاسمون هم یک رشته نامشخص باشه که بتونیم مثلا یک تابع درست کنیم که با تمام کلاسها کار کنه شما چه پیشنهادی می کنید؟
    function FindCom(const ComponentName, ComponentClass: String): TComponent;
    var
    Temp: TComponent;
    begin
    Temp:= Form1.FindComponent(ComponentName);
    if Temp.ClassNameIs(ComponentClass) then
    Result:= Temp;
    end;


    استفاده :
    var
    strComponent: String;
    strClass: String;
    NewRef: TComponent;
    begin
    strComponent := 'ComboBox1';
    strClass := 'TComboBox';
    NewRef:= FindCom(strComponent, strClass);
    ShowMessage(NewRef.Name);
    end;

  9. #9
    کاربر تازه وارد آواتار u.2u.4u
    تاریخ عضویت
    خرداد 1386
    محل زندگی
    آزاد باش تا اونجا که می تونی
    پست
    99

    نقل قول: دستیابی به خصوصیات یک کامپوننت با استفاده از رشته نام آن کامپوننت

    function FindCom(const ComponentName, ComponentClass: String): TComponent;


    ببخشید، واقعا دستتون درد نکنه. اما یک مشکلی هست. در این تابع که شما زحمتش را کشیدید، به یک سری از خواص که خاص هستند مثلا Visible در کومبوباکس دسترسی نداریم. اگرچه می تونیم نام را به دست بیاریم. یعنی در واقع ما یک Component داریم نه یک Combo box.
    آخرین ویرایش به وسیله u.2u.4u : چهارشنبه 26 آبان 1389 در 18:08 عصر

  10. #10

    نقل قول: دستیابی به خصوصیات یک کامپوننت با استفاده از رشته نام آن کامپوننت

    حالا اگر کد رو به صورت زیر تغییر بدیم کارایی مشابهی خواهیم داشت ؟
    بله، اون کد معادل استفاده کردن از عملگر as هست.


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  11. #11

    نقل قول: دستیابی به خصوصیات یک کامپوننت با استفاده از رشته نام آن کامپوننت

    نقل قول نوشته شده توسط u.2u.4u مشاهده تاپیک
    function FindCom(const ComponentName, ComponentClass: String): TComponent;


    ببخشید، واقعا دستتون درد نکنه. اما یک مشکلی هست. در این تابع که شما زحمتش را کشیدید، به یک سری از خواص که خاص هستند مثلا Visible در کومبوباکس دسترسی نداریم. اگرچه می تونیم نام را به دست بیاریم. یعنی در واقع ما یک Component داریم نه یک Combo box.
    خروجی اون تابع از نوع TComponent هست و طبیعی هست که فقط به متدهای یک TComponent دسترسی داشته باشید ، میتونید بعد از اتمام کار خروجی رو به نوع مورد نظر TypeCast کنید و به خصوصیاتش دسترسی داشته باشید ، مثلا :

    var
    Temp: TComponent;
    begin
    Temp:= FindCom('ComboBox1', 'TComboBox');
    if Temp is TCombobox then
    TComboBox(Temp).Visible:= False;
    if Temp is TListBox then
    TListBox(Temp).Items.Add('Test');
    end;


    در کل دلفی یک زبان دینامیک نیست و باید به شیوه های مختلف ( مثل کد بالا ) عملیات مورد نظرتون رو پیاده سازی کنید .

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •