Create Table Tb_Menu(
  [ID] int identity(1,1) primary key,
  [FrmCaption] varchar(32) not null,
  [FrmName] varchar(32) not null,
  [PID] int
)
insert into Tb_Menu(FrmCaption,FrmName,PID) select '系统','-',0 
union all select '人事系统','FrmHumanResource',1
union all select '财务系统','FrmFinance',1
union all select '设备管理系统','FrmEquipment',1
union all select '联达系统','FrmLianDa',1
union all select '五金系统','FrmWuJin',1select * from Tb_Menudrop table Tb_Menu根据该表我在delphi做的客户端产生一个树形Treeview,
一个节点对应一个窗体,我想根据数据库中的记录动态创建窗体
如:FrmFinance:=TFrmFinance.Create(nil);
有什么办法能这样实现呢

解决方案 »

  1.   


    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Buttons, ComCtrls, DB, ADODB;type
      TForm1 = class(TForm)
        TreeView1: TTreeView;
        BitBtn1: TBitBtn;
        ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure TreeView1DblClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
      {---留意此处-------}
      TFrmName= ^MFrmName;
      MFrmName = record
      FType: string;
      end;var
      Form1: TForm1;implementationuses Unit2, Unit3;{$R *.dfm}
    {---留意这里----}
    const
      ArrFormClass : array[0..1] of TFormClass=(TFrmHumanResource,TFrmFinance);
      ArrClassName : array[0..1] of String=('FrmHumanResource','FrmFinance');
    function CreateForm(const AnyForm:TFormClass):TForm;
    begin
      Result := AnyForm.Create(Application);
      Result.Showmodal;{模式显示}
    end;
    function GetIndex(sStr : String) : integer;
    var
      i :integer;
    begin
      result := -1 ;  for i := low(ArrClassName) to high(ArrClassName) do
        if sStr = ArrClassName[i] then
        begin
          result := i ;
          exit;
        end;end;procedure TForm1.FormCreate(Sender: TObject);
    var
    p:TFrmName;
    Nodea,Nodeb:TTreeNode;
    begin
    {------------------------------建树----------------------}
     with adoquery1 do begin
       Nodea:=TreeView1.Items.AddChild(nil,adoquery1.FieldValues['FrmCaption']);
       while not eof do begin
        new(p);
        Nodeb:=TreeView1.Items.AddChild(Nodea,adoquery1.FieldValues['FrmCaption']);
        p^.FType:=adoquery1.FieldValues['FrmName'];
        Nodeb.Data:=p;
        next;
       end;
     end;
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    var   
    I:Integer;
    begin
    {--释放TreeView的data}
    for   I := 0   to TreeView1.Items.Count -1   do
      if  Assigned(TreeView1.Items[I].Data) then begin
         Dispose(TFrmName(TreeView1.Items[I].Data));
         TreeView1.Items[I].Data   :=   nil;
      end;
    end;procedure TForm1.TreeView1DblClick(Sender: TObject);
    var
      iIndex : integer;begin
       if   Assigned(TreeView1.Selected.Data)   then
       begin
         iIndex := GetIndex(TFrmName(TreeView1.Selected.Data).FType);
         if iIndex = -1 then exit;
         CreateForm(ArrFormClass[iIndex]);
       end;
    end;
    end.
    {注:示例的窗体是动态创建的,请安实制需要修改,另本例是经过测试才发代码的}
      

  2.   

    记得先要注册这些类.参看下 RegisterClass, GetClass 你就会明白了.
      

  3.   

    在delphi中如何动态建立类的实例http://read.newbooks.com.cn/info/53006.html