大家来看在函数体内用Assigned测试形参ASubForm: TSubForm,为什么总是False???
我想向函数传递一个form,如果该form已经构造,那么直接显示,否则create后再显示
但是Assigned(ASubForm)总是为Falseprocedure TMainForm.LoadSubForm(ASubForm: TSubForm;
  ASubFormClass: TSubFormClass; AAction: TAction);
begin
  if (not Assigned(ASubForm)) then  //这一句
    ASubForm := ASubFormClass.Create(Application);  with ASubForm do
  begin
    Title := AAction.Caption;
    Parent := pnlClient;
    OnDestroy := SubFormDestroy;
    Show;
  end;
end;

解决方案 »

  1.   

    如果你调用的时候,使用本地变量传进asubform,则这个值是随机的的一个地址。assigned只是检测指针是否为 nil,所以就认为是assigned。但是如果操作这个值,则会出现AV内存错误。要解决的办法是,使用本地变量前一定要初始化。如asubform:=nil
    或者使用全局/静态变量,就是写在过程体外的,interface或implementation的。这种变量delphi会自动初始化。
      

  2.   

    to keyz(keyz)老师
    我目前传给ASubForm的是全局变量
    但是第一次调用Assigned(ASubForm)时结果为False
    但ASubForm := ASubFormClass.Create(Application);后
    第二次调用Assigned(ASubForm)时仍然为False
      

  3.   

    你传形参是不能赋值出来的,改一下第一个参数前加 varprocedure TMainForm.LoadSubForm(var ASubForm: TSubForm;
    ASubFormClass: TSubFormClass; AAction: TAction);
      

  4.   

    OnDestroy := SubFormDestroy;
    在的释放事件中加入:
    ASubForm:=NIL;
      

  5.   

    to keyz(keyz) :
      对象参数是不允许加var的
      

  6.   

    “对象参数是不允许加var的”谁说的?
      

  7.   

    对象的本质是一个地址(指针)。 当你用形参传进去的时候,是把地址传给了函数体内的参数,这样的话,你修改了地址所指向的值,就是修改了实际对象的成员值。而Create方法,是重新分配了一个地址,就是说这个指针都改变了。如果用形参,就不能把这个新地址返回回去。简单的说,如果你在函数体内直接给对象赋值(如ASubForm:=T..Create, 或者 ASubForm:=BSubForm),而不是仅仅是修改成员(如 ASubForm.Member:=...),这样需要用var把参数传递出来。