BCB 中实现动态创建组件另外由于 BCB 对内存管理或与系统、硬件的冲突,你的动态创建程序也许一点错误都没有, 但就是编译不了; 有时也许第一次通过了,第二次一样的程序却通过不了,出现这样那样的提示,最简单的办法就是注销一下系统,再试一下,多数就能解决了 BCB 中提供了大量的 VCL 组件, 有时难免要在程序中动态创建组件, VCL是用 Object Pascal 写的, 她与 C++ 语言还是存在着一些不同点的, 要掌握正确的方法, 不防我们先来看一下栈(stack) 与堆(heap) 的关系。栈(stack) 是存放函数的所有动态局部变量及函数调用和返回的有关信息的一块内存。栈的内存管理严格遵循先进后出的顺序, 这一点正是实现函数调用所需要的。从栈中分配内存效率特别高。数据对象使用栈中的内存( 如动态局部变量) 比使用堆中内存会使程序运行更快。堆(heap) 是供 malloc() 、 calloc() 、 realloc() 和 new 等函数获取内存空间的一块内存。从堆中获取内存比从栈中要慢得多, 但堆的内存管理却比栈灵活得多, 任何时候你都可以从堆中获取( 或释放) 内存, 我们可以按任意顺序进行。用来存放递归数据结构的内存几乎都要从堆中获取。用来存放字符串的内存通常也从堆中获取, 尤其是对那些在程序运行时可能出现的很长的字符串。从堆中获取的内存要用 free() 、 delete 来释放,它本身不会自动释放。 C 编译的程序能产生如此优质的代码、程序运行的快速与对栈的正确运用是有关的,但 Object Pascal 中所有的对象都只能建构于堆中,无法和 C++ 一样,能够在栈( 在函数内创建类的对象)、数据区段( 在函数外创建类的对象)、堆(用 new 等函数来创建类的对象) 三种地方建立对象,所以 VCL 类的对象我们只能在堆中创建。如创建一个按钮对象,我们可以这样来创建: TButton *BTnMy= new Tbutton(From1); 可以写成如下程式:类名* 对象名=new 类名(…); 注意: () 里面可以是你已创建的该类对象的父类名字、工程的名字、 NULL 或 this 。但最好是对象的父类名。例:动态生成按钮我们先在窗体(Form1) 上, 放一个按钮 Button1 , 在他的单击事件中写上如下代码: void __fastcall TForm1::Button1Click(TObject *Sender) { TButton *my=new TButton(Form1); my->Parent=Form1;// 最为关键的一句, 否则你将看不到什么, 但编译却是正确的 my->Top=200; my->Left=200; my->Height=25; my->Width=75; my->Caption=I'm Button!; //my->Visible=true; 此语句可有可无,因为他的父类通常默认他可见} 通过这个例子我们应该清楚的看出动态创建组件的
BCB中实现动态创建组件 来自淘豆网m.daumloan.com转载请标明出处.