zoukankan      html  css  js  c++  java
  • 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

    运行结果:

  • 相关阅读:
    Codeforces Round #408 (Div. 2) C
    Codeforces Round #408 (Div. 2) B
    Codeforces Round #408 (Div. 2) A
    我眼中的Linux设备树(五 根节点)
    我眼中的Linux设备树(四 中断)
    我眼中的Linux设备树(三 属性)
    我眼中的Linux设备树(二 节点)
    我眼中的Linux设备树(一 概述)
    为什么你应该(从现在开始就)写博客
    LCD正向扫描和反向扫描
  • 原文地址:https://www.cnblogs.com/pengshaomin/p/2358558.html
Copyright © 2011-2022 走看看