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

  次阅读 作者:智能小宝 来源:互联网 2016-01-19 12:49 我要评论(0)

一、引言

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)

本站文章信息来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • 未来两年人工智能要怎么走?看这篇就够了

    未来两年人工智能要怎么走?看这篇就够了

  • 无人驾驶汽车如何改变城市生活?听听他们怎么说

    无人驾驶汽车如何改变城市生活?听听他们怎么说

  • 韩春雨称已能重复实验结果 近期将有消息公布

    韩春雨称已能重复实验结果 近期将有消息公布

  • 英国研发“杀生”机器人 通过生命体获取能量

    英国研发“杀生”机器人 通过生命体获取能量

网友点评网友点评
阅读推荐阅读推荐

据国外媒体报道,在过去两年内,聊天机器人(chatbot)、人工智能以及机器学习的研发和采用取得了巨大进展。许多初创公司正利用人工智能和...

霍金 视觉中国 图 英国著名物理学家霍金(Stephen Hawking)再次就人工智能(AI)发声,他认为:对于人类来说,强大AI的出现可能是最美妙的...

文|郑娟娟 今年,人工智能(AI) 60岁了。在AI60岁的时候,笔者想要介绍一下AI100,一个刚刚2岁的研究项目,但它的预设寿命是100年,甚至更长...

AlphaGo与李世石的人机大战,为大众迅速普及了人工智能的概念。 但对谷歌而言,除了下围棋,现在的人工智能进展到哪一步了?未来,人工智能...