已存在的界面比如Form1,在其Public中定义了一个变量Str1: String; 然后定义了一个动态界面:
dyForm: TForm; 然后dyForm := Form1; 那么问题是:通过动态界面dyForm怎么引用存在的界面Form1中的变量Str1?如果界面Form1上有个Edit1,可以引用,dyForm.FindComponent('Edit1') as TEdit,那变量怎么引用呢?谢谢!

解决方案 »

  1.   

    使用一个Unit定义全局变量,大家都能用该变量。
      

  2.   

    把 DyForm 也声明成 Form1 的类就行了.
    比如:
    var
      Form1: TForm1
    那么声明DyForm时就 DyForm: TForm1
    这时,直接 DyForm.str1 就能用了.如果一定要声明为 TForm ,那就这样:
    TForm1(DyForm).str1
      

  3.   

    to HSFZXJY、zhengyc653:
       谢谢回答,如果把DyForm申明为Form1类或TForm1(DyForm),那就没有必要动态,直接在Uses加入单元名就可以了。
      

  4.   

    怎么不知道窗体类,这句语句没有看到吗?
    dyForm := Form1  //可以是Form2、Form3...
    dyForm.FindComponent('Edit1') as TEdit  //取出Form1、Form2、Form3...类的成员Edit1
    当然,这里只是举一个例子,类成员不只这一个。
    现在其它不是问题,就是Form1、Form2、Form3...Public中的变量不能读写?
    现在把变量移动一个Unit当中去定义成全局变量是可以,但是我想问问高手有没有办法读写Form1、Form2、Form3...Public中的变量?
      

  5.   

    怎么不知道窗体类,这句语句没有看到吗?
    dyForm := Form1  //可以是Form2、Form3...
    dyForm.FindComponent('Edit1') as TEdit  //取出Form1、Form2、Form3...类的成员Edit1
    当然,这里只是举一个例子,类成员不只这一个。
    现在其它不是问题,就是Form1、Form2、Form3...Public中的变量不能读写?
    现在把变量移动一个Unit当中去定义成全局变量是可以,但是我想问问高手有没有办法读写Form1、Form2、Form3...Public中的变量?既然知道是什么类那就用上面的方法就行了啊。。public怎么读不到了?又不是只读属性。。
      

  6.   

    类的公共和公布的非静态成员都能通过类的实例访问,你咋个不能访问法?真是莫名其妙嘛----------你都不管我的问题,那个泛型的  重写Tlist.Clear 我很需要。现在我是求爹爹告奶奶的找资料啊
      

  7.   

    路过师傅我今天查了d2010中 TStringList.Clear 是这样的procedure TStringList.Clear;
    var
      I: Integer;
      Obj: TObject;
    begin
      if FCount <> 0 then
      begin
        Changing;    //Free all objects in the event that this list owns its objects
        if OwnsObjects then
        begin
          for I := 0 to FCount - 1 do
          begin
            Obj := GetObject(I);
            Obj.Free;
          end;
        end;    Finalize(FList^[0], FCount);
        FCount := 0;
        SetCapacity(0);
        Changed;
      end;
    end;
    跟你找的代码完全不同
      

  8.   

    if dyForm is TForm1 then
      ShowMessage((dyForm as TForm1).Str1)
      

  9.   

    首先谢谢你的好心帮人回答问题,但是帮忙回答问题也请正确理解提问者的意思,不理解意思请提出!
    你这样的方式,要在Uses加Form1的单元名了,我是不加的。
    前面讲了(dyForm.FindComponent('Edit1') as TEdit).Text := ''这个是可以的,不出现TForm1,
    但Public中的自定义变量Str1通过什么方式访问呢?(不能用出现TForm1)
      

  10.   

    楼主,我想问你一下,你不加 Form1 的单元名,如何dyForm := Form1 ??
      

  11.   

    举例说明吧,Form1、Form2、Form3...进入一界面NewForm,在界面NewForm中定义dyForm,在Form1、Form2、Form3...进入NewForm之前dyForm := Form1或Form2或Form3...
      

  12.   

    举例说明吧,Form1、Form2、Form3...进入一界面NewForm,在界面NewForm中定义dyForm,在Form1、Form2、Form3...进入NewForm之前dyForm := Form1或Form2或Form3...说了半天。。你用晚绑定是吧?你可以让TForm1, TForm2, TForm3继承自一个抽象基类:TCustomVarForm, 此类中有个成员叫Str1,这样就能(Form1 as TCustomVarForm).Str1.否则你就要读取RTTI,非常麻烦。。
      

  13.   

    举例说明吧,Form1、Form2、Form3...进入一界面NewForm,在界面NewForm中定义dyForm,在Form1、Form2、Form3...进入NewForm之前dyForm := Form1或Form2或Form3...说了半天。。你用晚绑定是吧?你可以让TForm1, TForm2, TForm3继承自一个抽象基类:TCustomVarForm, 此类中有个成员叫Str1,这样就能(Form1 as TCustomVarForm).Str1.否则你就要读取RTTI,非常麻烦。。果真这样麻烦的话,那只能用一个Unit定义全变量了,就同一楼lyhoo163的方法。
      

  14.   

    都求灵活、滞后加载,那么就干脆使用我的 解释型delphi模型http://211.162.123.246:443/httpdisk/haitaosoft/?app=delphiscript 好了编译型的delphi,本身支持findcomponent和method、property
    普通field好像不支持
    如果一定不想使用全局变量
    可以在form里都放一个varlist:Tstringlist,把field编码为 key=value 的字符串加入。
      

  15.   

    首先谢谢你的好心帮人回答问题,但是帮忙回答问题也请正确理解提问者的意思,不理解意思请提出!
    你这样的方式,要在Uses加Form1的单元名了,我是不加的。
    前面讲了(dyForm.FindComponent('Edit1') as TEdit).Text := ''这个是可以的,不出现TForm1,
    但Public中的自定义变量Str1通过什么方式访问呢?(不能用出现TForm1)
    不uses的话,有个办法,就是直接内嵌basm。//代码片段A
    if dyForm is TForm1 then
      ShowMessage((dyForm as TForm1).Str1) 对应的basm如下:
      asm
        mov eax,[dyForm]
        mov edx,[$0004527dc]
        call System.@IsClass
        test al,al
        jz @@1
        mov eax,[dyForm]
        mov edx,[$0004527dc]
        call System.@AsClass
        mov eax,[eax+$000002fc]
        call ShowMessage
        @@1:
        //ret
      end;其中$0004527dc是TForm1的地址,$000002fc是str1的偏移地址。你需要在代码片段A下断点,查看CPU窗口,找到上面两个地址的具体数值。然后就可以不用引用Form1单元,把代码片段A用basm代替,替换那两个具体数值即可。