当前位置:文档之家› BCB编程过程中的各种问题集锦

BCB编程过程中的各种问题集锦

BCB编程过程中的各种问题集锦
BCB编程过程中的各种问题集锦

C++需要掌握:类、构造函数、析构函数、函数重载、运算法重载;私有成员、公有成员、保护成员的作用域。

一:安装

1、找到INSTALL文件夹里,双击Setup,注册码可从注册机中获得。安装时选择custome

方式,最好装在c盘(即使装在D盘,重做系统后也必须重装)。

2、注意一些选项勾选去掉就可以,不装VisiBroker和interbase,可以不备份uninstall信息。

3、安装完成后,重新启动计算机,打开BCB,会提示注册,再打开注册机,将所给的三个

代码全部输入到注册机中,注册机会自动给出第四个代码,将其粘贴到空白选项内,即可完成注册。

4、Win7系统注意:帮助文档安装不上的需要另外安装一个更新包,将帮助文档连接上即

可,此更新包叶连杰有。此外还会出现管理权限问题,可通过各盘右键单击,属性->安全->编辑中将所有用户的完全控制打钩即可。

二:开始运行

1、创建工程File->New->Application

2、修改Tabsize,菜单tools->Editor Option->Tab Stops=4

3、保存:创建一个工程目录,下建sourse子目录,用于存放工程源文件。会先提示保存

窗体和类的名字,一般名字前加U表示Unit,窗体文件前面加UForm,再保存工程名一般名字前面加个Pro。

4、文件存放位置:通过Project->Options->Directories/Conditionals来设置,将运行程序产生

的可执行文件、OBJ文件分别放在相应文件件内。通常Debug source path内输入$(BCB)\source\ ;Intermediate output 内输入debug(相应文件存入debug内),Final output 内输入exe。若要在上层文件夹内创建以上两个文件可在相应的输入前加..\ 。为了产生的文件可以在没有C++Builder的计算机上运行还要通过Project->Options->Linker内取消Use dynamicRTL选项的勾选、Project->Options->Packages内取消Build with runtime packages选项的勾选最后单击Complier->单击Release。

三:常用组件

1.Standard选项卡中

PopupMenu, Label, Edit, Memo, Button, CheckBox, RadioButton, ListBox, ComboBox, GroupBox,(RadioGroup, Panel)

2.Aditional选项卡中

StringGrid, LabelEdit, Chart(MaskEdit, Image, CheckListBox, ColorBox)

3.Win32选项卡中

PageControl, (DateTimePicker, StatusBar)

4.System选项卡中

Timer, MediaPlayer

5.Win31选项卡中

FileListBox, DirectoryListBox, DriveComboBox, FilterComboBox.

6.Dialog选项卡中

OpenDialog, SaveDialog(ColorDialog)

做菜单程序要用到的: MainMenu, ActionList, ImageList, Toolbar

四:常用函数

(一)字符串AnsiString相关

1、SubString(start,num) 字符截取函数start为起始位置,num为截取字符个数

2、Delete(start,num) 删除字符start为起始位置,num为截取字符个数

3、Length() 计算字符串长度

4、Pos(start) 计算start在该字符串内的位置

5、Trim 去除字符串左右的空格

6、UpperCase() 将字母改成大写

7、strcpy(目标,源)用于两个字符指针char*间的赋值

(二)字符串转换

IntToStr, FloatToStr, IntToHex,FormatString

StrToInt,StrToFloat.

c_str String类型的字符串形式(AnsiString型转换成char*型)

(三)获取文件信息

1.ExtractFileName 从全路径文件名中获取文件名

2.ExtractFilePath 从全路径文件名中获取路径包括最后的”\”

3.ExtractFileDir

4.ExtractFileExt

(四)文件操作

1.FileExists(“start”) 检测文件夹内是否存在文件名为start的文件

2.CopyFile

3.MoveFile

4.DeleteFile

(五)类的转换(用于批量处理类似的组件或者实现多个组件共用一个事件函数) dynamic_cast<类型名>(变量名)

五:串口通讯用到的函数

CreateFile 打开串口

CloseHandle 关闭串口

SetCommState 导入参数

GetCommState 导出参数

SetupComm(现在用不上)

SetCommTimeouts

ClearCommError

ReadFile

WriteFile

串口参数变量类型

COMMTIMEOUTS commtimeout

DCB dcb1,dcb2;

COMSTAT comstat1,comstat2;

六:网络通讯用到的组件

InterNet选项卡下的ClientSocket和ServerSocket

实验要求:

编写两个工程,或在同一个工程的两个窗体下,完成两个网络通讯组件的全部功能测试

服务器:

1.组件的配置(端口)

2.打开和关闭

3.客户端管理

4.断开某个客户端

5.向指定客户端发送数据

6.接收某个客户端发来的消息

7.各种事件的响应

客户端:

1.组件的配置(IP、端口)

2.连接和断开服务器

3.向服务器发送消息

4.接收来自服务器的消息

5.各种事件的响应

七:容器的使用

1.定义:vector MsgList;

2.向容器里最后压入一个基本单元

TMsgFromClient *MsgFromClient=new TMsgFromClient(CSocketMsg[ID]->StrIP,

CSocketMsg[ID]->IntPort,StrMsgBody);

MsgList.push_back(MsgFromClient);

3.从容器中删除一个单元

MsgFromClient=MsgList[0];

MsgList.erase(MsgList.begin());

OrigDataList.erase(OrigDataList.begin(),OrigDataList.begin()+HandleNum0-1);

4.指针的容器要注意内存释放的时机

八:自定义windows消息

1.宏定义一个消息的名字及其编号(该宏定义在消息发送的单元及消息处理单元均应可见)

#define WM_SSocket (WM_APP+405)

2.在消息处理单元定义消息的处理方法

#define WM_SSocketStatusChange (WM_APP+405) //由SSocket发来的信息

#define WM_SSocketControlMsg (WM_APP+406) //外部发来,控制SSocketprotected: ……………………..

//定义消息

void __fastcall SSocketStatusChange(TMessage &Message);

void __fastcall SSocketControlMsg(TMessage &Message);

BEGIN_MESSAGE_MAP

MESSAGE_HANDLER(WM_SSocketStatusChange, TMessage, SSocketStatusChange)

MESSAGE_HANDLER(WM_SSocketControlMsg, TMessage, SSocketControlMsg)

END_MESSAGE_MAP(TControl)

3.定义消息协议

//WPARAM(共32位):

// 第1~4位(最低4位):Socket事件状态:(0~F)

// 0--Accept(接受了客户端连接)

// 1--Connect(客户端建立连接)

// 2--DisConnect(断开连接)

// 3--Listen(正在监听)

// 4--Read(读到消息)

// 5--Write(发送消息)

// 6--GetSocket

// 7--GetThread

// 8--ThreadStart

// 9--ThreadEnd

// F--Error(出现错误)

// 第5~18位(14位):错误代码

// 第19~32位(14位):Client端口号

//LPARAM(共32位):Client的IP地址从高到低4个部分各占8位

4.消息的发送

PostMessage(MessageHandle,WM_SSocket,(IntLocalPort<<18)+3,(IP[0]<<24)+(IP[1]<<16) +(IP[2]<<8)+IP[3]);

5.编写消息处理函数的实现代码

九:INI文件的使用

TINIFILE *FileIni;

FileIni=new TiniFile(FileName);

StrMid=FileIni->ReadString(Section, key, Default Value);

FileIni->WriteString(Section, key, Value);

Delete FileIni;

十:多线程

Thread

Terminated

Suspend

Application->ProcessMessage()

Terminate();

Suspend()

Resume();

十一:数据库编程

基本概念

数据库、数据库表(字段、字段类型)、数据库引擎(ADO,BDE,ODBC)、SQL语言BCB编程

1.加入数据库组件ADOConnection, ADOCommand, ADOQuery

2.连接数据库

ADOConnection->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+StrFileName+";Persist Security Info=False";

ADOConnection->Connected=true;

3.编写修改数据库的SQL语句的执行代码

bool TModuleADO::ModifySQL(AnsiString StrSQL)

{

ADOCommand->CommandText=StrSQL;

try

{

ADOCommand->Execute();

return true;

}

catch(...)

{

ShowMessage("TCustomerData::ModifySQL错误:\n"+StrSQL);

return false;

}

}

4.编写查询数据库的SQL语句的执行代码

bool TModuleADO::SelectSQL(AnsiString StrSQL)

{

QuerySelect->Close();

QuerySelect->SQL->Clear();

QuerySelect->SQL->Add(StrSQL);

try

{

QuerySelect->Open();

}

catch(...)

{

QuerySelect->Close();

ShowMessage("TCustomerData::SelectSQL错误:\n"+StrSQL);

return false;

}

return true;

}

5.查询到的数据如何取出

QuerySelect->Fields->Fields[i]->FieldName;//获取查到的数据集的字段名

QuerySelect->FieldByName(StrField)->AsString.Trim()

6.其他相关指令

ADOConnection->GetTableNames(SLTableName,false);//获取数据库中的数据库表名

日常遇到的问题

1、命名规则:窗体命名为”UForm…”

2、*.bpr和*.res不需要我们修改

3、内存泄露:一定要注意处理内存泄漏的问题,定义一个指针后,在new之后一定要在使

用后写上delete的程序,一般没要情况下建议直接用数组形式。

例:char* str;

str=new char[num];

…….

delete []str;

4、同一层的一定要同时把大括号写上

5、ShowMessage函数经常调用,用去弹出窗口显示字符的

6、编程过程中会生成备份文件,即文件名前面有~的,可以删除

7、.tds文件可以删除

8、程序打包略

9、类的保存习惯用T打头

10、所有BCB自带的头文件都用“<>”,自己的文件要用双引号

11、C++常用的有:类、构造函数、析构函数、函数重载、运算法重载

12、程序如不能但不运行解决办法:Project->Options->Compiler->点击Full Debug

13、二维数组引用:首先定义一个二维数组,然后定义一个一维数组,将二维数组每行

的首地址依次赋给一维数组,然后引用一维数组的首地址进函数。

14、动态链接库的建立:(1)New->Other 选择DLL Wizard 默认选择C++ 右侧默认只

选第三项;(2)将所需添加的类的.cpp和.h文件放在动态链接库的文件件内并加载到工

(3)向DLL中填写出口函数,函数名:extern "C" __declspec(dllexport) 程中后保存整个工程;

+函数名,函数内容均可按C++Builder方法编写,但要注意出口函数的参数要用C方式编写(即参数不应该有AnsiString等);(4)编写完成按Ctrl+F9编译产生.Lib和.DLL文件。

15、DLL的使用:(1)创建一个DLL的头文件.h(注:头文件内容和DLL内的函数类似,

唯一区别是它是调用该DLL的入口程序,dllexport应该改写成dllimport,函数名后加分号);(2)将Lib文件和.h文件复制到调用该动态链接库的工程sourse文件夹内,.DLL 文件放入exe文件夹内;(3)在工程内的要调用的动态链接库的窗体内加入如下两个语句:

#include " .h" //声明要使用的函数(也可直接将声明写入应用程序的代码中)

#pragma comment (lib," .lib")//静态调用动态链接库

空格处为文件名。

16、动态链接库单步调试:(1)在动态链接库的工程里面,添加一个宿主程序,Run->Run

Parametres,在Host Application里面将我们的宿主程序的exe文件添加进来;(2)由于DLL 文件输出是在当前文件夹内,而exe只能调取exe的文件夹,所以还应改一下DLL的输出路径,将DLL的输出路径改为宿主程序的exe文件夹内,Project->Directions/Conditionals->Final output->改成我们所需的输出路径即可。

17、超限问题:进行数据处理的时候一定要注意索引等等,从0开始进行索引,因此界

限一定要定好,不能超限(此问题会经常出现)

18、if(GMapExtract!=NULL)

{

delete []GMapExtract;

GMapExtract=NULL;

}

要想用检测是否为空而设置指针,应现在构造函数中定义该指针为空,并delete之后继续赋值为空。

19、为一个类赋值(MyImage3.Assign(ImageSrc->Picture->Bitmap);),不能用MyImage3=……;那样会使用拷贝函数,类之间的处理应尽量少用等号。

20、使用本程序时,在新建每个类或组件时应加上#define EXTERN;因为在新盘螺栓里用了个匹配。

21、角点检测的两个结构体数组不要忘了delete

22、TMyImage的类里的Sobel函数内的纵向梯度中上行减下行中的下行中有一个应为减1

23、TMyImage的类里的ShowGMapMatchImage函数内的GMapMin应该GMapMin=GMap[MapOrder[ShowNum]];原程序只是GMapMin=GMap[ShowNum];

24、在定义一个类时,在定义后面个public 。。说明这个类时public后面那个类的寄生类,后面那个类的函数在这个类里正常使用;最后加的语句extern PACKAGE 。。为全局变量的声明,说明此类是一个类,如果没有这个语句,这个类就可以当做一个结构体使用。

25、栈的常用函数:

基本操作:

InitStack(&S) 构造一个空栈S

DestroyStack(&S) 栈S存在则栈S被销毁

ClearStack(&S) 栈S存在则清为空栈

StackEmpty(S) 栈S存在则返回TRUE,否则FALSE

StackLength(S) 栈S存在则返回S的元素个数,即栈的长度

GetTop(S,&e) 栈S存在且非空则返回S的栈顶元素

Push(&S,e) 栈S存在则插入元素e为新的栈顶元素

Pop(&S,&e) 栈S存在且非空则删除S的栈顶元素并用e返回其值

StackTraverse(S,visit())栈S存在且非空则从栈底到栈顶依次对S的每个数据元素调用函数visit()一旦visit()失败,则操作失败

相关主题
文本预览
相关文档 最新文档