如题

解决方案 »

  1.   

    类似maxthon的效果吧,可以用树型菜单放在左侧
      

  2.   

    就是侧边放一个panel,在panel里面再放个treeview,然后加载treeview的节点,双击节点打开相应的模块,在这里你可以把菜单做在数据库里面,做一个模块表,分级,比如,基础档案为第一级,下面再分货物档案等第二次,这里包括菜单编码,菜单名称,是否执行等字段,是否执行表示双击是不是打开一个模块,如果是则打开...panel可以做成自动隐藏的风格,如果不喜欢用,可以网上下载一个suipark或是其他第三方控件,很多的,放在MDI的左侧让他自动伸缩隐藏
      

  3.   

    不想做成MDI,希望是集成到主程序的窗体中
      

  4.   

    TO callzjy(快升五星了) :我想知道模块中的窗体如何变成主程序窗体中的一个页框
      

  5.   

    在主窗体中放好PageControl
    将TabSheet以参数方式传入子模块
    设置模块窗体的Parent:= TabSheet
      

  6.   

    顶啊,我也曾试过,但不成功,DLL窗口可以在主窗口中显示出来,但,键盘操作就出问题了,好象鼠标点击也有问题,感觉是两窗口不能真正溶合成一个程序
      

  7.   

    子模块是DLL,需要把主程序的Application.Handle作为参数传入DLL,赋值给dll的Application.Handle,这样才能让dll和主程序融合;
    另外,Dll窗口要用非模式show显示而不是showmodal,否则键盘鼠标就没反映了。
      

  8.   

    library Test;uses
      Forms,SysUtils,Classes,windows,
      Unit_FrmSelectWorker in 'Unit_FrmSelectWorker.pas' {FrmSelectWorker};Function Run(Aparent:TWinControl):Boolean;stdcall;
    begin
      FrmSelectWorker:=TFrmSelectWorker.Create(Aparent);
      FrmSelectWorker.Show;
      Result:=true;
    end;procedure MyDLLHandler(Reason: integer);
    var
      a:integer;
    begin
      case Reason of
        DLL_Process_Attach: a:=0;
        DLL_Process_Detach: FrmSelectWorker.Free;
        DLL_Thread_Attach: a:=0;
        DLL_Thread_Detach: a:=0;
      end;
    end;
    {$R *.res}
    exports
      Run;
    begin
    end.
      

  9.   

    用dll在主控程序中操作dll中的子窗体,会在焦点处理、键盘响应出现问题,还会经常出现内存访问错误。
    用bpl则所有问题都不存在,而用法基本上与dll类似。
    请采用动态编译编译工程,并拷贝运行时所需要的的bpl及dll文件。
      

  10.   

    to:StarRains(星雨) 
    这些我都试过了,相类似的办法也都试过了,都不行!
    好象这主程序都不肯承认这个寄生的外来仔(dll窗口)
      

  11.   

    bpl是面向对象的,dll是面向过程的,在采用bpl的系统中,整个系统仅有一个application和screen对象,而采用dll的系统中整个系统是相互独立的,每个dll都有它自己的application和screen对象,dll间的通讯和控制必须采用消息、内存映象文件等低级手段。
      

  12.   

    bpl确实没问题。但是,我们不能要求所有的开发人员都用DELPHI。这不符合平台的要求。
    请大家继续......
      

  13.   

    不成就换一下界面的架构方式吧,干嘛非得把子窗体放到page上啊?
      

  14.   

    像步青云所说的bpl完全可以用dll窗体实现的,我的就是这样做的
    library Chda;{ Important note about DLL memory management: ShareMem must be the
      first unit in your library's USES clause AND your project's (select
      Project-View Source) USES clause if your DLL exports any procedures or
      functions that pass strings as parameters or function results. This
      applies to all strings passed to and from your DLL--even those that
      are nested in records and classes. ShareMem is the interface unit to
      the BORLNDMM.DLL shared memory manager, which must be deployed along
      with your DLL. To avoid using BORLNDMM.DLL, pass string information
      using PChar or ShortString parameters. }uses
      SysUtils,
      Classes,
      Forms,
      ExtCtrls,
      windows,
      ADODB,
    你自己的工程文件;{$R *.res}Function GetFormOne(aCn:TADOConnection;aApp:TApplication;aModuleName:PChar):TForm; export; stdcall;
    begin
      FCn:=aCn;
      FModuleName:=aModuleName;
      Application:=aApp;
      Result:=TChdaForm.create(Application);
    end;----------------------------------------在得到dll时调用procedure SetOldApplication;stdcall;export;---------dll消毁时调用,如整个应用程序退出
    begin
      Application:=FApp;
    end;exports
      GetFormOne,SetOldApplication;----------导出创建窗体和设置原来Applicationbegin
        FApp:=Application;-------------------这里dll一开始就保存原来的对象
    end.像这样所有机制都这样了,当然楼主可以把所有这些dll handle作为数组保存,虽然步骤多一个,但是效果是全部能够达到的
      

  15.   

    FApp,FCn,FModuleName,FScreen都可以这样来做,特殊主要是FApp,FScreen需要手动设置并在退出设置回原来的Application和Screen
      

  16.   

    不好意思,刚出差回来。
    To StarRains(星雨):详细说一下。
    TO callzjy(经常性地总结性地理一理):好!!!
      

  17.   

    绕了一个弯儿,需要在主程序里定义一个form对象frmClient:Tform作为载体;调用dll的接口需要有一个Tform类型的参数用于将这个载体传入;dll中的子窗体用CreateParented方法创建;创建frmClient --> frmClient.Parent:= TabSheet1 --> 调DLL窗体创建接口,将frmClient作为参数传入 --> frmDllsub:=TfrmDllsub.CreateParented(frmClient.Handle);我在delphi中试了没有问题,不知道用别的语言写的dll能不能实现。