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;
    TForm(fm):=FormClass.Create(AOwner);
    TForm(fm).Show;
end;

解决方案 »

  1.   

    procedure OpenForm(FormClass: TFormClass; var fm; AOwner:TComponent);
    这句有问题吧?var fm; AOwner:TComponent
      

  2.   

    上面这句应该是有问题  var fm  什么东东?感觉是这样 var fm:TForm;不知道对不对
      

  3.   

    我来告诉大家:
      这是一个“调用窗体”的函数!!!
    第一个for循环是从屏幕上所有窗体中找你所要调用的子窗体。
      if Screen.Forms[i].ClassType=FormClass then这句的意思是:
    判断屏幕中某个窗体是不是你所调用的窗体?
      if (not Child.Visible) then Child.Visible:=True;//应该知道吧
            Child.BringToFront;
            Child.Setfocus;
      如果是要调用的窗体,则置为前面,并设置焦点.
      exit;
     如果在屏幕程序中找到了,则退出显示窗体的函数!!!!
    如果没有找到的话,则要执行以下语句了:
     TForm(fm):=FormClass.Create(AOwner);
        TForm(fm).Show;
    就把要调用的窗体,创建出来,并显示
     
      

  4.   

    var fm
    没有问题:
    无类型引用参数
    类似c中的void *
      

  5.   

    var fm
    没有问题,
    但运行速度比var fm:Tfrom;慢