ResourceWorkshopで作成したリソースを使用する
DelphiではRAD環境を活かして簡単にフォームをデザインしてプログラムすることが出来ます。でもリソースエディタを使用して作成したリソースファイルを使用した(昔のスタイルの)プログラムも可能になっています。更にDelphi5ではリソースエディタとしてRsourceWorkshopが付属しているため、リソースの編集を行なうことも出来るようになりました。Delphi4迄にはこのResourceWorkshopは付属していませんが、もしBorlandC++4J,4.5Jを持っていれば、それに付属しているものを使用することが出来ます(Delphi5付属のものもそうですが、環境設定でターゲットWindowsバージョンにWin32を選択して下さい)。
ここではResourceWorkshopを使用して作成したダイアログリソースを用いた簡単なサンプルを紹介します。この様な場合のプログラムは、Delphiのお気楽プログラムとはかけ離れたWindowsAPIを用いた面倒なものになりますので、Delphiに付属している日本語版Win32ヘルプファイル(api32wh.hlp)を参照してみてください。
(*
ResourceWorkshopで作ったダイアログボックスで遊ぶ
この方法を使用すれば、サイズの小さなインストールプログラムを
つくることも可能?
*)
program test1;
uses
Windows,
Messages,
SysUtils, // このユニットはStrCat()を使用するために
ShlObj; // このユニットはSHxxx()を使用するために使用します。
// プロジェクトリソース
{$R test1.RES}
// ResourceWorkshopで作ったリソースをインクルードする
{$R test.res}
// もし一つのフォルダにプロジェクトが一つしかないのであれば、
// ResourceWorkshopで作ったリソースも一緒に{$R *.RES}で
// インクルードしたほうが簡単
const
AppName = 'Test1';
// フォルダの参照ダイアログを開く
// このダイアログを表示させるためにはコールバック関数が必要だった
// 様な気がするが、これだけで動作する。私の勘違いかな?
function BrowseFolder(hWnd: THandle): string;
var
BI: TBrowseInfo;
IDList: PItemIDList;
Dir: Array [0..Max_Path] Of Char;
begin
Result := '';
FillChar(BI, SizeOf(BI), 0);
BI.hwndOwner := hWnd;
BI.lpfn := nil;
BI.lpszTitle := PChar('インストール先の指定');
BI.pidlRoot := nil;
BI.ulFlags := BIF_RETURNONLYFSDIRS;
IDList := SHBrowseForFolder(BI);
If IDList <> nil then
begin
SHGetPathFromIDList(IDList, Dir);
Result := String(Dir);
end;
end;
// ダイアログボックスのメッセージを処理する
function DlgProc(hDlg: THandle; Mess: UINT; wPar:WPARAM;
lPar:LPARAM): integer; stdcall;
var
buff: array[0..512] of char;
chkd: array[0..20] of char;
Dir: string;
begin
case Mess of
// ダイアログボックスを表示するときに呼ばれる
WM_INITDIALOG: // api32wh.hlpを参照
begin
SetDlgItemText(hDlg, 101, PChar('TestDialog')); // api32wh.hlpを参照
CheckDlgButton(hDlg, 103, 1); // api32wh.hlpを参照
end;
// システムコマンドを処理する
WM_SYSCOMMAND: // api32wh.hlpを参照
if wPar = SC_CLOSE then
begin
// ダイアログボックスの×ボタンが押されたので閉じる
EndDialog(hDlg, -1); // api32wh.hlpを参照
Result := -1;
Exit;
end else begin
Result := 0;
Exit;
end;
// ダイアログ上のコントロールからのメッセージを処理する
WM_COMMAND: // api32wh.hlpを参照
case wPar of
IDOK: // OKボタンが押された(ID=1)
begin
GetDlgItemText(hDlg, 101, buff, SizeOf(buff)); // api32wh.hlpを参照
if IsDlgButtonChecked(hDlg, 103) = 1 then // api32wh.hlpを参照
chkd := 'チェックされている'
else
chkd := 'チェックされていない';
StrCat(buff, PChar(#13#10));
StrCat(buff, chkd);
// メッセージボックスを表示
MessageBox(hDlg, buff, PChar('結果'), 0); // api32wh.hlpを参照
// ダイアログボックスを閉じる
EndDialog(hDlg, -1); // api32wh.hlpを参照
Result := -1;
Exit;
end;
102: // ResourceWorkshopでつけたID ここでは'参照'ボタン
begin
Dir := BrowseFolder(hDlg);
if Dir <> '' then
SetDlgItemText(hDlg, 101, PChar(Dir)); // api32wh.hlpを参照
end;
end;
end;
Result := 0;
end;
// ----- WinMain -----
function WinMain(hThisInst, hPrevInst: THandle; lpArgs: pChar; cmdShow: Integer):
Integer; stdcall;
begin
// ダイアログボックスを表示する
// 'DIALOG_1'はResourceWorkShopでのダイアログボックスのID
DialogBox(hThisInst, PChar('DIALOG_1'), hThisInst, @DlgProc); // api32wh.hlpを参照
// 警告が出るので取り敢えずリターンコードに0をセットする
Result := 0;
end;
{エントリーポイント}
begin
WinMain(hInstance, 0, nil, SW_SHOWDEFAULT);
end.
このプログラムはファイルサイズが38kbしかありません。Delphiの通常のプログラムサイズと比べるとはるかに小さいですね。
この手法を用いれば、サイズの小さい簡単なインストールプログラム等を作成することが出来そうです。
サンプルには上記のソースとリソースファイル,実行ファイルが含まれます。
サンプルをダウンロードする(24,354byte)