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;
 (1) Child:=TForm(FormClass.NewInstance);
 (2)  TForm(fm):=Child;
     Child.Create(AOwner);
end;请问,(1),(2) 两句作何解?

解决方案 »

  1.   

    fm:TComponent TForm(fm):=child;强制类型转换成TForm类;TComponent 是TForm的父类
    FormClass.NewInstance 是创建FormClass这个类的对象,和构造器有点一样,在delphi的
    以前版本里比较常用!
      

  2.   

    我感觉你的代码有问题,如果要实现你的要求可以用
    enumwindowchile()等API函数比较好,我做过一个你要不要啊?!
      

  3.   

    (1)调用类类型变量FormClass的对象级别方法NewInstance。其实就是调用类类型所对应的类的实力的对象方法NewInstance;
    (2)就是个类型转换,不过不是很安全,最好用AS操作符
      

  4.   

    SHIT,说错了,NEWINSTANCE也是个类方法
      

  5.   

    这些代码恐怕编译都通不过
    传进来的参数都有毛病
    FormClass: TFormClass
    这里formclass不能和classtype相比
    classtype是与rtti中存放的类信息相比较而已
    而这个传进来的东西是未实始化的类实例罢了
    fm未说明数据类型
      

  6.   

    这个函数分为两部分;
    1. 查找桌面上是否存在指定classname的窗体,如果存在则将他显示出来,并且放在无类型变量fm中返回,同时退出函数;
    2. 如果没有找到指定classname的窗体,就重新初始化一个,并且放在fm中返回.(1) Child:=TForm(FormClass.NewInstance);    /* 分配formclass指定类的内存 */ 
    (2) TForm(fm):=Child;                       /* 返回内存指针 */
    (3) Child.Create(AOwner);                   /* 格式化内存数据为formclass指定的结构 */  上面的(1)(3)两句话创建了一个Formclass指定类型的窗体. (2)返回实例指针;
    上面的语句可以改为:
    Child := TForm(FormClass.create(Aowner)) ;
    TForm(fm):=Child;