コンポーネント用アイコンの作り方 (2005 以降)

 コンポーネントのアイコンは、コンポーネントリソースファイル (*.dcr) から抽出されます。最近の Delphi には "イメージエディタ (imagedit.exe)" が付属していないため、dcr の生成ができないかのように思えますが、実はできます。 コンポーネントのユニット名が MyComp.pas 、コンポーネントクラス名が TMyComponent だったとして話を進める事にします。

Delphi 2 以降共通で使えるやり方

  1. 24×24 で 16 色のアイコン用ビットマップ画像を用意します。名前は任意でいいのですが、ここでは TMyComponent.bmp とします。
     
  2. MyComp.rc というテキストファイルを用意し、以下のように記述します。
     
    TMYCOMPONENT BITMAP "TMYCOMPONENT.BMP"

    最初の TMYCOMPONENT は登録するコンポーネントクラス名と同じになります。ここはすべて大文字でなくてはなりません。一つのユニットに複数のコンポーネントクラスが存在する場合には同じように複数行記述して下さい。
     
  3. リソーススクリプトファイル (MyComp.rc) をリソースコンパイラ (BRCC32.EXE) でコンパイルします。
     
    $(BDS)\BIN\BRCC32.EXE -foMyComp.dcr MyComp.rc

Delphi 2005 以降専用のやり方

 Delphi 2005 以降のガリレオ IDE ではコンポーネントアイコンに 256 色を使う事ができ、大きさも 16×16 / 24×24 / 32×32 を使う事ができます。

  1. 16×16 / 24×24 / 32×32 で 256 色のアイコン用ビットマップ画像を 3 つ用意します。名前は任意でいいのですが、ここでは TMyComponent16.bmp / TMyComponent24.bmp / TMyComponent32.bmpとします。
     
  2. MyComp.rc というテキストファイルを用意し、以下のように記述します。
     
    TMYCOMPONENT   BITMAP "TMYCOMPONENT24.BMP"
    TMYCOMPONENT16 BITMAP "TMYCOMPONENT16.BMP"
    TMYCOMPONENT32 BITMAP "TMYCOMPONENT32.BMP"

    24×24 が標準のアイコンサイズ (中アイコン) なので、中アイコン (24×24) 用のリソース名はコンポーネントクラス名と同じになります。小アイコン (16×16) 用は "コンポーネントクラス名+16"大アイコン (32×32) 用は "コンポーネントクラス名+32" という名前にします。
     
  3. リソーススクリプトファイル (MyComp.rc) をリソースコンパイラ (BRCC32.EXE) でコンパイルします。
     
    $(BDS)\BIN\BRCC32.EXE -foMyComp.dcr MyComp.rc

XN Resource Editor 3.0.0.1 [ja] によるコンポーネントアイコンの作り方

 以下の手順は、XN Resource Editor を使ってガリレオ IDE 専用のコンポーネントアイコンリソース (*.dcr) を作る方法です。
  1. XN Resource Editor を起動します。
  2. [リソース | コンポーネントアイコンウィザード] を選択します。

  3. コンポーネントアイコンウィザードが起動しますので、種類はそのままにして、コンポーネントクラス名を入力します。

    コンポーネントクラス名は自動的に大文字になります。
  4. 24×24 / 16×16 / 32×32 の 256 色 Bitmap が 3 つ登録されました。
  5. ペイントブラシに、アイコンより大きめのサイズの画像 (32×32 またはそれ以上) を用意します。

    サイズは問いませんが、256 色の画像を用意する事をオススメします。
  6. ペイントブラシで 全選択 (Ctrl+A) して、コピー (Ctrl+C) します。
  7. XN Resource Editor に貼り付け (Ctrl+V) ます。

    画像は自動的にリサイズ / 減色されます。
    XN Resource Editor からは選択範囲をコピーできます。画像のすべてをクリップボードにコピーしたい場合には 全選択 (Ctrl+A) して、コピー (Ctrl+C) します。
  8. 24×24 アイコンができたので、同様に 16×16 / 32×32 にも貼り付け (Ctrl+V) ます。
  9.   
  10. 名前を付けて保存 (*.dcr) すれば出来上がりです。

    名前はデフォルトで "最初にウィザードで登録したコンポーネントクラス名.dcr" になりますが、"コンポーネントクラスを宣言するユニットと同じ基本名.dcr" にして保存してください。
 コンポーネントアイコンウィザードは、コンポーネントクラス名を元に、アイコンリソースのテンプレートを生成します。新 IDE (Delphi 2005 以降) 用の場合、  旧 IDE (Delphi 7 以前) 用の場合、  そして、新旧両用の場合には、  のテンプレートが生成されます。新旧両用のアイコンは、~16 と ~32 のリソースが含まれるため、新 IDE でも大きなアイコン/小さなアイコンがキレイに見えます。但し、色数が 16 に制限されます。このコンポーネントアイコンリソースを旧 IDE に登録した場合、~16 と ~32 のアイコンは無視されます。

 旧アイコン / 新旧アイコンを作る際には、用意する元となる画像をあらかじめ 16 色に減色しておく事をオススメします。

参考資料


IDE に登録したコンポーネントのアイコンが△□○になってしまう場合には? (2005 以降)

 何かのはずみで、IDE に登録したコンポーネントのアイコンが "" になってしまう事があります。

そもそもアイコンは正常なのか?

 "コンポーネント用アイコンの作り方 (2005 以降)" を参考に、アイコンファイルを再生成してみましょう。

古いリソースが含まれないようにパッケージを構成してみる

 アイコンリソースは

  1. コンポーネントリソースファイル (*.DCR)
  2. コンパイル済ユニット (*.DCU)
  3. コンパイル済パッケージ (*.BPL)

 このように引き継がれますので、

  1. 事前に *.dproj を削除し、*.dpk を開く。
  2. プロジェクトマネージャで右クリック->アンインストール
  3. 念のために、アイコンが変化しないユニットを開き、無意味な改行を入力するなりしてユニットを保存
  4. 念のために、コンポーネントのユニット名と同じ *.dcu を削除
  5. プロジェクトマネージャで右クリック->クリーンアップ
  6. プロジェクトマネージャで右クリック->ビルド
  7. プロジェクトマネージャで右クリック->インストール

 パッケージを上記手順で再インストールしてみましょう。

パッケージにアイコンが含まれているのか調べてみる

 コンポーネントが含まれるパッケージ(*.BPL)を 任意のリソースエディタで開いてみましょう (拡張子を "DLL" にリネームすると、大抵のリソースエディタで開けます)。アイコンファイルは存在しますか?

 存在するのにアイコンが表示されない場合は、アイコンのキャッシュが更新されていない可能性があります。Delphi を -nocache オプション付きで起動するか、次項の方法でアイコンキャッシュを再生成してみましょう。

アイコンキャッシュを再生成

 アイコンキャッシュの生成先は以下のレジストリエントリに格納されています。

バージョン レジストリエントリ
Delphi 2005 [HKEY_CURRENT_USER\Software\Borland\BDS\3.0\Palette]
BDS 2006 / Turbo Delphi 2006 [HKEY_CURRENT_USER\Software\Borland\BDS\4.0\Palette]
Delphi 2007 [HKEY_CURRENT_USER\Software\Borland\BDS\5.0\Palette]
Delphi 2009 [HKEY_CURRENT_USER\Software\CodeGear\BDS\6.0\Palette]
Delphi 2010 [HKEY_CURRENT_USER\Software\CodeGear\BDS\7.0\Palette]
Delphi XE [HKEY_CURRENT_USER\Software\Embarcadero\BDS\8.0\Palette]
Delphi XE2 [HKEY_CURRENT_USER\Software\Embarcadero\BDS\9.0\Palette]
Delphi XE3 [HKEY_CURRENT_USER\Software\Embarcadero\BDS\10.0\Palette]
Delphi XE4 [HKEY_CURRENT_USER\Software\Embarcadero\BDS\11.0\Palette]
Delphi XE5 [HKEY_CURRENT_USER\Software\Embarcadero\BDS\12.0\Palette]
Delphi XE6 [HKEY_CURRENT_USER\Software\Embarcadero\BDS\14.0\Palette]
Delphi XE7 [HKEY_CURRENT_USER\Software\Embarcadero\BDS\15.0\Palette]

 アイコンキャッシュを再生成する手順は以下の通りです。

  1. 事前に上記レジストリのバックアップを取っておく
  2. 問題の出る Delphi のバージョンのレジストリエントリを削除する
  3. Delphi を起動
  4. [ファイル | 新規作成 | VCL フォームアプリケーション]
  5. [表示 | ツールパレット]
  6. ツールパレットを右クリック -> プロパティ
  7. 表示->"ボタンの大きさ" で "小(S)" にチェックを入れて OK ボタンを押下。
  8. "中(M)" / "大(L)" も同様に繰り返し
  9. Delphi を再起動

 アイコンは正しく表示されましたか?


Unicode な文字列リソースを含んだリソースファイルを作るには? (2009 以降)

 えー?ResourceString で定数を定義しちゃいかんの?

BRCC32 は...?

 リソースファイルを作るには リソースコンパイラ (BRCC32.EXE) を使い...たいところですが、"BRCC32.EXE は Unicode に対応していません"。ではどうするのかと言うと...

リソースコンパイラ

 Delphi 2009 以降 に含まれるリソースコンパイラは以下のようになっています。

リソースコンパイラ リソースコンパイラ/バインダ
Borland Resource Compiler
BRCC32.EXE
Borland Resource Compiler / Binder
BRC32.EXE
Microsoft Windows Resource Compiler
RC.EXE
CodeGear Resource Compiler / Binder
CGRC.EXE

 "リソースコンパイラ" はリソーススクリプトをコンパイルするものですね。"リソースコンパイラ/バインダ" というのは、"リソーススクリプトをコンパイルもするけど、EXE にリソースを埋め込んじゃったりもできるよ" というツールです。

CGRC.EXE

 Unicode な文字列リソースを含んだリソースファイルを作るにはリソーススクリプトファイルを CGRC.EXE でコンパイルします。

 Microsoft 社の リソースコンパイラ (RC.EXE) に慣れている方は、そのまま RC.EXE を使えばいいのですが、BRCC32.EXE を使っていた方は CGRC.EXE を使うと便利です。CGRC.EXE のリソースコンパイラ部分は RC.EXE が担っていますが、RC.EXE のコマンドラインスイッチは BRCC32.EXE と異なります。CGRC.EXE を使う事によって、RC.EXE を BRCC32.EXE 互換のスイッチで利用できるのです。

 リソーススクリプトファイル "test.rc" を単純に "CGRC.EXE test.rc" としてコンパイルすると、"test.res" が生成されます。

リソーススクリプトファイルの書き方

 文字列リソースをリソーススクリプトファイルに記述してみましょう。

#define IDS_STRING1     1

STRINGTABLE
BEGIN
  IDS_STRING1  "あいう"
END

 文字エンコーディングは Shift-JIS で保存します。このままだと、ANSI な文字列リソースになってしまいます。

#define IDS_STRING1     1

STRINGTABLE
BEGIN
  IDS_STRING1  L"あいう"
END

 C++ みたいですね。このように、リテラルを "L" 付きで表記するとリソーススクリプトファイル (*.rc) の文字エンコーディングが ANSI であっても、WideString な文字列リソースになります。

#define IDS_STRING1     1

STRINGTABLE
BEGIN
  IDS_STRING1  L"\xD842\xDFB7野屋"
END

 このように、"\x(16進4桁)" で、WideChar を表す事もできます。リソーススクリプトファイル (*.rc) の文字エンコーディングが ANSI であっても、Unicode (UTF-16) の文字を表現できる訳です。サロゲートペアも2組の WideChar で表せます。

#define IDS_STRING1     1

STRINGTABLE
BEGIN
  IDS_STRING1  L"𠮷野屋"
END

 リソーススクリプトファイル (*.rc) を UTF-16 で保存すると、サロゲートペアも直接記述できます...まぁ、Delphi のコードエディタが UTF-16 に対応していない ので、サロゲートペアを 16 進表記するか、UTF-8 で保存 するべきでしょう。

その他

 なお、リソーススクリプトファイル (*.rc) を UTF-16 / UTF-8 で保存すると、リテラルを "L" 付きで表記しなくても、Unicode (UTF-16) の文字列リソースになるようですが、間違いが起きる可能性があるので、明示的に "L" の指定をした方がいいと思います。

 ANSI と Unicode (UTF-16) の文字列リソースを混在させるには、リソーススクリプトファイル (*.rc) を ANSI で保存した上で、Unicode はリテラルを "L" 付きで表記、ANSI は "L" なしで表記する事で実現可能です。

 STRINGTABLE は C++ で言う所の t_char なので、リテラルの型として "u8" とか "u" とか "U" とかは使えません...C++0x じゃないんだから。

参考資料


Delphi 起動時に渡せるスイッチは?

 この Tips のあちこちに書いてしまったのでまとめてみます。

スイッチ 説明
-ns スプラッシュを表示しない
-np プロジェクトをロードしない
-ppersonality パーソナリティを指定して起動
-rregkey 代替レジストリキーを利用して起動
-nocache キャッシュを利用せずに起動

 -p は、"BDS.EXE -pDelphi" のように指定すると、RAD Studio ではなく Delphi を単体で起動します。これにより、不要なパッケージをロードしなくなるので、起動時間を短縮する事ができます。

 -r は、異なるパッケージや設定を持つ複数の環境を、コンフリクトさせる事なく同時に利用 するのに使います。

 例えば、単純に "BDS.EXE -rTESTREG" とすれば、

バージョン レジストリエントリ
2007 [HKEY_CURRENT_USER\Software\Borland\TESTREG\5.0]
2009 [HKEY_CURRENT_USER\Software\Codegear\TESTREG\6.0]
2010 [HKEY_CURRENT_USER\Software\Codegear\TESTREG\7.0]
XE [HKEY_CURRENT_USER\Software\Embarcadero\TESTREG\8.0]
XE2 [HKEY_CURRENT_USER\Software\Embarcadero\TESTREG\9.0]
XE3 [HKEY_CURRENT_USER\Software\Embarcadero\TESTREG\10.0]
XE4 [HKEY_CURRENT_USER\Software\Embarcadero\TESTREG\11.0]
XE5 [HKEY_CURRENT_USER\Software\Embarcadero\TESTREG\12.0]
XE6 [HKEY_CURRENT_USER\Software\Embarcadero\TESTREG\14.0]
XE7 [HKEY_CURRENT_USER\Software\Embarcadero\TESTREG\15.0]

 にレジストリのコピーが作られた後に IDE が起動します。事前にレジストリの複製を作る必要はありません。

 -nocache は、キャッシュを利用せずに起動しますが、キャッシュとはツールパレットアイコンのキャッシュを指すのか、他にも影響されるキャッシュがあるのかは不明です。

参考資料


日本語用に使えるコードページは?

 日本語が使えるコードページの一覧です。

コードページ 名称 説明
932 shift_jis Windows の SHIFT-JIS です。Microsoft 独自の SHIFT-JIS なので、他 OS とは互換性のない文字もあります。
10001 x-mac-japanese Mac の SHIFT-JIS です。Apple 独自の SHIFT-JIS なので、他 OS とは互換性のない文字もあります。
20290 IBM290 / x-EBCDIC-JapaneseKatakana IBM の 日本語 EBCDIC (カタカナ拡張) です。
20932 EUC-JP EUC-JP です。Microsoft 独自の EUC-JP なので、他 OS とは互換性のない文字もあります。eucJP-ms ではありません
50220 iso-2022-jp JIS-CODE です。ISO-2022-JP と言ったら普通はこの実装です。全角文字や半角文字に変化した場合に3バイトのエスケープが発生し、半角カナは存在しません (他コードページの半角カナは全角カナに変換されます)。
50221 csISO2022JP JIS-CODE です。全角文字や半角文字、半角カナに変化した場合に3バイトのエスケープが発生し、半角カナはエスケープシーケンスでエスケープされます。
50222 iso-2022-jp JIS-CODE です。全角文字や半角文字に変化した場合に3バイトのエスケープが発生し、半角カナは<SI>/<SO>でエスケープされます。
51932 EUC-JP EUC-JP です。Microsoft 独自の EUC-JP なので、他 OS とは互換性のない文字もあります。IE で使われている EUC-JP です。<!> TEncoding には指定できません <!>
65000 utf-7 UTF-7 (Unicode) です。CP_UTF7 という定数が用意されています。
65001 utf-8 UTF-8 (Unicode) です。CP_UTF8 という定数が用意されています。

 "TEncoding に使えないコードページ" は、mlang.dll にある ConvertINetMultiByteToUnicode() / ConvertINetUnicodeToMultiByte() を利用します。 面倒な場合は、MECSUtilsConvertMultiByteToUnicode() / ConvertUnicodeToMultiByte() を使ってみて下さい。

   理由がよく解らないのですが、

 は、使えそうで使えません。

参考資料


状況依存ヘルプ (F1 ヘルプ) をアプリケーションに組み込むには? (2005 以降)

WinHelp32 (*.hlp) を状況依存ヘルプ (F1 ヘルプ) として使う場合

 uses に WinHelpViewer を追加します。

uses
  ..., WinHelpViewer;

HTML-Help (*.chm) を状況依存ヘルプ (F1 ヘルプ) として使う場合

 uses に HTMLHelpViewer を追加します。

uses
  ..., HTMLHelpViewer;

 後は、

 等を設定するだけですが、もちろん *.hlp や *.chm は自前で用意する必要があります。

 HTML-Help (*.chm) を作る際には html の文字コードを SHIFT-JIS にする必要があります。html だからと、UTF-8 等を使ってしまうと文字化けを起こしてしまいます。

参考資料


紙のマニュアルが欲しい (2007 以降)

 http://docs.embarcadero.com/products/rad_studio/ に PDF がありますので、それを印刷しましょう。

 中身はオンラインヘルプとは異なっており、旧来の分厚いマニュアルっぽい構成になっています。Common にはオンラインヘルプに書かれていない情報 (または書かれていても見つけにくい情報) がありますので、余裕のある方は両面印刷して眺めて見る事をオススメします。

 Delphi 2009 のマニュアルを印刷した場合の費用を概算で見積ってみます。

内容 ページ数 説明
BlackfishSQL 151
Generic Collections 164
Common 1,304 言語ガイドが含まれる
Win32 2,742 コンポーネント開発者ガイド、データベースアプリケーション開発者ガイドが含まれる
VCL 30,974
合計 35,335

 このボリュームですから、チューブファイルに綴じることになります。コピー用紙は "1 枚 = 0.01mm" と考えるといいので、両面印刷した場合、80mm サイズのチューブファイルには 1,600 ページが収まる事になります。

内容 枚数 用紙価格 チューブファイル ファイル価格
BlackfishSQL + Generic Collections 158 127円 20mm(200枚)×1 504円 631円
Common 652 522円 80mm(800枚)×1 819円 1,341円
Win32 1,371 1,097円 80mm(800枚)×2 1,638円 2,735円
VCL 15,487 12,390円 100mm(1,000枚)×15, 50mm(500枚)×1 14,741円 27,131円
合計 17,668 14,136円 17,702円 31,831円

 コピー用紙はピンキリなので、"A4用紙1枚=0.8円" の計算で、チューブファイルは Amazon の価格です。上記表は稟議書等の申請書の目安としてお使い下さい。

 総額で幾らかかるのでしょうね(^^;A なお棚等に収納するには、幅合計 2,130mm が必要となります。

 VCL を除けば、

 トナー代等を考慮しなければ 5,000円 程度で済む事になりますね。この時の棚収納サイズは幅合計 288mm となります。


 BACK