PDA

View Full Version : اشکال در نوشتن یک تابع؟



aliasghar
جمعه 08 خرداد 1383, 20:45 عصر
سلام
میدونیم که هرگاه بخواهیم یک فرم را بصورت غیر خودکار درست کنیم باید از دستور زیر استفاده کنیم


form1:=Tform1.create(self);

حالا من اگه بخوام یک تابع بنویسم که مشخصات فرم ها را به اون پاس کنم تا در اون تابع فرم ساخته بشه چطور باید این کار را انجام داد
یعنی اینکه من باید دو تا پارامتر برای تابع بفرستم یکی form1 که نام فرم هست
و دیگری Tform1 که کلاس این فرم هست ولی نمی دونم چطوری باید کلاس یک فرم را به عنوان پارامتر یک تابع ارسال کنم مثل



procedure FormCreate(FormName:string;FormClass:.........);

و اینکه این تابه را چه جوری باید صدا زد؟
ایا می شه یک متغیر از نوع Tform1 که خودش یک Type هست داشته باشیم؟
لطفا" HELP ME

hr110
شنبه 09 خرداد 1383, 08:05 صبح
فکر کنم این متد بتواند شما را کمک کند:

Application.CreateForm

aliasghar
شنبه 09 خرداد 1383, 19:12 عصر
مهندس جان

من میخوام یک تابعی بنویسم که نام یک فرم و کلاس اون را بهش پاس کنم و بعد اون تابع با فراخوانی تابع


Application.CreateForm

فرم من را بسازه آخه میدونی که Application.CreateForm دو تا پارامتر میگیره یکی نام فرو یکی نام کلاس فرم
مثل این



Procedure Ali(FormName:string;FormClass:XXXXX);
begin
{Check my parameters }
Application.CreateForm(FormClass,FormName);
End



لطفا" راهنمایی کنید

merced
یک شنبه 10 خرداد 1383, 05:14 صبح
خوب این چه کاریه ؟
شما فرم خودت رو موقع طراحی ایجاد و طراحی کن بعد از تو program source خطی که فرم رو میسازه خذف کن (Application.CreatForm(Tform1,Form1
حالا توی برنامه هر جا که لازم بود ... همون خطی که حذف کردی رو اضافه کن
بعد از تموم شدن کارت هم form1.free

vcldeveloper
یک شنبه 10 خرداد 1383, 13:52 عصر
procedure Ali(FormName:string;FormClass:XXXXX);




FormClass: TComponentClass


تعریف TComponentClass در واحد Classes به این صورته:


TComponentClass = class of TComponent;


یعنی شما می تونید از هر یک از کلاسهای مشتق شده از TComonent به عنوان پارامتر در تابع خودتون استفاده کنید. :wink:

البته فکر نکنم روشی که شما میخواید استفاده کنید امکانپذیزباش!!! یعنی اگر FormName : string باشه شما نمیتونید هیچ ارجاعی به فرم مورد نظر داشته باشید. مثلا اگر نام فرم شما FormName := 'Form2' باشه بعد از فراخوانی رویه Application.CreateForm(FormClass,FormName) اگر شما کدی مثل Form2.Show داشته باشید یک استثناء رخ میده! غیر از اینکه FormName از نوع String نباشه و شما تابع خودتون رو اینجوری تعریف کنید:


procedure Ali(FormClass: TComponentClass; var FormName);


که البته در این صورت تابع شما میشه همون Application.CreateForm !!!!!!!!

پیشنهاد من استفاده از کدهای زیره:

ابتدا واحد Contnrs رو به لیست uses اضافه کنید و در قسمت private یا public فرم اصلی این متغیر رو اضافه کنید:


private
FormList: TComponentList;


حالا میتونید از این دو رویه برای اضافه کردن یا حذف فرمهای جدید استفاده کنید:



procedure ShowForm(FormName: string);
var
MyForm: TForm;
begin
if Form1.FormList = nil then
Form1.FormList := TComponentList.Create;
Application.CreateForm(TForm,MyForm);
with MyForm do
begin
Name := FormName;
Left := 50;
Top := 10;

//Add other parameters if it's necessery...
end;
Form1.FormList.Add(MyForm);
MyForm.Show;
end;


procedure DestroyForm(FormName: string);
var
i : byte;
begin
for i := 0 to Form1.FormList.Count - 1 do
if Form1.FormList.Items[i].Name = FormName then
begin
Form1.FormList.Items[i].Free;
Exit;
end;
if Form1.FormList.Count = 0 then
FreeAndNil(Form1.FormList);
end;



رویداد OnClose فرم اصلی رو هم به این صورت تغییر بدید:



procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if FormList <> nil then
FreeAndNil(FormList);
end;



البته اینجا فرض شده که فرم اصلی اسمش Form1 است.
اگر فرمهای شما از نوع Modal باشند دردسرش خیلی کمتر میشه!!

Sepidar
یک شنبه 10 خرداد 1383, 16:18 عصر
یه نیگاهی به metaclasses تو هلپ دلفی بندازید. مثالهای خودش کافی و مکفی است