TDatulaPluginクラスは、Datula 1.51.08.01現在のPlugin API仕様に基づいてDelphi 5でプラグインを簡単に作れるようにするための簡易ラッパーです。
2001-2-24 戀塚
Delphi5で新規作成 - ダイナミックリンクライブラリ をします。
プロジェクトに追加で、本パッケージの DatulaApi.pasと DatulaPlugin.pasを追加します。
次に、新規作成 - ユニット で、メインユニットを作りましょう。
メインユニットでは、Interfaceで Uses DatulaPlugin; を追加し、TDatulaPluginを派生してプラグイン実装クラスを作成してください。また必ずunit初期化コードとしてそのユニットファイルの末尾に
Bbegin PluginMain := あなたの作ったクラス名.Create; End.
を追加してください(このことから分かるように、ひとつのDLLに記述できるプラグインは一個だけです)。
TDatulaPluginの宣言は以下のようになっています。以下の注意に従って派生してください。
TDatulaPlugin = class
private
FTitle: string;
FAuthor: string;
FVersion: string;
FVersionNum: cardinal;
public
constructor Create( title, author, version: string; versionnum: cardinal );
function InitSuccess: boolean; virtual;
function CanExit: boolean; virtual;
procedure OnUpdateView; virtual;
procedure OnActivate(hWnd: THandle; nState: Cardinal; bMinimized: boolean); virtual;
procedure OnNewPostmanInstance(hWnd: THandle); virtual;
procedure OnDeletePostmanInstance(hWnd: THandle); virtual;
end;
派生したコンストラクタから、必ず inherited Create(.....)として呼び出してください。
title, author, version は、Datulaの プラグイン - 一覧 で表示される文字列になります。
versionnum は、$01000000 が 1.0.0.0 になるような数値として与えます。
コンストラクタで初期化に成功したかどうかを得るために呼ばれます。
派生しなければ、常に true (=成功) が返されます。
ここでfalseを返すと、初期化に失敗したとしてプラグインが無効になります。
プラグインをアンロードしてよいかどうかを問合せるために呼ばれます。
派生しなければ、常に true (アンロードしてよい) が返されます。
ここで falseを返すと、アンロードを中止することができます。何らかの作業中のときなどに falseを返すようにしましょう。
ビューアペインの内容が更新されるときに呼び出されます。
本文やヘッダの内容に応じた処理をしたいときは、ここで記述しましょう。
DatulaApiユニットにある GetHeaderText と GetBodyText を使えば、新しいヘッダとボディの生データが string で得られます。
なお、メッセージが更新されるときは従来のメッセージ表示が終了した通知としてか、まず空のメッセージとして OnUpdateView が呼ばれた後、次に新しいメッセージとして OnUpdateViewが呼ばれるようです。
派生しなければ何もしません。
本体やPostmanがアクティブになったり非アクティブになった場合などに呼び出されます。
nState には、以下のいずれかが渡されます。
bMinimized は、trueならば最小化されています。
メモ:本体とPostmanのどちらから呼ばれたのかを判定するには、DatulaApi.GetMainWindow をして得られたinfoのframeWndとhWndが一致したら本体、と判断できます。
新しいPostmanが起動したときに呼び出されます。
派生しなければ何もしません。
Postmanのインスタンスが一つ閉じられたときに呼び出されます。
派生しなければ何もしません。
Datula API (DatulaApi.pas) は以下のように変換してあります。詳しくは正式なDatula SDKを参照してください。
TPLUGININFO = record sizeofStruct: cardinal; // size_t title: array[0..63] of char; version: array[0..15] of char; author: array[0..31] of char; end; PPLUGININFO = ^TPLUGININFO; TMainWindowInfo = record
frameWnd, folderTree, focusBox, messageList, headerPane, viewer: THandle;
end; TPostmanWindowInfo = record
signatureBox, attachmentBox, languageBox, editorView, attachmentView, signatureView: THandle;
end; TFHandler = procedure;
function AppendMenu(item: PChar; handler: TFHandler): boolean;
procedure DeleteMenu(handler: TFHandler);
procedure GetMainWindow(var info: TMainWindowInfo );
function GetPostmanWindow(frameWnd: THandle; var info:TPostmanWindowInfo):
boolean;
function GetHeaderText: string;
function GetBodyText: string;
procedure RegisterPluginInfo(hInstance:THandle; const info:TPLUGININFO
);
function GetVersion: cardinal;
ダイナミックリンクライブラリとして作成したメインモジュールのコメントには uses ShareMem; についての言及がありますが、これを使うとアンロードのときにアプリケーションエラーが出ますので、デフォルトのままにしましょう(笑)
試しに付属のサンプルを作成してみましょう。
あとはこれを元にいろいろと書き換えてみると良いでしょう。
2001-02-24 0.00 最初
2001-02-25 0.01 サンプルつけた
2001-02-25 0.02 サンプルまちがってた