C++ Buidler 6中需要注意的几个问题

 一、引言

  C++ Buidler和Dephi同为RAD的典范,它使得快速、高效、方便地开发程序成为可能。但是在使用C++ Buidler的过程中发现,不是仅仅熟悉C++ Buidler的VCL组件就能顺利地完成程序的编写,还需要注意一些容易忽视的细节。本文列举了一些遇到的问题,并提供解决办法,以供参考借鉴。

  二、具体问题及解决办法

  1.使用SQL语句操作数据库时,如果语句中出现了变量,同一变量不能进行重复使用

  如:需访问数据表T1和T2中符合条件T1.T1_F1="01"及T2.T2_F1="01"的纪录,按照常规思维,只需在SQL语句中设置一个变量p,分别用来判断T1.T1_F1和T2.T2_F1的值是否为"01",BCB语句如下: if(ADOQuery1->Active)

  { ADOQuery1->Close();

  ADOQuery1->SQL->Clear(); }

  ADOQuery1->SQL->Text="SELECT * FROM T1, T2 WHERE T1.T1_F1=:p AND T2.T2_F1=:p";

  ADOQuery1->Parameters->ParamValues["p"]="01";

  ADOQuery1->Open();    

  但是在运行这段代码后,查询的结果为空。(在访问Access2003过程中得到证实)通过追踪SQL语句中的变量p,发现第二次调用p时,BCB没有对p赋值,即p为NULL;所以得不到期待的查询结果。正确的参数设置应该为: ADOQuery1->SQL->Text="SELECT * FROM T1, T2 WHERE T1.T1_F1=:p1 AND T2.T2_F1=:p2";

  ADOQuery1->Parameters->ParamValues["p1"]="01";

  ADOQuery1->Parameters->ParamValues["p2"]="01";  

  从上面可以看出,BCB对SQL语句中出现的每个赋值变量只使用一次。即使需要在SQL语句中对出现两次的变量赋予相同的值,也要申请两个变量,分别赋值。

  2. goto语句的使用

  在C++ Builder的goto语句中,如果保留字goto与目标标识之间有本地变量的初始化语句: goto EndMark;// EndMark为目标标识

  int a=1;

  ……

  EndMark:;   

  则运行goto语句时会报错,这给goto语句的使用带来不便,但如果在goto与目标标识之间加上一对花括弧,则可顺利运行: goto EndMark;

  {  int a=1;

  ……  }

  EndMark:; 

  C++ Builder将{……}内的变量初始化理解为局部变量的初始化,局部变量的初始化不会对{ }外面的语句有影响。所以适当地使用花括弧,就可以消除C++ Builder对goto语句使用的限制。

  3. 动态创建窗口带来的影响

  动态创建窗口的好处是在不需要该窗口时可以用delete命令释放内存。但是由于窗口是在内存中完成创建和释放,也存在一些问题。如:在新建的Application中建立Form1、Form2和Form3,Form1上设有Button1和Edit1、Memo1,Form2上设有Button21、Button22和Edit2、Memo2,Form3上设有Button3和Edit3、Memo3.Form1->Button1的Click事件中动态创建窗口Form2,并设置Form2->Button21的Click事件显示窗口Form3,且Form1、Form2、Form3分别各有一个Edit1和Memo1,现在试图通过点击Form3上的Button3按钮分别将Edit3和Memo3中的文字赋给Form2的Edit2和Memo2构件,再通过点击Form2上的Button22按钮把Edit2和Memo2中的文字赋给Form1.

  Form1中的函数: void __fastcall TForm1::Button1Click(TObject *Sender)

  {  TForm2 * Form2_N=new TForm2(Form1);

     Form2_N ->ShowModal();

     delete Form2_N;  } 

  Form2_N中的函数 void __fastcall TForm2_N::Button21Click(TObject *Sender)

  {  Form3->ShowModal();

  }

  void __fastcall TForm2_N::Button22Click(TObject *Sender)

  {  Form1->Edit1->Text=Form2->Edit2->Text;

     Form1->Memo1->Text=Form2->Memo2->Text;

     this->Close();  }

  Form3中的函数: void __fastcall TForm3::Button3Click(TObject *Sender)

  {  Form2->Edit2->Text=Form3->Edit3->Text;

     Form2->Memo2->Text=Form3->Memo3->Text;

     this->Close();  }  

  测试中发现,Form3上Edit3和Memo3中的文字不能赋值到Form2_N的Edit2和Memo2中,但Form2_N上Edit2和Memo2中的文字可以赋到Form1上的Edit1和Memo1中。

  如果修改Form1中Button1的Click事件的执行语句,将创建Form2_N改为创建Form2,并将在其它地方出现的Form2_N改为Form2: void __fastcall TForm1::Button1Click(TObject *Sender)

  {  Form2=new TForm2(Form1);

     Form2->ShowModal();

     delete Form2;  }  

  这样,Form3上Edit3和Memo3中的文字就能赋给Form2的Edit2和Memo2了。

  创建属于TForm2类的窗口Form2_N和Form2时,不同点在于,在创建Form2_N时(点击Button1时),需要向系统申请内存创建。Form2_N的创建过程 “TForm2 * Form2_N=new TForm2(Form1);”中包含了定义新的窗体类Form2_N和对其进行初始化两个动作, Form2_N在定义过程中申请了内存空间;而Form2是在Design-Time定义的窗体,在程序初始化时就完成了申请内存空间的动作。两种窗体申请内存的时间先后影响了它们对所传递数值的接受。

  三、结语

  C++ Builder中有些隐含的使用限制还不太直观,像动态窗口的创建会给窗口之间的变量赋值带来不便,而在Delphi中创建动态窗口(Form1:=TForm1.Create(self);)就不存在这样的问题。因此如果遇到在C++ Builder中的不能用一般方法解决的一些问题时,还需要进一步熟悉C++ Builder,细致分析,多进行尝试摸索解决,积累了一些经验,就可以提高编码效率。

时间: 2024-09-05 06:02:39

C++ Buidler 6中需要注意的几个问题的相关文章

电脑中通过修改注册表解决网页无法添加到收藏夹的方法

  电脑中通过修改注册表解决网页无法添加到收藏夹的方法.最近有不少用户反映在电脑中出现了无法添加网页到收藏夹的问题,尝试了各种方法都无法解决这个问题.对此,在接下来的内容中,小编为大家提供了一种通过修改注册表解决网页无法添加到收藏夹的方法,大家可以参考一下. 1.按Win+R打开运行,输入regedit并按回车键; 2.在注册表编辑器依次展开HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Explorer/UserShell

IE8中显示“收藏夹栏”为灰色无法点击开启

  浏览器的收藏夹是我们平时用到的最多功能之一,为了更方便的打开收藏夹中的网页,在IE8浏览器下,我们可以在工具栏的空白处单击右键,然后选择"收藏夹栏"即可在工具栏上显示收藏网页.但是在IE8中可能会遇到"收藏夹栏"无法点击勾选的情况,故障如下: 解决方案: 若此问题出现在Win7系统中可通过修改组策略来解决问题. 提示:更改注册表设置有一定危险,可能会造成系统瘫痪,建议在进行操作之前,先对注册表进行备份 按下 Windows + R 键打开"运行&quo

固定表头-在ASP.NET页面中,固定DATAGRID表头出现的问题

问题描述 在ASP.NET页面中,固定DATAGRID表头出现的问题 使用DIV标签加js纯页面固定表头,实际上就是将表头获取出来填充到一个DIV中,问题就是如何将表头和表中的内容对齐,特别是在表中数据动态改变列宽不固定的时候

html-c# 提取微信文章中的图片是WEBP格式,如何转成JPG格式以便能够正常显示?

问题描述 c# 提取微信文章中的图片是WEBP格式,如何转成JPG格式以便能够正常显示? 根据微信文章地址,提取到了微信文章的HTML源文件,但图片是WEBP格式,并防盗链. 请问,如何通过C#方法,把WEBP转成JPG格式用于保存在本地以便可以正常浏览? 提取到的微信图片的地址如下: http://mmbiz.qpic.cn/mmbiz/Ek7ZheM28KXya0WfIFv58aNZEBb3YSWX9iaMJHLhuz7o5xNia68MItJfDya947ibSX1HVNpy9V3iaJr

在jsp中怎么给文字加背景图片啊

问题描述 在jsp中怎么给文字加背景图片啊 动态生成的菜单 代码如下 function startParentNode(text){ //alert(text); if(""站址管理"" == text){ document.write('<table border=""0"" cellpadding=""1"" cellspacing=""0"&qu

Spring.Net在Mvc4.0中应用的说明

案例Demo:http://yunpan.cn/cJ5aZrm7Uybi3 访问密码 414b Spring.Net在Mvc4.0中应用的说明 1.引用dll       2.修改Global文件 (SpringMvcApplication)       3.控制器添加属性     4.WebConfig配置   <!--必须紧跟着configuration之后-->   <configSections>     <sectionGroup name="spring

div布局-请问怎么让div中的div在垂直方向上居中呢?

问题描述 请问怎么让div中的div在垂直方向上居中呢? 比如:下面这段代码,如何让里面的div在垂直方向上面居中呢(不好意思,实在是没有悬赏币了) .out{ width:500px; height:500px; background:blue;}.inn{ width:200px; height:200px; background:red;} 解决方案 你的inn怎么比out还大..搞反了吧..通过margin来定位.absolute定位最好,不需要考虑父容器,只需要依据自身的宽和高度来调整

MathType在Word中无法打开怎么办

  解决办法如下: 1.桌面右键选择"分辨率". 桌面右键中选择"屏幕分辨率" 2.把显示器显示设置从"扩展显示",改为只通过"显示器1"或者"显示器2"来显示,显示器1或2为你自己实际应用的显示器. 显示器显示设置从"扩展显示",改为只通过"显示器1"或者"显示器2"来显示 问题的原因在于,扩展时系统把部分应用程序显示到另一个不存在的"

MathType工具栏中怎么添加符号

  MathType工具栏中怎么添加符号 1.打开MathType公式编辑器,进入到编辑界面.打开方式随意,按照自己的使用习惯就可以. 打开软件进入编辑状态 2.利用MathType公式编辑器编辑出自己所需要的符号,比如这里是欧米茄符号.编辑方法按照自己的使用习惯或者是利用常规的编辑符号的方法进行编辑. 在MathType中编辑出所需要的符号 3.点击MathType工具栏中的标签栏,看你想要把符号放在哪一类的标签下就点击哪一个标签.比如这里放到代数标签栏中. 点击选择MathType标签栏 4