我定义了一个全局变量:  
unit  T_Login;  
........  
   public  
       User_ServerData:String;  
       User_ServerName:String;  
       User_UserName:string;  
       User_UserPass:string;  
 
........  
 
然后在单元内赋值,  
User_ServerData:='1'  
 
 
在别的窗体进行调用  
uses  T_Login;  
..........  
edit1.text:= T_Login.User_ServerData;    <-问题在这里,User_ServerData为'',而不是'1'  
请问大侠们这是为什么?谢谢。  

解决方案 »

  1.   

    最好单独NEW一个PAS单元定义全局变量,在要使用的单元里引用这个单元
      

  2.   

    edit1.text:=T_login.T_loginFrm.User_serverData;
      

  3.   

    是这样的
    例如定义一个公共变量,在一个单元
       public  
           User_ServerData:String;  然后
    procedure TTM_Login.Button2Click(Sender: TObject);
    begin
       User_ServerData:='hello';
    end;然后在另一个窗体中
    edit1.text:=T_Login.User_ServerData;
    T_Login.User_ServerData中不是'hello'而是''。请教大侠们这是为什么?
      

  4.   

    先单击了啊但是变量还是T_Login.User_ServerData=''
      

  5.   

    T_Login.User_ServerData  其实User_ServerData就可以啊,为什么前面要加T_Login呢,没必要。
      

  6.   

    完整代码是这样的
    在一个单元中
      public
        User_ServerData:String;定义一个过程(取INIFile)
    procedure TTM_Login.Read_INIFiles;
    var
       inifile:Tinifile;
    begin
       inifile:=tinifile.Create(ExtractFilePath(Application.ExeName)+'\database.ini');
       if fileexists(ExtractFilePath(Application.ExeName)+'\database.ini') then
       begin
          User_ServerData:=inifile.ReadString('DBconfig','DataBaseName',User_ServerData);
          User_ServerName:=inifile.ReadString('DBconfig','ServerName',User_ServerName);
          User_UserName:=inifile.ReadString('DBconfig','UserName',User_UserName);
          User_UserPass:=inifile.ReadString('DBconfig','UserPass',User_UserPass);
       end
       else
       begin
           showmessage('请确认系统已正确初始化。');
       end;
    end;然后在一个按钮事件触发procedure TTM_Login.Button1Click(Sender: TObject);
    var
       Tempstr:string;
    begin
       Read_INIFiles;
       TM_Form.show;
    end;
    然后在TM_Form窗体中
    procedure TTM_Form.FormCreate(Sender: TObject);begin
           StatusBar1.Panels.Items[3].Text:=TM_Login.User_UserName; <-错误在这里,User_UserName为'',而在TM_Login中它却有值。
    end;
      

  7.   

    ExtractFilePath(Application.ExeName)+'\database.ini'改成
    IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)))+'database.ini'
      

  8.   

    TM_Form.show;   在此之前TM_Form早就已经FormCreate了,当然结果不对了
    看来你对delphi刚开始学,严格的按照我说的做:
    1.单击options...菜单,除主窗体外,其他的窗体都放到右边框内,Auto-create forms里只留下主窗体(如果有数据摸快的也可以留下,如果窗体太多,修改起来困难则新键个工程试)
      

  9.   

    2.程序代码该为:
    procedure TTM_Login.Read_INIFiles;
    var
       inifile:Tinifile;
       strName:string;
    begin
       strname:=IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)))+'database.ini';
       if not fileexists(strname) then
       begin
         showmessage('文件不存在!');
         exit;
       end;
       inifile:=tinifile.Create(strname);
       User_ServerData:=inifile.ReadString('DBconfig','DataBaseName',User_ServerData);
       User_ServerName:=inifile.ReadString('DBconfig','ServerName',User_ServerName);
       User_UserName:=inifile.ReadString('DBconfig','UserName',User_UserName);
       User_UserPass:=inifile.ReadString('DBconfig','UserPass',User_UserPass);
      inifile.free;
    end;procedure TTM_Login.Button1Click(Sender: TObject);
    var
       Tempstr:string;
    begin
       Read_INIFiles;
       TM_Form:=TTM_Form.create(self);
       try
         TM_Form.ShowModal;
       finally
         TM_Form.free;
       end;
    end;
      

  10.   

    在TM_Form.show之前TM_Form早就已经Create了,当然结果不对了
    StatusBar1.Panels.Items[3].Text:=TM_Login.User_UserName改在Show事件中才OK的,就是Create TM_Form->ReadIni->Show
    wks(mex)的解决方法也挺好的
      

  11.   

    变量赋值放在
     initialization
    当中不行吗?
      

  12.   

    应该在T_Login类的create事件中设为1
      

  13.   

    你调用的顺序不对,这样写就可以了,因为你在负值之前调用的原因,试试看:
    procedure TTM_Login.Button1Click(Sender: TObject);
    var
       Tempstr:string;
    begin
       Read_INIFiles;
       StatusBar1.Panels.Items[3].Text:=TM_Login.User_UserName;
       TM_Form.show;
    end;或者你搞一个Ontime事件,即使刷新你的状态条StatusBar1
      

  14.   

    老兄啊,你的窗体创建的时候就读了全局变量了,
    你再改变变量,现在TM.StatusBar1.Panels.Items[3].Text是不会变的了。
    你可以考虑在你的TTM_Login.Button1Click事件中看窗体TM是否创建,
    如果创建就再给TM.StatusBar1.Panels.Items[3].Text赋一次值。
      

  15.   

    你应该考虑在procedure TTM_Login.Button1Click中对另一个窗体是否创建进行判断,如果已经创建,应该对TM.StatusBar1.Panels.Items[3].Text再赋一次值。