这是一个类型完全不一样的问题。    application.createform(Tform1,form1) 中的TForm1是个类别,form1是个对象指针;而你从数据库中得到的只是一个字符串,它们之间没有转化的可能。
    你在工程中有没有定义一个TForm1这样的类,或者在数据库中保存了该类的所有资源?如果只有这么一个名字,是没办法转换的;如果在工程中有这个船口类别的定义,你可以通过比较该类别的类别名称或者窗口对象名称与数据库中的字段值来操作createform函数。

解决方案 »

  1.   

    如果你是想根據字段的内容創建不同的Form可以這樣做:
    1,將你想要創建的Form註冊
    ...
    initialization
      RegisterClass(TOrderForm, TSalaryForm,...)
    ...
    2,通過字段的内容得到類
    var
      AClass1: TObject;
      AForm: TForm;
      pro_name: string;
    begin
      pro_name:='T'+Table1.FieldByName('pro_name').asString;
      AClass1 := GetClass(pro_name);
      application.createform(AClass1, AForm); 
    ...
    end;
      

  2.   


    http://www.csdn.net/expert/topic/697/697439.xml?temp=.5595819回复人: cxz9(一网情深) (  ) 信誉:100  2002-05-07 09:28:00  得分:0  
     
     
      把楼上的改一下就可以了呀!procedure TMainForm.execute(const agnbh:string);
    var
      exename: array[0..79] of char;
      fldname:string;  classname:string; //add by cxz
    begin
      with qsel_runexe do
      begin
        if active then close;
        parambyname('name').asstring:=agnbh;
        open; //根据菜单名字提取FORM名字
        if (recordcount=1) and (fieldbyname('frmname').asstring<>'') then
        begin
          fldname:=trim(fieldbyname('frmname').asstring);
          classname:='T'+fldname;//add by cxz            if not checkMDIChildform(fldname) then
            //查找此子窗体是否存生的函数!
            begin
               application.createform(classname,fldname);//by cxz
            end else Tform(fldname).Show; //by cxz     end;
      end;
    end;  
     
    Top 
     
     回复人: cxz9(一网情深) (  ) 信誉:97  2002-05-12 18:14:00  得分:0  
     
     
      怎么这么久了还不结??
      
     
    Top 
     
     回复人: yyfhz(火山) (  ) 信誉:100  2002-05-12 20:03:00  得分:0  
     
     
      Delphi提供以下函数:Getclass(ClassName) 获取某个名称的类型,不过那些类型必须要经过注册才可以被找到(否则返回空).
    RegisterClass(Class) 注册一个类。
    下面举一个例子:再FormUnit里有一个TmyForm窗体类,可以这么处理。
    1. 在FormUnit的最后加上
    Initialization
      //注册TmyForm
      RegisterClass(TmyForm) ;
    end ;2. 在需要的地方(比如在函数CreateFormByClassname(sClassName: String))
    function CreateFormByClassname(sClassName: String): TForm ;
    var
      rClass: TClass ;
    begin
      rClass := GetClass(sClassName) ;
      if  rClass <> nil  then
        //我不知道原因,但是TComponentClass(rClass).Create(nil)
        //好象会返回已经存在的对象,而application.CreateForm则不会
        application.CreateForm(TComponentClass(rClass),Result) ;
    end ;
      
     
      

  3.   

    if not checkMDIChildform(fldname) then //這個函數是自己寫的嗎?是怎樣實現的呢?
            //查找此子窗体是否存生的函数!
    这不是我写的。你也可以先把全部窗体创建后要用时再显示就是了。
    动态创建时要自己用RegisterClass(TmyForm);注册一下。回复人: yyfhz(火山) (  ) 信誉:100  2002-05-12 20:03:00  得分:0  
     
     
      Delphi提供以下函数:Getclass(ClassName) 获取某个名称的类型,不过那些类型必须要经过注册才可以被找到(否则返回空).
    RegisterClass(Class) 注册一个类。
    下面举一个例子:再FormUnit里有一个TmyForm窗体类,可以这么处理。
    1. 在FormUnit的最后加上
    Initialization
      //注册TmyForm
      RegisterClass(TmyForm) ;
    end ;2. 在需要的地方(比如在函数CreateFormByClassname(sClassName: String))
    function CreateFormByClassname(sClassName: String): TForm ;
    var
      rClass: TClass ;
    begin
      rClass := GetClass(sClassName) ;
      if  rClass <> nil  then
        //我不知道原因,但是TComponentClass(rClass).Create(nil)
        //好象会返回已经存在的对象,而application.CreateForm则不会
        application.CreateForm(TComponentClass(rClass),Result) ;
    end ;