偶在主单元main.pas里定义了
  private
  str:string;
    { Private declarations }
  public
  function getstr:string;
    { Public declarations }
  end;
在一个procedure里写了:str:='Demo';
在另一个单元other.pas 
uses main;然后在一个procedure里写了下面语句:
ShowMessage(main.MainForm.getstr);开始还是可以的,在other.pas单元可以出现一个显示为'Demo'的对话框……可是不知道怎么回事,第N次运行时发现在other.pas单元showMessage意外的得出的是个空字符!!这是怎么回事阿?? 开始还是可以SHowMessage出主单元main.pas定义的私有变量str的,怎么又不行了那??大虾救偶阿!!!偶以为是str可能在某个地方被更改了,所以偶又在main单元定义个私有变量str1:string
定义了个公共function getstr1;在other.pas写上showMessage(main.mainform.getstr1),得出的还是空字符……怎么回事阿??????帮帮偶阿!!偶快疯了是不是Delphi的编译器的问题阿??偶都重启几次了还是那样阿

解决方案 »

  1.   

    以上声明都是在interface接口声明的
      

  2.   

    偶的意思是:
    //----------------------------
    main.pas:
    Type
    TMainForm=class(Form)
    ...
    ...
    ...
    private:
     str:string;
    Public:
     function getStr:string;
    implementation
    ....
    function TMainForm.getStr:string;
    begin
    result:= str;
    end;
    procedure TMainForm.FormCreate(Sender: TObject);
    begin
     str:='demo';
    end;//---------------------------
    other.pas:
    Type
    Totherform=class(form)
    ...
    ...
    implementation
    uses main;procedure TMainForm.Button1Click(Sender: TObject);
    begin
     showMessage(main.mainform.getstr);
    end;这应该是没错误的,因为偶重新建立了一个工程,把上面的语句试了没问题……
    可是在偶原来的那个程序中问题还是存在阿!这是怎么回事阿 ?????????偶快疯了!!!
      

  3.   

    procedure TMainForm.Button1Click(Sender: TObject);
    begin
     showMessage(main.mainform.getstr);
    end;运行的时候MainForm是不是还在呀?是不是你已经Free了?
      

  4.   

    同志们,错误找到了!竟然是这么一个弱智的错误:
    偶在工程文件中:
    program Project;uses
      Forms,
      main in 'main.pas' {MainForm},
      newsubwin in 'newsubwin.pas' {NewForm},
      addindex in 'addindex.pas' {addindexForm};{$R *.res}begin
      Application.Initialize;
      Application.CreateForm(TMainForm, MainForm);
      Application.CreateForm(TMainForm, MainForm);  //错误在这里,重复创建了两个MainForm应用
      Application.CreateForm(TNewForm, NewForm);
      Application.CreateForm(TaddindexForm, addindexForm);
      Application.Run;
    end.天哪~~~偶郁闷阿
    可是这样
      Application.CreateForm(TMainForm, MainForm);
      Application.CreateForm(TMainForm, MainForm);  
    两次为什么会导致其他单元引用不了该单元的私有字符变量阿?得到的总是空字符?WHY???大虾教偶~~!!!
      

  5.   

    是不是它(Delphi编译器)发现有两个MainForm应用不知道调用哪个应用的那个私有字符变量好,所以得到一个空字符阿??
      

  6.   

    为何会重复创建两个MainForm?不是你手工添加的吧?还是使用project optino下的操作去处理最好!
      

  7.   

    哎  就是不小心手动多复制了一个Application.CreateForm(TMainForm, MainForm);  以后一定要记住这个教训……
      

  8.   

    再问个问题就结贴了:偶在unit1的Interface的Uses单元加入了 unit2
    而unit2的Interface的Uses单元加入了unit3书上说这样就可以在unit1中直接调用unit3的东西了而不用再加入uses unit3了,因为unit2在interface的USes单元声明了unit3了可是偶做了 发现不对,编译的时候编译器提示在unit1单元发现了form3,问是否在implementation下加入uses Unit3的声明……这是怎么回事嗄?
    大侠请解答~
      

  9.   


      在implementation下声明:
       uses main;
      就bye-bye了吧!!!
      

  10.   

    在USES里多加个UNIT3不就得了嘛?
      

  11.   

    偶在unit1的Interface的Uses单元加入了 unit2
    而unit2的Interface的Uses单元加入了unit3书上说这样就可以在unit1中直接调用unit3的东西了而不用再加入uses unit3了,因为unit2在interface的USes单元声明了unit3了上面说的是对的吗????偶看到很多书上都是这样说嗄~~~~请高手回答!!
      

  12.   

    偶在unit1的Interface的Uses单元加入了 unit2
    而unit2的Interface的Uses单元加入了unit3书上说这样就可以在unit1中直接调用unit3的东西了而不用再加入uses unit3了,因为unit2在interface的USes单元声明了unit3了上面说的是对的吗????偶看到很多书上都是这样说嗄~~~~请高手回答!!明确的高苏你,不行!至于这样申明的危害主要是:可能导致循环引用
                              可能导致重复引用
                              可能造成接口的混乱,代码难以维护
                              还可能造成单元的紧耦合,难以调试!
      

  13.   

    楼上的意思很明白:书上说的是对的,可以在Interface的Uses声明引用,只是不提倡这样引用而已是吧?那偶按照书上说的做了为什么会有问题呢?
      

  14.   

    书上是错的,那个是c
    在delphi,要用unit3的方法或者属性,必须引用unit3:
    uses unit3;
      

  15.   

    就是说必须在interface 同时uses unit2,unint3才能引用unit3不管unit2在它的interface包含了unit3的引用是吧?
      

  16.   

    Foot(guorui_wh)大哥进来接分!
    感谢foot大哥在QQ上热心的帮助偶!