procedure AutoSave(vForm:TForm;DType:char); var i,Len:integer; rForm: Tform; begin rForm := TForm.Create(Self); rFrom := vForm; for i:=0 to rForm.ComponentCount - 1 do begin .... end;
可能是你调用出错 procedure TForm1.SomeThing; begin AutoSave(Self, 'A'); //不是AutoSave(Form1, 'A'); end;procedure AutoSave(vForm:TForm;DType:char); var i, Len: integer; begin if Assigned(vForm) then //看是否实例化了 begin for i:=0 to vForm.ComponentCount - 1 do begin .... end; end; end;
var i,Len:integer;
rForm: Tform;
begin
rForm := TForm.Create(Self);
rFrom := vForm;
for i:=0 to rForm.ComponentCount - 1 do
begin
....
end;
Snakeguo(枫) 你这样只会得到一个刚初始化完的窗体
eg:function MyFunc(MyForm : TForm) : boolean;
begin
if MyForm.EditName.text = '我的天' then
MyForm.EditName.text := '你的天' ;
end;
没有别的。
但是不知道我的意思是不是你的意思。
for i:=0 to vForm.ComponentCount - 1 do
就是访问不到这个窗体,还怎么取这些控件呢
你的FORM已经CREATE了吗?
有若干种办法可以解决,第一,你在已知窗体类类型的时候可以用强制转换或as操作转换成你需要的窗体类型即可操作,第二、万全的方法是你将窗体的类型传入,即传入一个窗体类的引用,注意这是类的类型的引用,不是实例的引用,要声明为:TFormClass类型,或者传入类的类型的字符串,然后用FindClass来获得,但必须在initialization中RegistrClass;
procedure TForm1.SomeThing;
begin
AutoSave(Self, 'A');
//不是AutoSave(Form1, 'A');
end;procedure AutoSave(vForm:TForm;DType:char);
var
i, Len: integer;
begin
if Assigned(vForm) then //看是否实例化了
begin
for i:=0 to vForm.ComponentCount - 1 do
begin
....
end;
end;
end;
Self, Sender, Parent以前有很多贴子讨论,但是这些答案大家说的都比较模糊,我也说不太清,而你所说的Self不就是Form1,在很多情况是,前提是在Application.CreateForm(TForm1, Form1)创建了Form1的实例,也就是说Form1是给赋值了的,而你可能Form1不是主窗体,它是后面才用到,并没有Form1 := TForm1.Create(..),或Application.CreateForm(..)之类的,也就是说var Form1: TForm1;它只是起一个定义对象变量作用,而不是创建赋值作用,虽然它是一个单元的全局变量,所以一般情况你要注意使用一个全局变量时是否Create, Destroy,在程序中尽量用Self,而不要用已经定义的变量Form1/form2之类的。
还有注意:当Free一个对象时,最好再nil一下,不然Assigned(Object)仍然会返回为真,虽然它已经被Free;
Object.Free;
Object := nil;