求救全局變量問題

controstr 2006-04-25 05:35:27
遇到一個奇怪的問題,在一個DLL中我定義了一個公共Form(Child類型)用於其它窗體都繼承它,我想在窗體中定義一個全局變量AnsiString ConstStr,不論我在主Form還是在各自的窗體中定義,我是在Show事件中給ConstStr賦值,可在運行時只要退出Show事件整個ConstStr變量的值變為NULL,
還有一個問題就是這樣創建的子窗體為什麼會選運生Show事件再運行構造函數啊??
請高手指點我應該怎麼做才能使該全局變量有值和為什麼構造函數運行在Show事件後面
...全文
245 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianshu888 2006-04-27
  • 打赏
  • 举报
回复
你想定义成全局变量也可以,自是没有定义好,方得位置不对。

最好
static AnsiString ConstStr;定义成静态得就行了, 任何时候都可以使用。
stevenjscn 2006-04-26
  • 打赏
  • 举报
回复
你是想这个变量不变,那就要用静态变量
controstr 2006-04-26
  • 打赏
  • 举报
回复
可能大家還對我說的不太懂,我定義這個變量以後是可以用它,但是上面說的出現的幾個這樣的問題,還有今天我發存在這樣一個問題 ,在主Form中定義的全局變量其它窗體只要一個窗體改變它的值所有窗體中的值都改變了,這又是怎麼一回事啊?
过客猫2022 2006-04-25
  • 打赏
  • 举报
回复
你看看静态变量
stevenjscn 2006-04-25
  • 打赏
  • 举报
回复
参考的CCRUN网站的资料
文档标题:如何在C++Builder中使用全局变量  作者: yifei(逸飞)

关 键 字:C++Builder,全局变量

本文转自 C++Builder 研究 - http://www.ccrun.com/article/go.asp?i=626&d=wph422
本文详细解释了如何在C++Builder中使用全局变量。

作者:yifei(尹加俊)
信箱:yifei1900@163.com

  如何在C++Builder中使用全局变量?
  (1).如果我在一个公用的头文件中定义一个变量,在其它单元中可以直接使用它吗?如下:
  //--------------------------------Globals.h----------------------------------
  #ifndef GlobalsH
  #define GlobalsH
  //---------------------------------------------------------------------------
  #include <Classes.hpp>
  //---------------------------------------------------------------------------
  AnsiString UserName;
  //---------------------------------------------------------------------------
  #endif
  答案是:或许可以吧。你得到的结果是:只要你引用了这个头文件N次,那么就会得到N+1次编译器警告,选择你这个变量重复定义,在你引用这个变量的单元中,确实可以使用这个变量,但是在一个单元中对它赋值,在另一个单元中确得不么,也就是说,它根本就不是全局的,编译器的处理方法是,在每个单元中重新以这个名称声明了一个变量而已。

  (2).如果我在工程文件.cpp中声明一个变量,在其它单元中可以直接使用它吗?如下:
  //---------------------------------------------------------------------------
  #include <vcl.h>
  #pragma hdrstop
  //---------------------------------------------------------------------------
  USEFORM("TMainForm.cpp", MainForm);
  //---------------------------------------------------------------------------
  AnsiString UserName;
  //---------------------------------------------------------------------------
  WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
  {
   try
   {
   Application->Initialize();
   Application->CreateForm(__classid(TMainForm), &MainForm);
     Application->Run();
   }
   catch ... //这里省略了一部分
   return 0;
  }
  //---------------------------------------------------------------------------
  答案是:不可以。但是这确实是定义全局变量的正确方法之一。在工程文件.cpp中声明了变量,如果想在其它单元中使用它,必须使用extern关键字,来声明这个变量是外部的,所以,在需要使用这个全局变量的单元中,使用extern AnsiString FileName就可以引用一例中的全局变量了。

  (3).在VCL架构的程序中,我们经常用到一些全局变量,你有没有意识到呢?Application、Screen、IsConsole、IsLibray...等都是应用程序级的全局变量,如果想了解更多,请参照VCL手册的application-level information有关的章节。那么,这些全局变量是如何定义的呢?
  我们揭开VCL的迷雾,直接去查看VCL的代码(C++Builder中无法直接看到.pas的源代码,但是编译器为每个.pas文件生成了一个.hpp的头文件引用,看看其中的变量和函数声明即可):在程序空白处输入Application,按住Ctrl键,再点击它,我们就找到了Application变量的原始定义,如下:
  //-- var, const, procedure ---------------------------------------------------
  extern PACKAGE TApplication* Application; //请看这里
  extern PACKAGE TScreen* Screen;
  extern PACKAGE void *Ctl3DBtnWndProc;
  原来VCL扩展了extern关键字,在.h或.hpp头文件用extern PACKAGE来输出本来在.cpp和.pas单元中定义的变量,使之成为全局变量,因此,我们得到了第三种声明全局变量的方法:使用extern PACKAGE关键字,如下,输出一个全局变量:
  //-----------------------------Globals.cpp-----------------------------------
  #pragma hdrstop


  #include "Globals.h"
  //---------------------------------------------------------------------------
  #pragma package(smart_init)
  //---------------------------------------------------------------------------
  AnsiString UserName = "YinJiajun";
  //---------------------------------------------------------------------------


  //-----------------------------Globals.h-------------------------------------
  #ifndef GlobalsH
  #define GlobalsH
  //---------------------------------------------------------------------------
  #include <Classes.hpp>
  //---------------------------------------------------------------------------
  extern PACKAGE AnsiString UserName;
  //---------------------------------------------------------------------------
  #endif


  后记:大虾们都告诉我们,不要使用太多的全局变量,不要使用goto......于是,当你写程序时,总是有这样的声明在我们脑中回响:“不要使用太多的全局变量,不要使用goto......”。为什么不要使用这些东西?因为难以驾驭。如果你已剑气合一,是否还有这样的顾虑?
  刀可以用来切菜,也可以用来杀人,不能因为刀能杀人而禁止用刀。
  如果使用全局变量能让你的程序简洁明了、可读性好,为什么不用?
  为什么这些现代程序设计语言仍然要支持goto和全局变量?

controstr 2006-04-25
  • 打赏
  • 举报
回复
什麼意思?
zyyoung 2006-04-25
  • 打赏
  • 举报
回复
mark

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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