BCB6常见问题
一段时间没用cbuilder了,再用的时候,发现总是磕磕绊绊,把遇到的一些“小问题”贴在这里,希望能给其他一些不熟悉cb6的人一些帮助: 1.先安装一些控件后,以后卸载,但编译后来的项目总提示找不到。。。,需要给一些lib,bpi指定路径? 解决方法:close掉工程,使用ultraedit打开.bpr文件,把你卸掉的一些*.bpi,*.lib从<SPARELIBS> ,<PACKAGES>中手工删除掉,保存。然后再打开编译就好了。 2.从旧版本cb项目中copy过来的文件,dfm格式以文本编辑器打开后是乱码? cbuidler中打开,切换到设计视图,右键选中“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,然后再打开,就没问题了! 5.使用TList时,使用delete 清除? 使用TList,一般我们都会 使用new ,添加指针类型到 TList中作为元素,因此在删除时,必须先delete每一个元素,再执行clear,然后在delte TList对象本身,如: if (pSubExeList) 虽然这是一个很简单的问题,但还是可以看到很多写的不正确的代码,:( 6.如果先生成了一个Form,后来需要把这个Form改为从另外一个基类Form继承? 方法是:1.修改类定义的方法,添加从基类继承; 7.在cbuilder查找一个函数很麻烦? 建议使用gexperts工具,其中有一个功能 “Procedure List”,把这个菜单项拖到编辑区的右边,非常容易找函数,在代码量很多的情况下很方便。 另外这个工具还有个最常用的功能是:注释块和取消注释。写代码时没有这个东东真是累。 8.在实现自定义控件的时候或者动态构建界面的时候,需要写很多动态创建控件的代码。不知道怎么写或写起来太累? 有一个好方法,也是gexperts工具提供的,“Component to code”,先创建一个临时FOrm,把你想要动态创建的布局设计好,然后选中控件,点击“Component to code”,自动帮你生成了代码,你只需要copy过来,稍加整理就可以了。 9.特别多的头文件,到处都要添加include代码? 可以定义一个专门的.h 文件,把通常需要包含的所有include代码写在里面;以后用的时候就只用添加这一个.h 了。 10.几个常用的API函数: 找窗口:注意第一个是类名;第二个是窗口的Caption,返回窗口句柄 FindWindow(className,FormCaption) 动态启动另外一个可执行程序Exe,或者是打开文档:注意第四个参数,可用来传递程序的启动参数,参数之间以空格隔开,取参数。 ShellExecute (ParentFormHandle,"open",filename,startup arguments,default dir ,Show Mode) 取应用程序启动参数: ParamCount() :取参数个数; ParamStr(argument index):取参数,因为ParamStr(0)标识的是执行程序文件的名称,因此实际上第一个参数是ParamStr(1); 发送消息: PostMessage(Target WIndow Handle,Message Type ID,Message content Ptr,LParam):使用PostMessage时,当第二个参数,即自定义的消息标识<WM_User时,消息内容不能含有指针类型。因为接收的Form可能接收不到指针内容。 用于发送消息,不用等待结果即返回。 SendMessage(Target WIndow Handle,Message Type ID,Message content Ptr,LParam):用于发送消息,但等待结果返回。
PostMessage在进程内部使用的时候,消息内容含有指针类型,可以被成功接收;如跨进程,则只能使用copydata类型, SendMessage方法进行消发送: COPYDATASTRUCT data; SendMessage(pExeWnd,WM_COPYDATA,(WPARAM)Application->Handle,(LPARAM)&data); 11.TImage控件可以使用.gif格式的图片? 刚开始用的时候,发现TImage控件可以支持.gif格式的图片;后来发现又不行了,觉得很奇怪。原来是因为把TeeChart7控件卸载了! 装了TeeChart后,TeeChart自己包含了GifImage.pas,经过编译安装后就可以让Timage在设计时加载Gif格式的图片了(不过还没试能不能显示动画) 12.TLabel控件需要内容纵向居中? 开始一直以为TLabel控件不能纵向居中,后来才发现lauout!很多控件都有layout属性,如果是内容布局的问题,就尝试设置一下layout! 13. 图标资源都是gif或者jpg格式的,不能在TImageList中使用? 这要借助于Acdsee工具,打开Acdsee,选中所有你的gif或是jpg格式的图片,右键“工具”……“转换文件格式”……选中你bmp或者ico,然后就可以加在imagelist中使用了! 或者使用Snagit工具,在snagit中有个“BatchConvertImages”更方便、好用。 14. delete Component的时候出现异常? 有的时候会犯一个简单的错误,如: TFrame* pFrame; void __fastcall TMainForm::CreateFrame() void __fastcall TMainForm::~TMainForm() 在执行析构的时候可能会导致异常。主要是因为构造的时候不应使用Application作为Owner,应该使用MainForm作为其Owner。所以在构造Component的时候一定要注意把哪个对象作为Owner,因为Owner负责对象流的保存及资源释放等。 |
第二部分
1、BCB 编辑快捷键
左/右移 块代码
选中 块代码
1 CTRL+ SHIFT+ I 是整片往右移,
2 CTRL+ SHIFT+ U 是整片文字往左移
2、得到执行程序的当前路径
ExtractFileDir(Application->ExeName);
3、循环中响应其它操作
在循环内加入Application->ProcessMessage()这一句。
4、向外部提供dll函数标准windows格式
extern "C" __declspec(dllexport) __stdcall __int32 Fun(__int32 n32_i);
5、从外部dll输入函数标准windows格式
extern "C" __declspec(dllimport) __stdcall __int32 Fun(__int32 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)
Bool Boolean Boolean
Byte, Char Char Char
Char* Ref string Ref String
Colorref Uint Ulong
Double Double Double
Dword Uint Ulong
Float N/A N/A
Handle Uint Ulong
Hdc Uint Ulong
Hfile Uint Ulong
Hinstance Uint Ulong
Hwnd Uint Ulong
Int Int Int
Long Long Long
Lparam Uint Ulong
Lpbyte Ref Int Ref Long
Lpcwstr Ref Blob Ref Blob (Unicode use ToUnicode())
Lpcvoid Ref String Ref String
Lpdword Ref Uint Ref Ulong
Lpfiletime Ref Time Ref Time
Lpint Ref Int Ref Long
Lpstr,Lpcstr Ref String Ref String
Lpvoid Ref Structstruct_inst Ref Struct struct_inst
Lpword Ref Int Ref Ulong
Mcierror Long Long
Pbyte Ref Int[#] Ref Long[#]
Short Int Int
Structure Ref Struct struct_inst Ref Struct Struct_inst
Uint Uint Uint
Void** SUBROUTINE SUBROUTINE
Word Int Long
Wparam Uint Ulong
9、使用CB内存漏洞工具
选中Progect/Option->CodeGuard
支持环境CG32.LIB/CG32.DLL
10、MFC基本运行库目录
mfc42.dll
MFC42D.DLL
MFCD42D.DLL
MFCN42D.DLL
MFCO42D.DLL
MSVCP60.DLL
MSVCP60D.DLL
MSVCRTD.DLL
NTDLL.DLL
11、数据库连接测试(ADO)
建一文件,*.udl,内容空。
双击,按照提示操作。
12、编译器设置
Project|Options
Compiler(编译)
"Full debug"(完全调试模式)
"Code optimization"(代码优化)
"debugging"(调试)
"Debug information"(调试信息)
"Line number information"(行数信息)
"Disable inline expansions"(禁用内联扩展)
"Pascal"标签
"Optimization"优化
"debugging"(调试)
"Linker"(链接)
"Create debug information"(生成调试信息)
"Don’t generate state files"(不要生成状态文件)
"Use dynamic RTL"(使用动态RTL)
"Directories/Conditionals"(路径/条件)
"Packages"(程序包)
"Build with runtime packages"(带运行时程序包编译)
Tools|Debugger Options
Integrated debugging"(集成调试器)
Project|Build All(彻底的编译)
13、设置RTL
C builder 有几种运行时库,多线程静态链接库,单线程静态链接库 以及动态的,含有
VCL的,下面介绍多线程静态链接库,单线程静态链接库 是没有VCL的,VCL中自动 包含多线程。
Use RTL multi-threaded static 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 cw32mt.lib"/>
Use RTL single-threaded static library 使用单线程静态链接库
到*.bpr 中,按下面的修改即可。
<ALLLIB 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察看或者记事本。