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)