PDA

View Full Version : چگونه با استفاده از اسم یک شی می توانیم آن را صدا کنیم



sql_qassem
دوشنبه 17 تیر 1387, 22:07 عصر
چگونه با استفاده از اسم یک شی می توانیم آن را صدا کنیم
مثلا در مثال زیر می خواهم تابعی بنویسم که با ‍‍پاس دادن نام فرم فرم را ایجاد کند و...

Application.CreateForm(TFTravel, FTravel);
FTravel.ShowModal;
FTravel.Free;

vcldeveloper
سه شنبه 18 تیر 1387, 02:29 صبح
چگونه با استفاده از اسم یک شی می توانیم آن را صدا کنیم
در دخل یک فرم، از طریق متد FindComponent.


مثلا در مثال زیر می خواهم تابعی بنویسم که با ‍‍پاس دادن نام فرم فرم را ایجاد کند و...
ایجاد فرم از طریق نام آن بی معنی هست! خصوصیت Name در زمان ساخته شدن یک فرم مقداردهی می شود، پس تا زمانی که فرمی ساخته نشده باشد، اسمی ندارد، بلکه صرفا یک Class هست. شما می تونید کلاس یک فرم را مشخص کنید و از روی آن یک نمونه (Instance) از آن کلاس را بسازید. همین کار در سورس متد CreateForm انجام میشه که می توانید سورس آن را بررسی کنید. بطور کلی، این کار از طریق تعریف یک Class Reference انجام میشه.

sql_qassem
سه شنبه 18 تیر 1387, 11:59 صبح
من ميگم با گرفتن نام كلاس بشه اونها رو فراخواني كرد .
يه چيزي مثل كد زير :

Application.CreateForm(class('T'+FromName, FindComponent(FromName));
FindComponent(FromName).ShowModal;
FindComponent(FromName).Free;

vcldeveloper
سه شنبه 18 تیر 1387, 18:17 عصر
يه چيزي مثل كد زير
اینی هم که میگید منطقی نیست، چون مثلا FindComponent زمانی مقداری رو بر می گردونه که یک شی با اون نام وجود داشته باشه، یعنی شی قبلا Create شده باشه. برای نام کلاس هم به اون شکل نمی تونید عمل کنید، بلکه باید حداقل یک Base برای کلاس هایی که باید اشیاء از روی آنها ساخته بشند، در نظر بگیرید - مثل همون کاری که CreateForm میکنه.
اگر اصرار دارید که نام فرم و کلاس را بصورت string بدید و از روی این stringها شی ساخته بشه، باید برید سراغ Script Engineهای موجود، مثل Pascal Script.

sql_qassem
چهارشنبه 19 تیر 1387, 12:00 عصر
جوينده يابنده است . بالاخره پيدا مي كنم و كدش رو توي همين تاپيك مي ذارم.

sql_qassem
چهارشنبه 02 مرداد 1387, 12:51 عصر
دقيقا همون چيزي كه مي خواستم
پيداش كردم از
Delphi Tips (http://www.obsof.com/delphi_tips/delphi_tips.html)

var FormName: string;
AForm: TForm;
begin
Application.CreateForm(TFormClass(FindClass('T'+Fo rmName)), AForm);
end;
جالبه بدونيد چطوري پيداش كردم :
توي گوگل جستجو زدم :

Application.CreateForm(

sql_qassem
چهارشنبه 02 مرداد 1387, 12:54 عصر
روش دوم از همون سايت


procedure TFormButton.Click;
var AClass: TPersistentClass;
AFormClass: TFormClass;
begin
inherited Click;
if FFormName = '' then Exit;
if FForm = nil then
begin
AClass := FindClass('T' + FFormName);
AFormClass := TFormClass(AClass);
FForm := AFormClass.Create(Self);
end;
if FShowModal then
FFormModalResult := FForm.ShowModal
else
FForm.Show;
if Assigned(FAfterShow) then FAfterShow(Self);
end;

vcldeveloper
چهارشنبه 02 مرداد 1387, 18:12 عصر
دقيقا همون چيزي كه مي خواستم
نه، اون چیزی که شما می خواستید، می خواستید که نام کلاس هم بصورت String باشه، ولی اینجا، نوع کلاس را از شما میگیره و کلاس مربوطه رو TypeCast میکنه. چندان فرقی با اون کاری که CreateForm میکنه و من شما را به اون ارجاع دادم، نمیکنه.

sql_qassem
شنبه 05 مرداد 1387, 15:03 عصر
به هر حال مي مي تونم با پاس كردن يك نام فرم به تابع مورد نظرم فرم رو نمايش بدم.