PDA

View Full Version : سوال: مشخص نمودن Parent یک کنترل



hadisalahi2
یک شنبه 24 آذر 1392, 17:11 عصر
سلام بچه ها
من یک یونیت دارم که توش چند تا پروسیجر برای ایجاد کنترل ها در حالت ران تایم داره.
مثلا مثل این کدها



unit CreatObjectUnit;

interface
uses StdCtrls,SysUtils,Forms,Controls,AdvSmoothPageSlid er
,AdvStyleIF,Graphics;
//|QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
Procedure CreatPage(Parent:TWinControl;ObjName:String);
Procedure CreatLable(PParent:TWinControl;ObjName,PCaption,PF ontName:String;
PTop,PLeft,FontSize:Integer);

implementation

uses
DBUnit;
//|QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
Procedure CreatPage(Parent:TWinControl;ObjName:String);
Var NewPage:TAdvSmoothPage;
Begin
Try
NewPage:=TAdvSmoothPage.Create(Parent);
NewPage.SetComponentStyle(tsOffice2010Blue);
NewPage.Name:=ObjName;
NewPage.Header:='';NewPage.Footer:='';
NewPage.HeaderHeight:=70;NewPage.FooterHeight:=30;
NewPage.MinimumWidth:=50;
(Parent as TAdvSmoothPageSlider).AddPage(NewPage);
CreatLable(NewPage,'LBL1','کد رایانه :','Mitra',10,845,10);

except on E: Exception do
DBForm.InsertToException('CreatObjectUnit','CreatP age',e.Message);
end;
End;
//|QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
Procedure CreatLable(PParent:TWinControl;ObjName,PCaption,PF ontName:String;
PTop,PLeft,FontSize:Integer);
Var NewLable:TLabel;
Begin
Try
NewLable:=TLabel.Create(PParent);
NewLable.Parent:=PParent;
with NewLable Do Begin
Name:=ObjName;
Top:=PTop;Left:=PLeft;
Caption:=PCaption;
Font.Name:=PFontName;
Font.Size:=FontSize;
Font.Style:=[fsBold];
End;
except on E: Exception do
DBForm.InsertToException('CreatObjectUnit','CreatL able',e.Message);
end;
End;
//|QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
end.




حالا من با متد زیر یک Page ایجاد میکنم

CreatPage(ReportPages,'Page'+IntToStr(ReportPages. PageCount+1));

حالا میخوام ، یک لیبل ایجاد کنم که روی همین صفحه ایجاد شده من قرار بگیره
با این کد :

CreatLable((FindComponent('Page'+IntToStr(ReportPa ges.PageCount))as TAdvSmoothPage)
,'LBL1','کد رایانه :','Mitra',10,845,10);


اما مشکل اینجاست که ، لیبل نشون داده نمیشه

اینجا چطوری باید این کنترل Page رو به عنوان Parent لیبل مشخص کنم؟

tiphooo
سه شنبه 26 آذر 1392, 02:01 صبح
کد مذکور label را فقط روی صفحه آخر ایجاد می کند والا مشکل دیگری ندارد

hadisalahi2
سه شنبه 26 آذر 1392, 11:15 صبح
کد مذکور label را فقط روی صفحه آخر ایجاد می کند والا مشکل دیگری ندارد

خسته نباشی عزیزم
من میدونم کد مشکلی نداره
مشکل اینجاست که با وجود اینکه لیبل ساخته میشه ، اما روی صفحه آخر نشون داده نمیشه
من مجبورم برای اینکه برچسب ها نشون داده بشن
داخل پروسجر CreatPage پروسیجر CreatLable رو فراخوانی کنم
اما من میخوام با دو تا پروسیجر مستقل این کار رو انجام بدم

tiphooo
سه شنبه 26 آذر 1392, 23:04 عصر
FindComponent در داخل یک پروسیجر دیگر کامپوننت جدیدی را که ایجاد شده نمی تواند پیدا کند
بهتر است از خود اسم کامپوننت استفاده کنی
ReportPages.pages[ReportPages.PageCount-1]

hadisalahi2
چهارشنبه 27 آذر 1392, 10:46 صبح
FindComponent رو داخل پروسیجر اون یونیت استفاده نمیکنم
این رو توی فرم اصلی استفاده میکنم

این طوری که شما اصلا اسم پرنت قابل برگشت نیست و این کدی که نوشتی اصلا ربطی به نام کنترل نداره

tiphooo
چهارشنبه 27 آذر 1392, 23:04 عصر
FindComponent
این طوری که شما اصلا اسم پرنت قابل برگشت نیست و این کدی که نوشتی اصلا ربطی به نام کنترل نداره

شما تست کن جواب می دهد ReportPages.pages برگشتی از نوع TAdvSmoothPage می دهد ReportPages.pages[0] یعنی همون Page1 شما اگر دوست دارید حتما مطمئن شوید که همان Page1 است به صورت TAdvSmoothPage(ReportPages.pages[0] ) استفاده کنید در هر صورت خروجی یکی است. اگر دوست دارید اسمش را برگردانید که در تابع ساخت Label شما هیچ کاربردی ندارد باز هم می توانید به صورت TAdvSmoothPage(ReportPages.pages[0] ) .Name استفاده کنید

hadisalahi2
پنج شنبه 28 آذر 1392, 16:09 عصر
مشکل رو پیدا کردم
مشکل توی این خطه

NewPage:=TAdvSmoothPage.Create(Parent);

توی این خط به جای پارمتر Creat باید نام فرم مقصد رو قرار بدیم ، به صورت زیر :

NewPage:=TAdvSmoothPage.Create(ProjectReportForm);

من همون Parent ارسالی به پروسیجر رو به عنوان Owner ارسال میکردم که اینطوری ، هیچ کدوم از کنترلهای ایجاد شده ، قابل دسترسی نبودند و خطای AV میدادند

ولی با عوض کردن مقدار اون با نام فرم مقصد ، میشه به کلیه کنترل های ساخته شده دسترسی پیدا کرد.

tiphooo جون ، این جواب شما ، نکته انحرافی رو مشخص کرد :لبخند: