已存在的界面比如Form1,在其Public中定义了一个变量Str1: String; 然后定义了一个动态界面:
dyForm: TForm; 然后dyForm := Form1; 那么问题是:通过动态界面dyForm怎么引用存在的界面Form1中的变量Str1?如果界面Form1上有个Edit1,可以引用,dyForm.FindComponent('Edit1') as TEdit,那变量怎么引用呢?谢谢!
dyForm: TForm; 然后dyForm := Form1; 那么问题是:通过动态界面dyForm怎么引用存在的界面Form1中的变量Str1?如果界面Form1上有个Edit1,可以引用,dyForm.FindComponent('Edit1') as TEdit,那变量怎么引用呢?谢谢!
比如:
var
Form1: TForm1
那么声明DyForm时就 DyForm: TForm1
这时,直接 DyForm.str1 就能用了.如果一定要声明为 TForm ,那就这样:
TForm1(DyForm).str1
谢谢回答,如果把DyForm申明为Form1类或TForm1(DyForm),那就没有必要动态,直接在Uses加入单元名就可以了。
dyForm := Form1 //可以是Form2、Form3...
dyForm.FindComponent('Edit1') as TEdit //取出Form1、Form2、Form3...类的成员Edit1
当然,这里只是举一个例子,类成员不只这一个。
现在其它不是问题,就是Form1、Form2、Form3...Public中的变量不能读写?
现在把变量移动一个Unit当中去定义成全局变量是可以,但是我想问问高手有没有办法读写Form1、Form2、Form3...Public中的变量?
dyForm := Form1 //可以是Form2、Form3...
dyForm.FindComponent('Edit1') as TEdit //取出Form1、Form2、Form3...类的成员Edit1
当然,这里只是举一个例子,类成员不只这一个。
现在其它不是问题,就是Form1、Form2、Form3...Public中的变量不能读写?
现在把变量移动一个Unit当中去定义成全局变量是可以,但是我想问问高手有没有办法读写Form1、Form2、Form3...Public中的变量?既然知道是什么类那就用上面的方法就行了啊。。public怎么读不到了?又不是只读属性。。
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;
跟你找的代码完全不同
ShowMessage((dyForm as TForm1).Str1)
你这样的方式,要在Uses加Form1的单元名了,我是不加的。
前面讲了(dyForm.FindComponent('Edit1') as TEdit).Text := ''这个是可以的,不出现TForm1,
但Public中的自定义变量Str1通过什么方式访问呢?(不能用出现TForm1)
普通field好像不支持
如果一定不想使用全局变量
可以在form里都放一个varlist:Tstringlist,把field编码为 key=value 的字符串加入。
你这样的方式,要在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代替,替换那两个具体数值即可。