首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

,关于自定义组件的初始化

2013-11-08 
求助 ,关于自定义组件的初始化我自定义了一个组件,继承于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)函数,显示前调用一下呀。

热点排行