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