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 |
| フォームを実装した DLL を Lazarus で作成 |
Lazarus で、フォームを実装した DLL を新規に作成する手順と、簡単なサンプル作成の記事です。 |
| 01_DLL を新規作成して新規作成のフォームを追加 |
IDE のメニューの [プロジェクト] から [新規プロジェクト] を選択します。下図のダイアログが起動します。このダイアログの左ペインの [ライブラリ] をダブルクリックするか、選択して [OK] ボタンで閉じると、新規の DLL 作成の状態になります。 |
 |
図1
DLL の新規作成
|
[プロジェクト] [名前を付けてプロジェクトを保存] で、SampleDLL.lpr という名前で、任意のフォルダに保存します。
次にフォームを作成します。
[ファイル] [新規フォーム] で作成します。
TButton1 を 1 つだけ配置します。下図では、DLL を使用する側のフォームと区別するために、フォームの背景色を変更しています。フォームのアイコンも変更しています。 |
 |
図2
フォーム設計時の画面
- TButton を 1 つ配置
- 背景色を変更
- フォームのアイコンを設定
|
フォームオブジェクトインスペクタの Name プロパティの値を FormInDLL にします。[ファイル] [名前を付けて保存] でフォームを保存します。今回は FormInDLLUnit という名前で保存しています。保存先は、DLL のプロジェクトファイルと同じフォルダとします。
[Ctrl] + [F9] でプロジェクトをコンパイルします。その結果のファイルのリストが下図です。
|
 |
図3
保存してコンパイルした結果
- DLL が作成されている
- SampleDLL.lpr がプロジェクトのファイル
|
フォームのユニットのコードを以下のようにします。これは、Button1 をクリックしたら、モーダル表示したこのフォームを閉じる処理です。その時の戻り値を mrOK とします。上書き保存しておきます。 |
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.
この DLL は、フォームをモーダル表示する関数だけを実装します。
プロジェクトのコードを以下のようにします。uses 部のフォームのユニット名は、前項の操作で自動的に追加されています。
上書き保存して、[Ctrl] + [F9] でコンパイルします。これで DLL の作成は終了です。IDE を閉じます。 |
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.
Lazarus の IDE を起動したら、[プロジェクト] [新規プロジェクト] を選択します。起動したダイアログの左ペインから [アプリケーション] を選択します。
この操作は、プロジェクトの新規作成状態で Lazarus が起動している場合は必要ありません。
フォームに TButton を 1 つ配置して、Unit1 のコードを、図の下のコードにします。
このプロジェクトを、[プロジェクト] [名前を付けてプロジェクトを保存] で、DLL のプロジェクトファイルと同じフォルダ内に保存します。保存したら [F9] でコンパイルして実行します。
下図が実行結果です。 |
 |
図4
実行時の画面
- [Button1] をクリック
- DLL 内のフォームが表示される
- [OK] ボタンをクリックすると閉じる
|
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';
ファイルの場所が変わった場合、[プロジェクトインスペクタ] を起動して、該当ファイルをプロジェクトから削除して、新たに追加します。 |
|