当前位置:天才代写 > tutorial > C语言/C++ 教程 > C++ Buidler 6中需要留意的几个问题

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

2017-11-03 08:00 星期五 所属: C语言/C++ 教程 浏览:832

副标题#e#

一、引言

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语句利用 的限制。


#p#副标题#e#

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 了。

#p#分页标题#e#

建设属于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,细致分 析,多举办实验探索办理,积聚了一些履历,就可以提高编码效率。

 

    关键字:

天才代写-代写联系方式