免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7601 | 回复: 1
打印 上一主题 下一主题

BCB中实现动态创建组件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-10-31 13:21 |只看该作者 |倒序浏览
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->arent=Form1;//最为关键的一句,否则你将看不到什么,但编译却是正确的

     my->;Top=200;

     my->;Left=200;

     my->;Height=25;

     my->;Width=75;

     my->;Caption="I'm Button!";

     //my->;Visible=true;此语句可有可无,因为他的父类通常默认他可见

}

通过这个例子我们应该清楚的看出动态创建组件的几个重要步骤:

1)要一个空间(内存);// TButton *my=new TButton(Form1);

2)指定其父组件,说直接了就是我们要创建的这个对象要放在那个容器上;//     my->arent=Form1;

3)指定组件要出现在父类的那个位置;//my->;Top=200;my->;Left=200;my->;Height=25; my->;Width=75;所以这个属性你一定要设置好位置;

4)其它重要属性。// my->;Caption="I'm Button!";

并且其顺序不能反了,否则你的程序会出笑话的。

在动态生成非宝兰VCL原有的组件时要加上对应的头文件。如,我们要动态生成报表组件一定要加入:

#include  “Qrctrls.hpp”//若还有问题,你还要加入:

#include “QuickRpt.hpp”

另外由于BCB对内存管理或与系统、硬件的冲突,你的动态创建程序也许一点错误都没有,但就是编译不了;有时也许第一次通过了,第二次一样的程序却通过不了,出现这样那样的提示,最简单的办法就是注销一下系统,再试一下,多数就能解决了。

论坛徽章:
0
2 [报告]
发表于 2003-10-31 13:26 |只看该作者

BCB中实现动态创建组件

將資料型態寫在前面有助於以元件分辦你所有要的資料
类似于这样:edtInputBox, mmFile, btnCalc;
下列中左侧为缩写,右侧为组件名称。

------------------------
Standard  Tab
------------------------
mm   TMainMenu
pm   TPopupMenu
mmi  TMainMenuItem
pmi  TPopupMenuItem
lbl  TLabel
edt  TEdit
mem  TMemo
btn  TButton
cb   TCheckBox
rb   TRadioButton
lb   TListBox
cb   TComboBox
scb  TScrollBar
gb   TGroupBox
rg   TRadioGroup
pnl  TPanel
cl   TCommandList
------------------------
Additional Tab
------------------------
bbtn  TBitBtn
sb    TSpeedButton
me    TMaskEdit
sg    TStringGrid
dg    TDrawGrid
img   TImage
shp   TShape
bvl   TBevel
sbx   TScrollBox
clb   TCheckListbox
spl   TSplitter
stx   TStaticText
cht   TChart
------------------------
Win32 Tab
------------------------
tbc   TTabControl
pgc   TPageControl
il    TImageList
re    TRichEdit
tbr   TTrackBar
prb   TProgressBar
ud    TUpDown
hk    THotKey
ani   TAnimate
dtp   TDateTimePicker
tv    TTreeView
lv    TListView
hdr   THeaderControl
stb   TStatusBar
tlb   TToolBar
clb   TCoolBar
------------------------
System Tab
------------------------
tm    TTimer
pb    TPaintBox
mp    TMediaPlayer
olec  TOleContainer
ddcc  TDDEClientConv
ddci  TDDEClientItem
ddsc  TDDEServerConv
ddsi  TDDEServerItem
------------------------
Internet Tab
------------------------
csk   TClientSocket
ssk   TServerSocket
wbd   TWebDispatcher
pp    TPageProducer
tp    TQueryTableProducer
dstp  TDataSetTableProducer
nmdt  TNMDayTime
nec   TNMEcho
nf    TNMFinger
nftp  TNMFtp
nhttp TNMHttp
nMsg  TNMMsg
nmsg  TNMMSGServ
nntp  TNMNNTP
npop  TNMPop3
nuup  TNMUUProcessor
smtp  TNMSMTP
nst   TNMStrm
nsts  TNMStrmServ
ntm   TNMTime
nudp  TNMUdp
psk   TPowerSock
ngs   TNMGeneralServer
html  THtml
url   TNMUrl
sml   TSimpleMail
------------------------
Data Access Tab
------------------------
ds    TDataSource
tbl   TTable
qry   TQuery
sp    TStoredProc
db    TDataBase
ssn   TSession
bm    TBatchMove
usql  TUpdateSQL
------------------------
Data Controls
------------------------
dbg   TDBGrid
dbn   TDBNavigator
dbt   TDBText
dbe   TDBEdit
dbm   TDBMemo
dbi   TDBImage
dblb  TDBListBox
dbcb  TDBComboBox
dbch  TDBCheckBox
dbrg  TDBRadioGroup
dbll  TDBLookupListBox
dblc  TDBLookupComboBox
dbre  TDBRichEdit
dbcg  TDBCtrlGrid
dbch  TDBChart
------------------------
Decision Cube Tab
------------------------
dcb   TDecisionCube
dcq   TDecisionQuery
dcs   TDecisionSource
dcp   TDecisionPivot
dcg   TDecisionGrid
dcgr  TDecisionGraph
------------------------
QReport Tab
------------------------
qr    TQuickReport
qrsd  TQRSubDetail
qrb   TQRBand
qrcb  TQRChildBand
qrg   TQRGroup
qrl   TQRLabel
qrt   TQRText
qre   TQRExpr
qrs   TQRSysData
qrm   TQRMemo
qrrt  TQRRichText
qrdr  TQRDBRichText
qrsh  TQRShape
qri   TQRImage
qrdi  TQRDBMImage
qrcr  TQRCompositeReport
qrp   TQRPreview
qrch  TQRChart
------------------------
Dialogs Tab
------------------------
The dialog box components are really forms encapsulated by a component. Therefore,they will follow a convention similar to the form naming convention. The type definition is already defined by the component name. The instance name will be the same as the type instance without the numeric prefix, which is assigned by Delphi. Examples are as follows:

类型                 实例名称
TOpenDialog         OpenDialog
TSaveDialog         SaveDialog
TOpenPictureDialog  OpenPictureDialog
TSavePictureDialog  SavePictureDialog
TFontDialog         FontDialog
TColorDialog        ColorDialog
TPrintDialog        PrintDialog
TPrintSetupDialog   PrinterSetupDialog
TFindDialog         FindDialog
TReplaceDialog      ReplaceDialog
------------------------
Win31 Tab
------------------------
dbll  TDBLookupList
dblc  TDBLookupCombo
ts    TTabSet
ol    TOutline
tnb   TTabbedNoteBook
nb    TNoteBook
hdr   THeader
flb   TFileListBox
dlb   TDirectoryListBox
dcb   TDriveComboBox
fcb   TFilterComboBox
------------------------
Samples Tab
------------------------
gg    TGauge
cg    TColorGrid
spb   TSpinButton
spe   TSpinEdit
dol   TDirectoryOutline
cal   TCalendar
ibea  TIBEventAlerter
------------------------
ActiveX Tab
------------------------
cfx  TChartFX
vsp  TVSSpell
f1b  TF1Book
vtc  TVTChart
grp  TGraph
------------------------
Midas Tab
------------------------
prv   TProvider
cds   TClientDataSet
qcds  TQueryClientDataSet
dcom  TDCOMConnection
olee  TOleEnterpriseConnection
sck   TSocketConnection
rms   TRemoteServer
mid   TmidasConnection
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP