转 Dll创建一个"日历"窗体(一)

首先点击File->New->Other-> Dynamic Link Libary

 

把工程文件保存为:CalendarLib.pas 再创建一个Form并放入一个TMonthCalendar控件

borderStyle属性设为:bsToolWindow

保存为 DllFormUnit.pas

 

unit DllFormUnit;
  
interface
  
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls;
  
type
  TDllForm = class(TForm)
    MonthCalendar1: TMonthCalendar;
    procedure MonthCalendar1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  
var
  DllForm: TDllForm;
// 供外部调用函数
function ShowCalendar(AHandle: THandle;ACaption: String):PChar;stdcall;
implementation
  
{$R *.dfm}
function ShowCalendar(AHandle: THandle;ACaption: String):PChar;
var
 DllForm: TDllForm;
begin
  //复制应用程序的句柄给Dll
  //Dll中Application对象与调用它的应用程序是分离的,为使Dll中的窗体真正的成
  //为应用程序模式窗体,必须将应用程序的句柄赋给Dll的Application.Handle属性
  //必须确保AHandle句柄不为nil,否则出现无法预料的错误
  Application.Handle := AHandle;
  DlLForm := TDllForm.Create(Application);
  try
     DllForm.Caption := ACaption;
     DllForm.ShowModal;
     Result := PChar(DateToStr(DllForm.MonthCalendar1.Date));
  finally
     DllForm.Free;
  end;
end;
  
procedure TDllForm.MonthCalendar1Click(Sender: TObject);
begin
  Close;
end;
  
end.

 CalendarLib.pas

library CalendarLib;
  
uses
  SysUtils,
  Classes,
  DllFormUnit in 'DllFormUnit.pas' {DllForm};
  
{$R *.res}
exports
  ShowCalendar;
begin
end.

  

 

主窗体设计

MainFormUnit.pas文件

unit MainFormUnit;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TShowCalendar = function (AHandle: THandle;ACaption: String):PChar;stdcall;

TMainForm = class(TForm)
btnShowCalendar: TButton;
lblDate: TLabel;
procedure btnShowCalendarClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
MainForm: TMainForm;

implementation

{$R *.dfm}

procedure TMainForm.btnShowCalendarClick(Sender: TObject);
var
ShowCalendarForm: TShowCalendar;
libHandle: THandle;
begin
libHandle := LoadLibrary('CalendarLib.dll');
try
//是否读取成功
if libHandle = 0 then
raise Exception.Create('加载CalendarLib.dll失败');
//读取函数方法地址
@ShowCalendarForm := GetProcAddress(LibHandle,'ShowCalendar');
//读取是否成功
if not (@ShowCalendarForm = nil) then
begin
lblDate.Caption :=ShowCalendarForm(Application.Handle,'选择日历');
end
else
RaiseLastWin32Error;
finally
     //释放Dll     
     FreeLibrary(LibHandle);

DFM文件

object MainForm: TMainForm
Left = 0
Top = 0
Caption = 'MainForm'
ClientHeight = 202
ClientWidth = 447
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object lblDate: TLabel
Left = 119
Top = 45
Width = 98
Height = 13
Caption = #26085#26399':'
end
object btnShowCalendar: TButton
Left = 16
Top = 40
Width = 97
Height = 25
Caption = #26174#31034#26085#21382#31383#20307
TabOrder = 0
OnClick = btnShowCalendarClick
end
end

 

 

运行结果:

 

 

 

 

posted @ 2012-02-21 15:14  leon_kin  阅读(315)  评论(0编辑  收藏  举报