Dll学习二_Dll 窗体中动态创建数据并使用Demo

沿用上一篇Demo

环境:DelphiXE,XP,SQL2005

贴出改动过的单元代码:

dbGrid控件版:

unit SubMain_Unit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, FyDataConn_Unit, ActiveX,
  ADODB, StdCtrls, cxGraphics, cxControls, cxLookAndFeels,
  cxLookAndFeelPainters, cxStyles, dxSkinsCore, dxSkinBlueprint,
  dxSkinDevExpressDarkStyle, dxSkinDevExpressStyle, dxSkinHighContrast,
  dxSkinSevenClassic, dxSkinSharpPlus, dxSkinStardust, dxSkinTheAsphaltWorld,
  dxSkinVS2010, dxSkinWhiteprint, dxSkinscxPCPainter, cxCustomData, cxFilter,
  cxData, cxDataStorage, cxEdit, cxNavigator, cxDBData, cxGridLevel, cxClasses,
  cxGridCustomView, cxGridCustomTableView, cxGridTableView, cxGridDBTableView,
  cxGrid, Grids, DBGrids;

  //原采用cxgrid,因动态获取全部列出错,暂时未解决,采用IDE自带的dbgrid

type
  TFrm_SubMain = class(TForm)
    Btn_1: TButton;
    Grd_2: TDBGrid;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormDestroy(Sender: TObject);
    procedure Btn_1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    DSet: TADODataSet;
    DS: TDataSource;
    Conn: TADOConnection;
    { Private declarations }
  public
    { Public declarations }
  end;
  procedure CreateFrm(AppHnd: THandle);export;stdcall;
  procedure DropFrm; export;stdcall;

var
  Frm_SubMain: TFrm_SubMain;

implementation

{$R *.dfm}
procedure CreateFrm(AppHnd: THandle);
begin
  Application.Handle := AppHnd;

  if not Assigned(Frm_SubMain) then
    Frm_SubMain := TFrm_SubMain.Create(Application);

  Frm_SubMain.Show;
end;

procedure DropFrm;
begin
  if Frm_SubMain <> nil then
    FreeAndNil(Frm_SubMain);
end;
procedure TFrm_SubMain.Btn_1Click(Sender: TObject);
var
  SQL: String;
begin
  DSet.Connection := Conn;
  DS.DataSet := DSet;
  SQL := 'Select * From Cg_CgDanSub';
  dbOpen(SQL,DSet);       //自定义函数,用于打开数据集
  Grd_2.DataSource := DS;

end;

procedure TFrm_SubMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

procedure TFrm_SubMain.FormCreate(Sender: TObject);
begin
  Conn := TADOConnection.Create(Application);
  Conn.LoginPrompt := False;
  Conn.ConnectionString := 'Provider=SQLOLEDB.1;Password=***;Persist Security Info=True;User ID=sa;Initial Catalog=test;Data Source=127.0.0.1';
  Conn.Connected := True;
  DSet := TADODataSet.Create(Application);
  DS := TDataSource.Create(Application);
end;

procedure TFrm_SubMain.FormDestroy(Sender: TObject);
begin
  DSet.Free;
  DS.Free;
  FreeAndNil(Conn);
  Frm_SubMain := nil;
end;
end.

cxGrid控件版:

unit SubMain_Unit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, FyDataConn_Unit, ActiveX,
  ADODB, StdCtrls, cxGraphics, cxControls, cxLookAndFeels,
  cxLookAndFeelPainters, cxStyles, dxSkinsCore, dxSkinBlueprint,
  dxSkinDevExpressDarkStyle, dxSkinDevExpressStyle, dxSkinHighContrast,
  dxSkinSevenClassic, dxSkinSharpPlus, dxSkinStardust, dxSkinTheAsphaltWorld,
  dxSkinVS2010, dxSkinWhiteprint, dxSkinscxPCPainter, cxCustomData, cxFilter,
  cxData, cxDataStorage, cxEdit, cxNavigator, cxDBData, cxGridLevel, cxClasses,
  cxGridCustomView, cxGridCustomTableView, cxGridTableView, cxGridDBTableView,
  cxGrid, Grids, DBGrids,dxCore;

	//这边引用了一个dxCore,替换原来的dxGDIPlusAPI单元,新版本DevExpress原Com里面的配置函数转移到dxCore单元中

type
  TFrm_SubMain = class(TForm)
    Btn_1: TButton;
    GTV_1: TcxGridDBTableView;
    GL_1: TcxGridLevel;
    Grd_1: TcxGrid;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormDestroy(Sender: TObject);
    procedure Btn_1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    DSet: TADODataSet;
    DS: TDataSource;
    Conn: TADOConnection;
    { Private declarations }
  public
    { Public declarations }
  end;
  procedure CreateFrm(AppHnd: THandle);export;stdcall;
  procedure DropFrm; export;stdcall;

var
  Frm_SubMain: TFrm_SubMain;

implementation

{$R *.dfm}
procedure CreateFrm(AppHnd: THandle);
begin
  Application.Handle := AppHnd;

  if not Assigned(Frm_SubMain) then
    Frm_SubMain := TFrm_SubMain.Create(Application);

  Frm_SubMain.Show;
end;

procedure DropFrm;
begin
  if Frm_SubMain <> nil then
    FreeAndNil(Frm_SubMain);
end;
procedure TFrm_SubMain.Btn_1Click(Sender: TObject);
var
  SQL: String;
begin
  DSet.Connection := Conn;
  DS.DataSet := DSet;
  SQL := 'Select * From Cg_CgDanSub';
  dbOpen(SQL,DSet);       //自定义函数,用于打开数据集
  GTV_1.DataController.DataSource := DS;
  (GTV_1.DataController as IcxCustomGridDataController).DeleteAllItems;           //清除cxGrid列
  (GTV_1.DataController as IcxCustomGridDataController).CreateAllItems(False);    //添加cxGrid列,该句必须再单元后面做初始化动作

end;

procedure TFrm_SubMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

procedure TFrm_SubMain.FormCreate(Sender: TObject);
begin
  Conn := TADOConnection.Create(Application);
  Conn.LoginPrompt := False;
  Conn.ConnectionString := 'Provider=SQLOLEDB.1;Password=fydesign;Persist Security Info=True;User ID=sa;Initial Catalog=test;Data Source=127.0.0.1';
  Conn.Connected := True;
  DSet := TADODataSet.Create(Application);
  DS := TDataSource.Create(Application);
end;

procedure TFrm_SubMain.FormDestroy(Sender: TObject);
begin
  DSet.Free;
  DS.Free;
  FreeAndNil(Conn);
  Frm_SubMain := nil;
end;
initialization
  dxInitialize;		//应用dxCore单元中的该函数替换老版本DevExpress的dxGDIPlusAPI单元内的dxInitializeGDIPlus函数

finalization
  dxFinalize;		//应用dxCore单元中的该函数替换老版本DevExpress的dxGDIPlusAPI单元内的dxFinalizeGDIPlus函数
end.

关于这段代码,同一个Dll文件中,只要输入一个窗体文件即可,其他窗体均能正常使用

initialization
  dxInitialize;		//应用dxCore单元中的该函数替换老版本DevExpress的dxGDIPlusAPI单元内的dxInitializeGDIPlus函数

finalization
  dxFinalize;		//应用dxCore单元中的该函数替换老版本DevExpress的dxGDIPlusAPI单元内的dxFinalizeGDIPlus函数


posted @ 2013-11-28 10:09  胡伟峰  阅读(483)  评论(0编辑  收藏  举报