FormClientEdit := TFormClientEdit.Create(Application);
  FormClientEdit.Parent := Panel1;
  FormClientEdit.Show;
这么做一切正常。而自定义了函数
procedure iFormCreate(Form: TForm; FormClass: TFormClass; ParentControl: TWinControl);
Begin
  Form := FormClass.Create(Application);
  Form.Parent := ParentControl;
  Form.Show;
end;
然后调用
  iFormCreate(FormClientEdit, TFormClientEdit, Panel1);
窗体创建成功,窗体内部的操作都正常。奇怪的问题表现在通过外部来访问窗体,则总不成功。
    FormClientEdit.Caption := 'aa';//通过,但其实不起作用
    ShowMessage(FormClientEdit.Caption);//为空
    FormClientEdit.BitBtnSave.Caption := 'aa';//读内存错误
迹象就跟 FormClientEdit 没有实例化一样。多次尝试修改自定义的函数,改来改去都没有成功,不知道是否 Delphi 存在什么奥妙规则我没认识的。麻烦各位指点迷津。

解决方案 »

  1.   

    procedure iFormCreate(Form: TForm; FormClass: TFormClass; ParentControl: TWinControl);
    Begin
      Form := FormClass.Create(Application);
      Form.Parent := ParentControl;
      Form.Show;
    end;楼主,敢问一下:FormClass: TFormClass,传入一个TFormClass的实例后,还能用TFormClass的实例FormClass创建实例吗?如果你一定要这样用,要用到类之类
      

  2.   

    楼主用的TFormClass本来就是类之类,定义在Forms单元里:TFormClass = class of TForm;
    可以改成这样:注意第一个参数var Form;
    procedure iFormCreate(var Form; FormClass: TFormClass; ParentControl: TWinControl);
    begin
      TForm(Form) := FormClass.Create(Application);
      with TForm(Form) do
      begin
        Parent := ParentControl;
        Show;
      end; 
    end;
      

  3.   

    zplinze(linze),太棒了!我曾想并尝试了形参,觉得引用就绝不会错。可惜我头脑呆板写成
    procedure iFormCreate(var Form: TForm; FormClass: TFormClass; ParentControl: TWinControl);
    而导致类型不对应,就轻易放弃了。