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';
  


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