نوشته شده توسط
علی کشاورز
در همچین سناریویی، همچین توصیه ایی نمیشه. کد شما از کد اولیه کارایی پایین تری داره، چون دارید دو بار با استفاده از 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;