请教:如果在两个Form控件间传递数据且避免用全局变量??

rockhard 2002-12-18 06:13:20
我用BCB时一直很讨厌自己做一件事,就是为了在两个Form上的控件传递数据引入全局变量,这样做的结果是给代码的维护带来了很大的负担,因为等我一个月再修改源代码时,不得不浪费精力去琢磨我先前的那些全局变量的意义。真是烦不胜烦。如果有多个全局变量,那真是很惨的。

因此请教大家都是怎么样处理这个问题的?

///////////////////////////////////////////////////////////////////
下面举个例子说清楚我的问题,如有Form1(假设源文件为Form1.cpp及Form1.h) 和Form2(假设源文件为Form2.cpp及Form2.h)两个窗体,Form1上有一个TEdit控件Edit1,Form2上有一个TQuery控件Query1用来从数据库中查询数据。我的目的是为了将Query1查询出来的记录的某个字段(假设为name)读到Edit1中去,因此在Form1.cpp中写一个全局变量
AnsiString g_sName;

然后在Form2.cpp中申明该变量
extern AnsiString g_sName;//这个东西很烦的

然后代码(Form2.cpp中):
g_sName=Query1->FieldByName("Name")->AsString;

在Form1.cpp中
Edit1->Text=g_sName;

//////////////////////////////
有什么办法去掉那个全局变量g_sName??

...全文
38 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zbc 2002-12-18
  • 打赏
  • 举报
回复
这种情况,我一般都是重载TForm的构造函数来完成的。如果我要把窗体1中的某一个值传到窗体二中
那么,我的窗体二可能是如下的定义形式:
.h
__fastcall TForm1(AnsiString s);
.cpp

__fastcall TForm1::TForm1(AnsiString s)
: TForm(Owner)
{
}

这样,在要打开窗体时,即可以像使用函数一样的传入值到形参里面即可
rockhard 2002-12-18
  • 打赏
  • 举报
回复
分少僧多,100分平均分一下。没意见吧:)
rockhard 2002-12-18
  • 打赏
  • 举报
回复
谢谢大家,方法真是多,本来也想过“也可以把变量写成form2的属性.直接用form 2->sName;就可以访问了.”这个方法,后来觉得用form 2->sName不爽,就没这么做,后来才知道惨,其实比用全局变量要好得多。


另外用SendMessage发自定义消息。有谁能给个简单的例子?
先谢谢大家了。
invalid 2002-12-18
  • 打赏
  • 举报
回复
我去吃饭了,你慢慢找头坑占吧.
invalid 2002-12-18
  • 打赏
  • 举报
回复
五笔不符合思考习惯,当然慢了!占头坑,机会太小了!
copy_paste 2002-12-18
  • 打赏
  • 举报
回复
是啊,我打五笔,不过老是N个字不会打,老是要切换到拼音,所以有时就慢的要死,有时倒蛮快。
copy_paste 2002-12-18
  • 打赏
  • 举报
回复
一般VCL中作这种事,一般都是使用引用的方法,如将this传给别一个窗体,那窗体用dynamic_cast转成TForm1,或其它正式的类名,而不是父类名,然后再取得或调用具体的方法/属性,概念不知叫什么来的,很难说清。
invalid 2002-12-18
  • 打赏
  • 举报
回复
木头是用五笔吗,我用的是拼音加加,除了经常打错的毛病,速度倒是很快啊.
yuanque 2002-12-18
  • 打赏
  • 举报
回复
to copy_paste(木石三) ^-^
invalid 2002-12-18
  • 打赏
  • 举报
回复
方法真多啊!
copy_paste 2002-12-18
  • 打赏
  • 举报
回复
打了N分钟的字,头坑就给别人了,闷,以后先占头坑再说。
fscyber 2002-12-18
  • 打赏
  • 举报
回复
已经很简单啦,注释得详细些以后就容易维护啦
yyfzy 2002-12-18
  • 打赏
  • 举报
回复
对头!

不过要把该变量声明在窗体的头文件的public部分内。
copy_paste 2002-12-18
  • 打赏
  • 举报
回复
不用这样吧,你把Form2.cpp的TForm2 *Form2;这行删了,再写个函数:

String GetForm2Some(TForm *AOwner)
{
TForm2 *Form = new TForm2(AOwner);
String Result = "";
if (mrOK == Form->ShowModal())
Result = Form->Query1->...;
delete Form;
}

将这个GetForm2Some函数导到Form1中,你看,也把全局TForm2 *Form2也给省了,g_sName也省了。
NowCan 2002-12-18
  • 打赏
  • 举报
回复
用SendMessage发自定义消息。
invalid 2002-12-18
  • 打赏
  • 举报
回复
也可以把变量写成form2的属性.直接用form 2->sName;就可以访问了.
invalid 2002-12-18
  • 打赏
  • 举报
回复
可以给Form2写个方法,form1调用form的方法,返回值就是form1要的东西!

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧