求助 ,关于自定义组件的初始化我自定义了一个组件,继承于TPaintBox,重载了Paint()函数:void __fastcall TM
求助 ,关于自定义组件的初始化
我自定义了一个组件,继承于TPaintBox,重载了Paint()函数:
void __fastcall TMyPaintBox::Paint(void)
{
int w,h;
w=this->Width;
h=this->Height;
CalcArea(w,h); //计算绘图区域
DosomePaintting(); //画图
}
那么,在其他地方使用这个组件的时候,无论是在设计阶段拖控件到窗体,还是在运行阶段动态加载这个控件,都可以看见我画图的内容。
后来我想,在我的程序中,组件的宽度和高度,始终是不改变的,所以就想把“计算绘图区域”这个工作,放到其他地方,那些在组件生命周期,只执行一次的地方,以便加快绘图的速度。
于是我就把绘图代码中的:
int w,h;
w=this->Width;
h=this->Height;
CalcArea(w,h); //计算绘图区域
放到了组件的构造函数中,结果不行,原因就是在构造函数中,得不到正确的Width和Height。后来我又找到了组件的一个可以重载的函数:
void __fastcall Loaded(void);
这个函数,只会执行一次(应该吧。。)。这次可以,在设计阶段,拖一个组件到窗体上,就可以看见正确的绘图结果,但是在动态加载组件的时候,不行,原因还是得不到正确的Width和Height
动态加载组件的代码:
MyPaintBoxs[i]=new TMyPaintBox(this);
MyPaintBoxs[i]->Parent=this;
MyPaintBoxs[i]->Width=80;
MyPaintBoxs[i]->Height=100;
MyPaintBoxs[i]->Left=(i% 12)*MyPaintBoxs[i]->Width;
MyPaintBoxs[i]->Top=110*(i/12+1);
MyPaintBoxs[i]->Visible=true;
MyPaintBoxs[i]->Init();
MyPaintBoxs[i]->Show();
我就想知道,如何在组件中找到一个地方,只运行一次,并且可以正确得到组件的宽度和高度,还有组件Canvas->Handle 的?????
[解决办法]重载 SetWidth SetHeight 试试。
TForm运行过程大概是:
1、先创建实例,
2、加载DFM资源。创建DFM中的VCL控件,执行设定,按顺序调用Loaded函数通知每一个VCL实例。
3、执行TForm构造函数及OnCreate事件。
如果你的实例是动态创建的,那么Loaded过程就没有被调用了,因为那是加载DFM时调用的。
既然是动态加载,你也可以公开CalcArea(w,h)函数,显示前调用一下呀。