Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2022年09月03日] [更新 2022年09月03日] Delphi 一般・その他
フォームを実装した DLL を Lazarus で作成
動作確認等 Windows 10 ビルド 19043 Pro 64 bit + lazarus-2.0.12 32 bit
[整理番号 - 1540]







フォームを実装した DLL を Lazarus で作成


Lazarus で、フォームを実装した DLL を新規に作成する手順と、簡単なサンプル作成の記事です。






01_DLL を新規作成して新規作成のフォームを追加


IDE のメニューの [プロジェクト] から [新規プロジェクト] を選択します。下図のダイアログが起動します。このダイアログの左ペインの [ライブラリ] をダブルクリックするか、選択して [OK] ボタンで閉じると、新規の DLL 作成の状態になります。



図1
DLL の新規作成
  • [ライブラリ] を選択
  • [OK] をクリック

[プロジェクト] [名前を付けてプロジェクトを保存] で、SampleDLL.lpr という名前で、任意のフォルダに保存します。
次にフォームを作成します。
[ファイル] [新規フォーム] で作成します。
TButton1 を 1 つだけ配置します。下図では、DLL を使用する側のフォームと区別するために、フォームの背景色を変更しています。フォームのアイコンも変更しています。



図2
フォーム設計時の画面
  • TButton を 1 つ配置
  • 背景色を変更
  • フォームのアイコンを設定

フォームオブジェクトインスペクタの Name プロパティの値を FormInDLL にします。[ファイル] [名前を付けて保存] でフォームを保存します。今回は FormInDLLUnit という名前で保存しています。保存先は、DLL のプロジェクトファイルと同じフォルダとします。

[Ctrl] + [F9] でプロジェクトをコンパイルします。その結果のファイルのリストが下図です。



図3
保存してコンパイルした結果
  • DLL が作成されている
  • SampleDLL.lpr がプロジェクトのファイル

フォームのユニットのコードを以下のようにします。これは、Button1 をクリックしたら、モーダル表示したこのフォームを閉じる処理です。その時の戻り値を mrOK とします。上書き保存しておきます。



リスト1
unit FormInDLLunit;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TFormInDLL }

  TFormInDLL = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private

  public

  end;

var
  FormInDLL: TFormInDLL;

implementation

{$R *.lfm}

{ TFormInDLL }

procedure TFormInDLL.Button1Click(Sender: TObject);
begin
  ModalResult:= mrOK;
end;

end.




02_DLL のコードを作成


この DLL は、フォームをモーダル表示する関数だけを実装します。
プロジェクトのコードを以下のようにします。uses 部のフォームのユニット名は、前項の操作で自動的に追加されています。
上書き保存して、[Ctrl] + [F9] でコンパイルします。これで DLL の作成は終了です。IDE を閉じます。



リスト2
library SampleDLL;

{$mode objfpc}{$H+}

uses
  Classes,
  Interfaces,
  Forms,
  LCLType,
  Windows,
  FormInDLLunit;

function FormShowModal(AppHandle: HWND): TModalResult; stdcall;
begin
  try
    EnableWindow(AppHandle, False);
    Result := FormInDLL.ShowModal;
  finally
    EnableWindow(AppHandle, True);
  end;
end;

exports
  FormShowModal;

initialization
  Application.Initialize;
  Application.CreateForm(TFormInDLL, FormInDLL);

finalization
  Application.terminate;
end.

begin
end.




03_DLL を使用するプログラムを作成して実行


Lazarus の IDE を起動したら、[プロジェクト] [新規プロジェクト] を選択します。起動したダイアログの左ペインから [アプリケーション] を選択します。
この操作は、プロジェクトの新規作成状態で Lazarus が起動している場合は必要ありません。 

フォームに TButton を 1 つ配置して、Unit1 のコードを、図の下のコードにします。

このプロジェクトを、[プロジェクト] [名前を付けてプロジェクトを保存] で、DLL のプロジェクトファイルと同じフォルダ内に保存します。保存したら [F9] でコンパイルして実行します。
下図が実行結果です。



図4
実行時の画面
  • [Button1] をクリック
  • DLL 内のフォームが表示される
  • [OK] ボタンをクリックすると閉じる

リスト3
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls,
  Windows, 
  LazUTF8;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private

  public

  end;

function FormShowModal(AHwnd: HWND): TModalResult; stdcall; external 'SampleDLL.dll';

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  LCaption : string;
begin
  if FormShowModal(Handle) = mrOK then begin
    LCaption := UTF8ToWinCP('結果');
    MessageBox(Handle, '[OK]', PChar(LCaption), MB_ICONINFORMATION);
  end;
end;

end.




04_既存のフォームを DLL のプロジェクトに追加する場合


DLL で表示するフォームとして、既存のフォームを使用する場合の手順です。下図のダイアログで設定します。このダイアログは、[プロジェクト] [プロジェクトインスペクタ] で起動します。
プロジェクト] [プロジェクトインスペクタは、Delphi のプロジェクト マネージャに相当します。
まずは、追加するファイルが、DLL のプロジェクトファイルがあるフォルダ内にあるものとします。

あらかじめ、使用するフォーム関係ファイル ( 拡張子が .lfm と .pas のファイル ) を、DLL のプロジェクトファイルがあるフォルダ内に置いておきます。
[追加] をクリックして、[ファイルシステムからファイルを追加] をクリックします。目的のフォームのユニットファイルを選択して追加します。



図5
フォームのユニットファイルの追加

次に LCL ( Lazarus component library ) を追加して LCL が利用できるようにします。LCL は、Delphi の VCL に相当します。
[追加] をクリックして、[新規の要求] をクリックすると、[新規の要求] のダイアログが表示されます。このリストから LCL を選択して [OK] ボタンでダイアログを閉じます。



図6
LCL の追加

以上の操作の結果、] [プロジェクトインスペクタ] の内容は下図のようになります。ダイアログを右上の [X] ボタンで閉じれば設定は終了です。
この設定をしても、プロジェクトのソースの uses 部には、フォームのユニット名は自動追加されません。手動で追加することになります。



図7
追加した結果

追加するファイルが、DLL のプロジェクトファイルがあるフォルダ以外の場所にある場合、ファイルを選択すると下図のダイアログが現れます。



図8
追加するファイルが、プロジェクファイルのフォルダ以外の場所にある場合

上のダイアログを [はい] で閉じると、uses 部に追加するユニット名にディレクトリ名がなくても、そのユニットが使用できます。
この検索パスの情報は、プロジェクトの設定ファイルである、プロジェクトセッションファイル (拡張子は .lps ) に書き込まれます。したがって、他のプロジェクトでは、この検索パスは無効です。


uses
  Classes,
  Interfaces,
  Forms,
  LCLType,
  Windows,
  FormInDLLunit;
  


上のダイアログを [いいえ] で閉じると、uses 部に追加するユニット名には、以下のようにディレクトリ名が必要になります。


uses
  Classes,
  Interfaces,
  Forms,
  LCLType,
  Windows,
  FormInDLLunit in '..\TestForms\FormInDLLUnit.pas';
  


ファイルの場所が変わった場合、[プロジェクトインスペクタ] を起動して、該当ファイルをプロジェクトから削除して、新たに追加します。