首页 - 网络编程 - Delphi

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

2012-02-20 08:01:24cnblogs.com-TryHard - 点击数:

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

 

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

borderStyle属性设为:bsToolWindow

保存为 DllFormUnit.pas

 

unit DllFormUnit;interfaceuses  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;beginend.

  

 

主窗体设计

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

 

 

运行结果:

 

 

 

相关文章

    无相关信息

本站导航