客户要求二次开发,自己添加Form,然后修改一下配置文件就要求能把Form添加到程序中,也就是说我只能以字符串的形式知道这个Form的存在,举个例子说,'Frm_Customer'就是客户新添加的窗体,然后我在这种情况下,怎么能够显示他呢?可以是在一个按钮的消息处理函数中显示var
  FrmName : String;
......
  FrmName := 'FrmCustomer';
......ButMy.Click;
begin
  ???
end;

解决方案 »

  1.   

    简单啊。
    自定义TForm类型的变量。然后,
    CustomForm :=TForm.Create(Self);
    CustomForm.Name :=FrmName;   //你读取到的客户新添加的窗体,然后自己根据客户给定的一些窗体属性然后再设置你的CustomForm的属性
      

  2.   

    procedure OpenForm(FormClass: TFormClass; var fm; AOwner:TComponent);
    var
      i: integer;
      Child:TForm;
    begin
      for i := 0 to Screen.FormCount -1 do
          if Screen.Forms[i].ClassType=FormClass then
          begin
            Child:=Screen.Forms[i];
            if Child.WindowState=wsMinimized then
               ShowWindow(Child.handle,SW_SHOWNORMAL)
            else
               ShowWindow(Child.handle,SW_SHOWNA);
            if (not Child.Visible) then Child.Visible:=True;
            Child.BringToFront;
            Child.Setfocus;
            TForm(fm):=Child;
            exit;
          end;
      Child:=TForm(FormClass.NewInstance);
      TForm(fm):=Child;
      Child.Create(AOwner);
    end;
      

  3.   

    关键问题是我只知道那个Form的名字,类啊什么的都是我程序做好后客户添加的,snake_eye(黄昏深处的白骨盾牌)说的那个FormClass是我不知道的,因为在我程序完成的时候,我还不止到用户会添加什么类进来,我要是知道了,那就简单得很了。
      

  4.   

    我不太理解你的意思,你看看我下面写的代码是否是你想要的://假设你要添加的窗口叫AddedForm
    procedure TForm1.Button1Click(Sender:TObject);
    begin
      if not Assigned(Application.FindComponent('AddedForm')) then
      begin
        Application.CreateForm(Self.Parent.ClassType,AddedForm);
        ....
      end;
    end;
      

  5.   

    CreateForm(Self.Parent.ClassType,AddedForm);
    出错
    Error: Incompatible types: 'TComponentClass' and 'TClass'我不知道我是不是没说清楚啊?
    就是我先做一套系统出来,给客户提供源代码,它只需要在程序里面加入Form,比如说Form的名字叫'Frm_Customer',然后它只需要修改我的配置文件,然后告诉我在什么地方显示这个Form,比如说就是在But.Click中,那我就是相当于只知道一个Form 的名字,然后要在函数中响应显示,具体这个Form存在不存在,我都不知道。
      

  6.   

    function TMyClass.GetForm(frmName: string): TForm;
    var
      i: Integer;
      RetForm: TForm;
    begin
      Result := nil;
      try
        frmName := LowerCase(frmName);
        for i:=0 to Application.ComponentCount-1 do
          if Application.Components[i]  is TForm then
          begin
            RetForm := TForm(Application.Components[i]);
            if LowerCase(RetForm.name)= frmName then
            begin
              Result:= RetForm;
              Break;
            end;
          end;
      except
      end;
    end;
      

  7.   

    你现在是要做一个类似Delphi的东东。这个很复杂的