




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、BCB6开发经验谈一第三方控件的安装与卸载写下此文章是为了那些还还没有接触过第三方控件的,而又为第三方控件的安装与卸载而烦恼的开发人员。就我所了解与使用过的有Raize、DevExpress、SuiPack、DBGridEh、FastReport 等。而如何正确的安装与卸载呢?并不像windows的安装程序与卸载那么傻瓜化。如果是傻瓜化的安装与卸载,那就没必要写下这遍文章指导初学者。以前刚接触第三方控件时,也曾为安装某一控件使用,又过一段时间将其卸载后,重新新建一个工程就编译不过了而感到烦恼。第三方控件的安装相对简单一点,像Raize控件,就一个RC.exe文件就可以安装。DevExpress
2、相对麻烦一点,现在都有一个Auto-I nstallor自动安装。在这里主要讲的是卸载第三方控件。第三方控件的卸载,在BCB6中要经过三个步骤:Remove Packages.移除相应的软件包。1 打开 BCB6,然后 File->Close All。2 Component->Install Packages ,然后选择要移除的软件包,点击Remove按钮。(2) Remove Include Path/Lib Path/Palette Pages 移除 Include/Lib/Pages 信息。1 Project->Option->Directories/Condit
3、ionals->lncludePath,去除要移除第三方控件的Include路径。2 Project->Option->Directories/Conditionals->Lib Path,去除要移除第三方控件的Lib 路径。3 Tools->Environment Options->Library,去除要移除第三方控件的Lib 路径。4 Tools->E nvironment Optio ns->Pallette->Pages,去除第三方控件的所有Page。(3) Remove Default.bpr File修改 Default.bpr
4、 文件,去除卸载了的 *.lib/*.bpi(重要)1打开BCB的安装目录->Bin,找到Default.bpr,然后用文本编辑器打开,显示一个xml文件的格式,工程库(LIBRARIES />),备用工程库(<SPARELIBS />),软件包(<PACKAGES />),将相应的第三 方控件 *.lib 与*.bpi 去除。例如 DevExpress 就移除 dx*.lib、cx*.lib、EQ*.lib 与 dx*.bpi、cx*.bpi、EQ*.bpi 文件。经过上面的修改,就把第三方控件完全卸载。重新新建一个工程就不会出现编译链接错误了。祝好运!一
5、段时间没用cbuilder 了,再用的时候,发现总是磕磕绊绊,把遇到的一些 小问题”贴在这里,希望能给其他一些不熟悉 cb6的人一些帮助:1. 先安装一些控件后,以后卸载,但编译后来的项目总提示找不到。,需要给一些lib , bpi指定路径?解决方法:close掉工程,使用ultraedit 打开.bpr文件,把你卸掉的一些 *.bpi , *.lib从<SPARELIBS> ,<PACKAGES>中手工删除掉,保存。然后再打开编译就好了。2. 从旧版本cb项目中copy 过来的文件,dfm 格式以文本编辑器打开后是乱码?cbuidler中打开,切换到设计视图,右键选中
6、“Text DFM,” OK !3. 旧版本cb项目中的copy 过来的Form ,先执行FormCreate才执行构造函数?使用ultraedit ,执行批量替换:选定你的代码目录录,对所有.dfm 文件,执行“ OldCreateOrder = True 替换为 “ OldCreateOrder = False”4. 加入到cc中的项目,打开时报错,提示“ File Access Denied或直接close 你的cb6 ?第一个问题是不应该把.res文件加入到cc,应该把该文件保存为私有;第二种情况需要你把项目.bpr,.bpf,.cpp三个文件先checkout ,然后再打开,就没问题
7、了!5. 使用 TList 时,使用 delete 清除?使用 TList ,一般我们都会 使用 new ,添加指针类型到 TList 中作为元素, 因此在删除时, 必须先 delete 每一个元素,再执行 clear ,然后在 delte TList 对象本身,如:if (pSubExeList)TSubExe* pSubExe=NULL;for (int i = 0; i < pSubExeList->Count; i+)pSubExe = (TSubExe*)pSubExeList->Itemsi;delete pSubExe;pSubExeList->Clear
8、();delete pSubExeList; pSubExeList = NULL;虽然这是一个很简单的问题,但还是可以看到很多写的不正确的代码,:(6. 如果先生成了一个 Form ,后来需要把这个 Form 改为从另外一个基类 Form 继承? 方法是: 1. 修改类定义的方法,添加从基类继承;2. 修改构造函数,改为执行基类的构造函数;3. 点击 Form ,右键 View As Text ,然后修改 第一个 object 为 inherited7. 在 cbuilder 查找一个函数很麻烦?建议使用 gexperts 工具,其中有一个功能“ Procedure List ”,把这个菜单
9、项拖到编辑区的右边,非常容易找函数,在代码量很多的情况下很方便。另外这个工具还有个最常用的功能是:注释块和取消注释。写代码时没有这个东东真是累。8. 在实现自定义控件的时候或者动态构建界面的时候, 需要写很多动态创建控件的代码。 不知道怎么写或 写起来太累?有一个好方法,也是 gexperts工具提供的,“Component tocode”,先创建一个临时 FOrm,把你想要动态创建的布局设计好,然后选中控件,点击“Component to code” ,自动帮你生成了代码,你只需要 copy 过来,稍加整理就可以了。9. 特别多的头文件,到处都要添加 include 代码?可以定义一个专门的
10、 .h 文件,把通常需要包含的所有 include 代码写在里面;以后用的时候就只用添加 这一个 .h 了。10. 几个常用的 API 函数 :找窗口:注意第一个是类名;第二个是窗口的 Caption ,返回窗口句柄FindWindow(className,FormCaption)动态启动另外一个可执行程序 Exe ,或者是打开文档:注意第四个参数,可用来传递程序的启动参数,参 数之间以空格隔开,取参数。ShellExecute (ParentFormHandle,"open",filename,startup arguments,default dir ,Show Mod
11、e )取应用程序启动参数:ParamCount () :取参数个数;ParamStr ( argument index ):取参数,因为 ParamStr (0 )标识的是执行程序文件的名称,因此实 际上第一个参数是 ParamStr(1);发送消息:PostMessage(Target WIndow Handle,Message Type ID,Message content Ptr,LParam):使用PostMessage 时,当第二个参数,即自定义的消息标识 <WM_User 时,消息内容不能含有指针类型。 因为接收的 Form 可能接收不到指针内容。 用于发送消息,不用等待结果
12、即返回。SendMessage(Target WIndow Handle,Message Type ID,Message content Ptr,LParam):用于发送消息,但等待结果返回。PostMessage 在进程内部使用的时候,消息内容含有指针类型,可以被成功接收;如跨进程,则只能使用 copydata 类型, SendMessage 方法进行消发送 :COPYDATASTRUCT data;data.dwData = MsgFlag; /a 窗? C± e e?data.cbData = Msg.Length();/memcpy(data.lpData,cMsg,strl
13、en(cMsg);data.lpData = Msg.c_str();SendMessage(pExeWnd,WM_COPYDATA,(WPARAM)Application->Handle,(LPARAM)&data)J11. TImage控件可以使用 .gif 格式的图片?刚开始用的时候,发现 TImage 控件可以支持 .gif 格式的图片;后来发现又不行了,觉得很奇怪。原来是 因为把 TeeChart7 控件卸载了! 装了 TeeChart 后, TeeChart 自己包含了 GifImage.pas, 经过编译 安装后就可以让 Timage 在设计时加载 Gif 格式的图
14、片了(不过还没试能不能显示动画)12. TLabel控件需要内容纵向居中?开始一直以为 TLabel 控件不能纵向居中,后来才发现 lauout !很多控件都有 layout 属性,如果是内容 布局的问题,就尝试设置一下 layout !13. 图标资源都是 gif 或者 jpg 格式的,不能在 TImageList 中使用?这要借助于Acdsee工具,打开Acdsee,选中所有你的gif或是jpg格式的图片,右键工具”转换文件格式"选中你bmp或者ico,然后就可以加在imagelist中使用了!或者使用 Snagit 工具,在 snagit 中有个 “ BatchConvertI
15、mages ” 更方便、好用。14. delete Component的时候出现异常?有的时候会犯一个简单的错误,如:TFrame* pFrame;void _fastcall TMainForm:CreateFrame()pFrame = new TFrame( Application );void _fastcall TMainForm:TMainForm()if(pFrame)delete pFrame;在执行析构的时候可能会导致异常。主要是因为构造的时候不应使用Applicati on 作为Own er,应该使用Main Form 作为其Ow ner。所以在构造 Comp on e n
16、t 的时候一定要注意把哪个对象作为 Ow ner,因 为Owner负责对象流的保存及资源释放等。第二部分1、BCB编辑快捷键左/右移块代码选中块代码1 CTRL+ SHIFT+ I是整片往右移,2 CTRL+ SHIFT+ U是整片文字往左移2、得到执行程序的当前路径ExtractFileDir(Applicatio n->ExeName);3、循环中响应其它操作在循环内加入 Application->ProcessMessage()这一句。4、向外部提供dll函数标准windows 格式extern "C" _declspec(dllexport) _stdc
17、all _in t32 Fun(_in t32 n32_i);5、从外部dll输入函数标准windows 格式extern "C" _declspec(dllimport) _stdcall _in t32 Fun(_in t32 n32_i);6、对DLL的调试RUN/PARAMETERS中填上调用该 DLL 的 *.exe 。7、 使用*.chm帮助文件ShellExecute(NULL,NULL,帮助文件的路径,NULL,NULL,SW_SHOWNORMAL);8、PB_C数据类型转换表PB_C 数据类型转换表MICROSOFT PB(16Bit) PB(32Bit)
18、Bool Boolea n Boolea nByte, Char Char CharChar* Ref stri ng Ref Stri ngColorref Uint Ulo ngDouble Double DoubleDword Uint Ulo ngFloat N/A N/AHan dle Ui nt Ulo ngHdc Uint Ulo ngHfile Ui nt Ulo ngHin sta nee Uint UlongHwnd Ui nt Ulo ngInt Int IntLong Long LongLparam Uint UlongLpbyte Ref Int Ref LongLp
19、cwstr Ref Blob Ref Blob (Un icode use ToUn icode()Lpcvoid Ref Stri ng Ref Stri ngLpdword Ref Uint Ref Ulo ngLpfiletime Ref Time Ref TimeLpi nt Ref Int Ref LongLpstr,Lpcstr Ref String Ref StringLpvoid Ref Structstruct_ inst Ref Struct struct_i nstLpword Ref Int Ref Ulo ngMcierror Long LongPbyte Ref I
20、n t# Ref Lon g#Short Int IntStructure Ref Struct struct_i nst Ref Struct Struct_i nstUint Uint UintVoid* SUBROUTINE SUBROUTINEWord Int LongWparam Ui nt Ulo ng9、使用CB内存漏洞工具选中 Progect/Option->CodeGuard支持环境 CG32.LIB/CG32.DLL10、MFC基本运行库目录mfc42.dllMFC42D.DLLMFCD42D.DLLMFCN42D.DLLMFCO42D.DLLMSVCP60.DLLM
21、SVCP60D.DLLMSVCRTD.DLLNTDLL.DLL11、数据库连接测试(ADO) 建一文件,*.udl,内容空。双击,按照提示操作。12、编译器设置Project|Opti onsCompiled 编译)"Full debug"(完全调试模式)"Code optimizatio n"(代码优化)"debuggi ng" (调试) "Debug in formati on" "Line number information""Disable inline expa nsion
22、s"(调试信息)(行数信息)(禁用内联扩展)"Pascal"标签 "Optimizatio n" 优化 "debuggi ng" (调试)"Li nker"(链接)(生成调试信息)(不要生成状态文件)"Create debug in formati on""Don ' t gen erate state files""Use dynamic RTL"(使用动态 RTL)(路径/条件)(带运行时程序包编译)"Directories
23、/C on diti on als" "Packages"(程序包) "Build with run time packages"Tools|Debugger Opti onsIn tegrated debugg ing"(集成调试器)Project|Build All(彻底的编译)13、设置RTLC builder有几种运行时库,多线程静态链接库,单线程静态链接库 以及动态的,含有VCL的,下面介绍多线程静态链接库,单线程静态链接库是没有VCL的,VCL中自动 包含多线程。Use RTL multi-threaded static
24、library使用多线程静态链接库到*.bpr 中,按下面的修改即可。<CFLAG1 value="-tWD -tWM -Od -H=$(BCB)libvcl50.csm -Hc -Vx -Ve -X- -r- -a8 -b- -k -y -v-vi- -c"/><ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cw32mtib"/>Use RTL sin gle-threaded static library使用单线程静态链接库到*.bpr 中,按下面的修改即可。<A
25、LLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cw32.lib"/>14、CODEGUARD 调试器库文件 CG32.LIB/CG32.DLL一、 编译(Project/Option-> CodeGuard)二、运行(Tools/CodeGuard Configuration)文件为*.CGI日志文件中,文件名为*.CGI。用 View/Debug Window/CodeGuard Log察看或者记事本。10.4 创建和编辑包 创建一个包需要指定:包的一个名字。新包要求使用或链接的其他包的列表。包编译时包含
26、或绑定的单元文件的列表。包实质上是这些包含已编译 .BPL功能的源代码单元的封装, 包含(Con tai ns )列表是想编译进包的定制组件的源代码单元放置的地方。一个包由C+源文件(.CPP)和扩展名为.BPK的工程选项文件定义。这些文件由包编辑器生成。10.4.1 创建包创建包的过程如下。参见10.4.4节可获得关于这些步骤的更多信息。1)选择File|New ,然后选择Package图标并单击“ 0K”2)生成的包被显示在包编辑器中。3)包编辑器为新包显示出一个Requires 节点和一个 Contains 节点。4)要把一个单元加入包含列表 ,点击Addtopackage 快速按钮。在
27、 Addunit 页的Unitfilename 编辑框 输入.CPP文件名,或点击 Browse浏览文件,然后单击 “0K。选择的单元出现在 Contains 节点的包编 辑器下。通过重复这个步骤增加其他单元。5)把一个包加入要求列表,点击Addtopackage 快速按钮。在Requires 页的Unitfilename 编辑框输入 一个.BPI文件名,或点击Browse 浏览文件,然后单击OK (这将增加语句USEPACKAGE(“packageName.bpi”)到步骤1生成的CPP文件)。选择的单元出现在 Requires 节点的包编辑器下。通过重复这个步骤增加其他包。6)点击Opti
28、ons快速按钮,并决定想创建的包的种类。创建仅用于设计时的包(不能在运行时使用的包),选择Designtimeonly单选按钮。(或增加-Gpd链接器开关到 BPK文件中:LFLAGS=.-Gpd. )创建仅用于运行时的包(不能被安装的包),选择Runtimeonly单选按钮。(或增加-Gpr链接器开关到BPK 文件中:LFLAGS=.-Gpr .)创建设计时和运行时可用的包,选择Designtimeandruntime单选按钮。7)在包编辑器,点击 Compilepackage快速按钮编译包。10.4.2 编辑现有的包下面是打开和编辑一个现有的包的方法。选择 File|Open(或 File
29、|Reopen )并选择一个 CPP 或 BPK 文件。选择 Component|InstallPackages,从 DesignPackages列表中选择一个包,并点击 Edit 按钮。当包编辑器打开时,在Requires 节点选择包,右击鼠标,并选择 Open。编辑一个包的说明或设置使用选项时,选择包编辑器中的 Options 快速按钮并选择 Description标签页。ProjectOptions对话框的左下角有一个 Default复选框。当它被选择时单击OK,所做的选择存为新的包工程的缺省设置。要恢复原来的设置,删除或重命名 DEFAULT .BPK文件。10.4.3 包源文件和工程
30、选项文件包源文件带有.CPP扩展名。包工程选项文件使用 XML格式创建,并带有.BPK ( Borland 包)扩展名。 通过在包编辑器的 Con tai ns 或Requires子句上右击鼠标,并选择 EditOptio nSource 显示包的工程选 项文件。注意 C+Builder 维护.BPK文件。通常不需要自行编辑它。应该使用ProjectOptions对话框的Packages 标签页来修改。一个名为MyPack的包的工程选择文件的一部分如下所示:<MACROS><VERSION value=,BCB.05.02'/><PRQJECT value
31、'MyPack.bpl-<OBJFILES valuer*ttyPack.obj Unit2.obj Unit3.obj*/><RESF1LES value:1 MyPack.res */><TDLF1LBS value=*V><IDLGEMFILES valuer*'/>'<DEFFILE value=T*/><RESDEPEN value='$1RESFILESf /><LIBPIL£S value=*/>崛LIBRARIES value="/>cS
32、PARELIBS value-*VciS0.1ib7><PACKAGES value-'VclSOhpi gldbx5D,bpif:>在这种情况下,MYPACK.CPP将包括下列代码:USERESrMyPack.res'l;USEPACKAGEf"VC150.bpi11;USEPACKAGE(pvcldbxSO.bpi *»USEUliIT(*Unit2.cpp*>QSWITCUnitLcpp*|;MyPack的包含列表包括 3个单元:MyPack本身、Unit2 和Unit3。MyPack的要求列表包括 VCL50 和 VCLDBX
33、50 。将组件打包如果使用 NewComponent 向导创建组件(通过选择Component|NewComponent) C+Builder 在所需位置插入 PACKAGE 宏。但若在旧版本的C+Builder中定制组件,必须自行将PACKAGE加入两个地方。C+Builder中一个组件的头文件声明必须包括以class引导的预定义的宏 PACKAGE :class PACKAGE Mycompo nent :.并且在组件被定义的 CPP文件中,必须在 Register函数的声明中包括 PACKAGE宏:void _faste&ll PACKAGE Register()PACKAGE宏
34、扩展为语句以便允许类可输出到结果BPL文件或从文件中引入。1044 理解包的结构包”包括下列部分:包名。要求列表。包含列表。1. 命名包包名必须在工程中是唯一的。如果把一个包命名为STATS,包编辑器分别生成一个源文件STATS.CPP和工程选项文件 STATS.BPK ;编译器生成一个可执行文件STATS.BPL, 一个二进制映象 STATS.BPI和(可选)一个静态库 STATS.LIB。要在应用程序中使用包,把STATS加入RuntimePackages编辑框(选择 Project|Options,并点击 Packages 标签页后)。2. 要求列表要求列表指定当前包使用的其他外部的包。
35、在编译时,要求列表中列出的外部包自动链接到使用当前包和外部包的某一单元的任何应用程序。如果当前包中包含的单元文件引用其他包的单元,那个包应在当前包的要求列表中出现,或者应将它增加到要求列表中。如果它被从要求列表中省略,编译器将把它引入到包的隐式包含单元”。注意 你创建的大多数包将需要 VCL50。任何依赖VCL单元的包(包括 SysUtils )必须列出 VCL50,或 另外一个要求 VCL50的包要在其要求列表中列出VCL50包。(1)避免循环的包引用包的要求列表中包含循环的引用。这意味着:包不能在它的要求列表中引用自身。一个引用链终止前必须没有重引用链中的任何包。如果包A要求包B,那么之后
36、包B就不能要求包 A ;如果包A要求包B,并且包B要求包C,之后包 C不能要求包 A。(2)处理重复的包引用在包的要求列表中, 或在RuntimePackages编辑框中,对包的重复引用将被编译器忽略。但为了编程清晰及可读性,应该找到并删除重复的包引用。3. Co ntai ns 列表Contains 列表指出被绑定到包的单元文件。如果编写自己的包,就应先将自己的源代码存入.CPP文件,然后将该文件加入到 Con tai ns 列表当中。避免使用重复的源代码包不能出现在另一个包的Con tai ns 列Contains 列表中的单元,在表中。直接包含在Contains 列表中的单元,或通过这些
37、单元而间接包含进 编译的时候都会被绑定到包。一个单元不能(直接或间接)的被同一个应用程序(包括C+Builder 的IDE )所使用的一个以上的包同时包含。这意味着,如果你创建的包中包含VCL50中的一个单元,就不能把这个包装入IDE中。要使用已包含在其他包中的单元,应将该包加入到Requires列表中。10.4.5 编译包编译包可以通过IDE,也可以使用命令行编译。要使用IDE编译包,1)选择File|Open ,选择包的源文件或工程选项文件,然后点击Open 。2)打开编辑器后,选择Project|Make 或 Project|Build 。可以直接在包的源代码中插入编译器描述符。详细信息
38、,参阅下面的与包相关的编译器描述符”。如果使用命令行编译,可以使用与包相关的几个连接器开关。更多信息,参阅下文的使用命令行编译器和链接器'。1.与包相关的编译器描述符2.虚包装#pragmapackage(smart_ in it,weak)表10-2列出了可插入包的源代码中的一些包特定的编译器描述符。包険忑的港谨岸怡述為用 邃pragDia packanart_inLtpaclka sei. 5niart_mt. weak)中的单元% MM关乘所决定的續序核初洁比(桑省包含在旦的薄 代码立件中包的单元"虚邑芸”卷见下面的円虎包装”。直按加入单元源丈件中描述符影响.OBJ文件
39、在包的.BPI和.BPL文件中的存储方式。 如果单元文件中出现#pragm apackage(smart_i ni t,weak)描述符,编译器会在可能的情况下忽略该程序单元,而在其他应用程序或包要求使用该单元时,为其生成一个不包含在包中的本地化副本。使用这个描 述符编译的单元称为虚包装”。例如,假设已经创建了只包含一个单元 UNIT 1的包PACK。同时假设UNIT1没有使用其他单元,但调用 了 RARE.DLL。当编译包时,如果加入 UNIT1.CPP 文件,UNIT1 就不会被包含进 PACK.BPL中;同时 也不必将RARE.DLL与PACK 一起分发。不过,UNIT1仍然包含在PAC
40、K.BPI文件中,如果它被其他的 包或应用程序引用,它会从 PACK.BPI文件中被复制并直接编译到工程中。现在假设添加第二个单元UNIT2到包PACK中,并假设UNIT2使用了 UNIT1。这时,即使在编译包时在UNIT1.CPP 中加入#pragmapackage(smart_init,weak)描述符,编译器仍然会将UNIT1 包含进PACK.BPL中。但其他的包或应用程序引用UNIT1时,仍使用从PACK.BPI文件中复制的、不包含在包中的本地化副本。注意包含#pragmapackage(smart_init,weak)描述符的单元文件不能拥有全局变量。#pragmapackage(smart_init,weak)描述符是为需要将 BPL分发给其他 C+Builder程序员的开发者提供的一个高级选
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 超市员工2025年度环境与职业健康合同
- 二零二五拼多多商家入驻合同范本:电商合作细节解析
- 二零二五年度城市广场绿化维护个人服务合同
- 2025年度通信工程施工现场环境保护合同
- 2025年度茶叶文化研究及出版合作协议
- 二零二五年度民办学校教职工校企合作与产学研用合同
- 冷库租赁与冷链物流信息化管理服务协议2025
- 二零二五年度个人委托代付款安全无忧服务合同
- Unit 8 How are you?Period 3 词汇与语法过关 同步练习(含答案)
- 2025年西安货运从业资格考试题目大全及答案
- 《给校园植物挂牌》课件
- ISO27001标准培训课件
- 气道高反应性教学演示课件
- 《审核员培训教程》课件
- 公文写作格式规范课件
- 强酸强碱培训课件
- 蔬菜种植与有机农业培训
- 《光催化技术》课件
- 危大工程监理巡视检查用表
- 宝钢BQB 481-2023全工艺冷轧中频无取向电工钢带文件
- 企业文化变革的阻力与推进策略
评论
0/150
提交评论