PDA

View Full Version : ایجاد Object یا Panel در زمان اجرا در صورت عدم وجود



FirstLine
دوشنبه 04 تیر 1386, 15:33 عصر
با سلام
نیاز به یک procedure یا تابع دارم که در برنامه با کلیک بر روی یک دکمه با یک آرگومان Boolean صدا زده شود و عملیاتی که باید انجام بدهد بصورت زیر است:
1- اگر با آرگومان True صدا زده شد Panel_Main را در صورت وجود داشتن نمایش دهد و اگر وجود نداشت آن را ایجاد کند.
2- اگر با آرگومان False صدا زده شد Visible پنل ایجاد شده را Panel_Main برابر با False قرار دهد

قبل از اجرای برنامه و در حالت برنامه نویسی این پنل وجود ندارد.
مثلا مثل کد زیر که مشکل داره و ممنون میشم راهنمایی بفرمایید.


procedure Show_Panel(Is_Show_Panel:Boolean=True);
begin
if Panel_Main=nil then
begin
// Create Panel Main
end else begin
Panel Main.Visible:=Is_Show_Panel;
end;
end;

با تشکر

object
دوشنبه 04 تیر 1386, 16:04 عصر
procedure Show_Panel(Is_Show_Panel:Boolean=True);
begin
if not Assigned(Panel_Main) then
begin
Panel_main:=TPanel.Create(Self);
....
....
)جای پنلت رو درست باید ست کنی اونجایی که میخوای توی پنجره ات باشه(
end else begin
Panel Main.Visible:=Is_Show_Panel;

SYNDROME
دوشنبه 04 تیر 1386, 16:32 عصر
با سلام
بعد از ساخت Panelدستور زیر را اضافه کن تا در فرم نمایش داده شود.


Panel.Parent := Self;

FirstLine
دوشنبه 04 تیر 1386, 19:35 عصر
با سلام
خیلی ممنون. تابع زیر را نوشتم ، ولی در زمان اجرا به self و Panel_main ایراد میگیره و میگه که تعریف نشده است
لطفا این تابع را بازبینی و راهنمایی بفرمایید.


Function Show_Panel(Is_Show_Panel:Boolean=True):Boolean ;
begin
if not Assigned(Panel_Main) then
begin
Panel_main:=TPanel.Create(self);

Panel_Main.Parent := self;
Panel_Main.Left := 448;
Panel_Main.Top := 24;
Panel_Main.Width := 201;
Panel_Main.Height := 65 ;
Panel_Main.Caption := 'Waite ...' ;
Panel_Main.Color := clRed ;
Panel_Main.Font.Charset := ARABIC_CHARSET ;
Panel_Main.Font.Color := clWindowText ;
Panel_Main.Font.Height := -21 ;
Panel_Main.Font.Name := 'Arial' ;
Panel_Main.Font.Style := [fsBold] ;
Panel_Main.ParentFont := False ;
Panel_Main.TabOrder := 1 ;

end else begin
Panel_main.Visible:=Is_Show_Panel;
end;
Result:=Panel_main.Visible;
end;


با تشکر

Mahmood_M
دوشنبه 04 تیر 1386, 19:43 عصر
سلام
نباید یک تابع بنویسید ، توی تابع ، نمی تونید بدون نوشتن نام Parent ها به اشیاء دسترسی داشته باشید ، باید از Procedure استفاده کنید ...
به جای Function ، بنویسید : Procedure ! و مطمئن شید که Panel_Main رو در Unit تعریف کرده باشید ...

درضمن : در Procedure ، نباید مقداری به Result بدید ... ، اگه میخواید مقدار برگشتی Procedure رو بگیرید ، باید یک متغیر در Unit تعریف کنید ( مثلا در Public فرم ) و بعد در آخر Procedure ، مقدار اون رو True یا False کنید ...

موفق باشید ...

SYNDROME
دوشنبه 04 تیر 1386, 20:09 عصر
با سلام

با سلام
خیلی ممنون. تابع زیر را نوشتم ، ولی در زمان اجرا به self و Panel_main ایراد میگیره و میگه که تعریف نشده است

یونیت ExtCtrls را Use کرده اید؟
در تایید حرفهای آقا محمود گل.
در تابع خود نام فرم را نیز ارسال کنید و به جای Self از ParForm.Owner استفاده کنی
ParForm نام متغییر ارسالی شما به تابع است.

FirstLine
دوشنبه 04 تیر 1386, 20:20 عصر
با سلام
با تشکر از راهنمایی های شما دوستان عزیز.
در نهایت یه پروسیجر بصورت زیر شد
امیدوارم بدرد کس دیگری هم بخوره



procedure Show_Panel(Form_Name: TForm;Is_Show_Panel:Boolean=True;Panel_Caption:Str ing='Waite ...') ;
begin
if not Assigned(Panel_Main) then
begin
Panel_main:=TPanel.Create(Form_Name);

Panel_Main.Parent := Form_Name;
Panel_Main.Width := 201;
Panel_Main.Height := 65 ;
Panel_Main.Caption := 'Waite ...' ;
Panel_Main.Color := clRed ;
Panel_Main.Font.Charset := ARABIC_CHARSET ;
Panel_Main.Font.Color := clWindowText ;
Panel_Main.Font.Height := -21 ;
Panel_Main.Font.Name := 'Arial' ;
Panel_Main.Font.Style := [fsBold] ;
Panel_Main.ParentFont := False ;
Panel_Main.TabOrder := 1 ;

end else begin
Panel_main.Visible:=Is_Show_Panel;
end;
end;


با تشکر

vcldeveloper
چهارشنبه 06 تیر 1386, 13:03 عصر
نباید یک تابع بنویسید ، توی تابع ، نمی تونید بدون نوشتن نام Parent ها به اشیاء دسترسی داشته باشید ، باید از Procedure استفاده کنید ...
به جای Function ، بنویسید : Procedure
ربطی به function یا procedure نداره. اگر می خواید از Self استفاده کنید، باید تابع یا procedure شما در داخل یک کلاس تعریف شده باشه (یک متد از اون کلاس باشه). Self به کلاس حاضر که متد در آن قرار دارد اشاره می کند. خارج از یک کلاس اگر بخواید به خصوصیات یا متدهای اون کلاس دسترسی داشته باشید، باید نام شی ایی که از اون کلاس ساخته اید را مشخص کنید. پس اگر تابع مورد نظر شما در کلاس TForm1 تعریف شده بود، استفاده از Self مشکلی نداشت و نیازی به درج نام Form1 نداشتید، اما وقتی تابع در خارج از کلاس تعریف شده، نمی تونید از Self استفاده کنید، و باید نام Form1 را هم قبل از نام خصوصیات و متدهای مربوطه بیارید.