请问一下在delphi中怎么把一个程序分模块来做?
  我前久用delphi做了一个播放器,播放器共分为:主窗口,列表窗口,添加窗口,关于窗口。可我想把后3个窗口封装在dll文件中,可怎么做也不行。听别人说在dll的窗口都是用代码绘制出来的。我在网上找了好久也没找的怎么分模块设计程序的文章。请个位高手给我这个才上大一的学生解答一下这个难题吧?
   有没有那为高手愿意收徒弟啊?我好想找个师傅啊,那为高手能收我为徒啊?如果有那为高手愿收小弟为徒就联系 E-mail:[email protected] 或 QQ:116431476 

解决方案 »

  1.   

    听别人说在dll的窗口都是用代码绘制出来的DLL文件中加入窗体文件,然后导出的函数内写;
     form1 := tform1.create(nil)
      try
        form1.showmodal;
      finally
       form1.free;
      end;
      

  2.   

    举个简单的例子:1.File New Application,设计好窗体。
    2.Project ViewSource ,修改成下面代码:library DLLFormTest;uses
      Unit1 in 'Unit1.pas' {Form1};{$R *.res}procedure test;
    var aForm:TForm1;
    begin
      aForm:=TForm1.Create(nil);
      aForm.ShowModal;
      aForm.Free;
    end;
    exports
        test;
    beginend.3.保存DLLFormTest,编译成DLL4.在其它程序中调用:procedure test;external 'DLLFormTest.dll';
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      test;
    end;
      

  3.   

    DLL中加入一个窗体,然后注意下面我打记号的代码
    unit frmSbman;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Buttons, ExtCtrls, ComCtrls, Grids, DBGrids, DBCtrls,
      ExtDlgs,activex, Mask;type
      TfrmSbManager = class(TForm)
        Panel1: TPanel;
        GroupBox1: TGroupBox;
        GroupBox2: TGroupBox;
        DBGrid1: TDBGrid;
        grbxBaseInfo: TGroupBox;
        Label2: TLabel;
        edSbname: TEdit;
        dtpkGmrq: TDateTimePicker;
        edDj: TEdit;
        EdSl: TEdit;
        edDb: TEdit;
        edTel: TEdit;
        edCj: TEdit;
        Label1: TLabel;
        edSbid: TEdit;
        OpenPictureDialog1: TOpenPictureDialog;
        Memo1: TMemo;
        Image1: TImage;
        Splitter1: TSplitter;
        StatusBar1: TStatusBar;
        GroupBox3: TGroupBox;
        btnInsert: TSpeedButton;
        btnDel: TSpeedButton;
        GroupBox4: TGroupBox;
        btnPost: TSpeedButton;
        StaticText1: TStaticText;
        procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
          DataCol: Integer; Column: TColumn; State: TGridDrawState);
        procedure FormCreate(Sender: TObject);
        procedure btnInsertClick(Sender: TObject);
        procedure btnPostClick(Sender: TObject);
        procedure Image1DblClick(Sender: TObject);
        procedure edDjKeyPress(Sender: TObject; var Key: Char);
        procedure btnDelClick(Sender: TObject);
        procedure EdSlKeyPress(Sender: TObject; var Key: Char);
      private
        { Private declarations }
      public
        CzDm : integer;//操作代码
        PicterFilename : string;
        function isClearText(AControl:TWinControl) : boolean;
        procedure ClearEditText(AControl:TWinControl);
        function InsertSbTb : Boolean;
        function HaveSbId(id : String) : boolean;
        function DeleSb(id : string) : boolean;
      end;implementationuses dtmdl, DB, ADODB;{$R *.dfm}var
      frmSbManager: TfrmSbManager;procedure ShowSbManager;stdcall;//导出函数
    begin
        CoInitialize(nil);
        dtmd := Tdtmd.Create(nil);
        frmSbManager := TfrmSbManager.Create(nil);
      try
        try
          frmSbManager.ShowModal;
        except
          ShowMessage('w');
        end;
      finally
          dtmd.ADOConnection1.Connected := false;
          frmSbManager.Free;
          dtmd.Free;
          CoUninitialize;
      end;
     //
    end;exports
       ShowSbManager;  //导出工程文件这么写
    library DSbManager;{ 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
      sharemem,
      SysUtils,
      Classes,
      frmSbman in 'frmSbman.pas' {frmSbManager},
      dtmdl in '..\dtmdl.pas' {dtmd: TDataModule};{$R *.res}beginend.调用DLL的主程序这么写interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,  jpeg, ExtCtrls, Menus, StdCtrls;type
      TfrmMain = class(TForm)
        MainMenu1: TMainMenu;
        N1: TMenuItem;
        N2: TMenuItem;
        N3: TMenuItem;
        Image1: TImage;
        N4: TMenuItem;
        N5: TMenuItem;
        N6: TMenuItem;
        Label1: TLabel;
        procedure N4Click(Sender: TObject);
        procedure N5Click(Sender: TObject);
        procedure N6Click(Sender: TObject);
        procedure N3Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
      public  end;var
      frmMain: TfrmMain;implementationuses about;
      procedure ShowSbManager;stdcall;external 'dll\DSbManager.dll';//声明你的DLL在那里
    {$R *.dfm}
      

  4.   

    这也算是分模块的一种吧,不过仅仅是把各个窗体存放在独立的DLL里面。如果从更难的角度来做,可以把界面与控制播放的代码分离,做成一层一层。一般我会用包来做,不是DLL。因为包可以更方便的存贮一个类。