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

丶灬走出姿态 提交于 2019-12-22 08:40:02

首先点击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;interfaceuses  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  endend

 

 

运行结果:

 

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!