お知らせ

電子会議

ライブラリ

FDelphi サイト全文検索

Delphi FAQ一覧

サンプル蔵



FDelphi FAQ
15番会議室「FAQ編纂委員会」に寄せられた「よくある質問の答え」

[Q]
 ファイルの拡張子を自分のアプリケーションに関連付けする為にレジストリ を操作するコードを書きました。そこでレジストリと拡張子の絡みに興味を 持ったのですが、普通に関連付ける以外に何か出来ないものでしょうか。

[A]
 以下のような事なら簡単に出来るでしょう。

1. リソースから拡張子固有のアイコンを決める。

       データ格納先キーの下に「DefaultIcon」キーを作成して指定します。
      リソースを含むファイル(大抵はParamStr(0))をフルパスで指定し、
      カンマで区切ってアイコン番号を指定します。

2. コマンドラインオプションによって動作を変化させる。

       ビットマップファイルを右クリックして見てください。普通にMS
      ペイントをインストールしてあれば「開く」以外に「印刷」という
      メニューがあるはずです。これはMSペイント起動時に「/p」オプショ
      ンを付加して起動するモードです。その他HCWを使っている方なら*.cnt
      や*.hpjを右クリックすると「What's this?」メニューがあります。

       これをやるにはデータ格納先キーの「shell」の下に「open」以外の
      キーを作ります。その下の「command」キーでオプション付きコマンド
      ラインを指定します。

       当然アプリケーションにオプション処理コードが書かれていなければ
      なりません。

3. 新規作成メニューに件のファイルタイプを追加する。

      拡張子キーの下に「ShellNew」キーを作成してファイルを指定します。
      そこに「NullFile」と書いておけば空のファイルが新規作成されます。
[例]
----------------------------------------------------------------------

1. リソースから拡張子固有のアイコンを決める。

 HKEY_CLASSES_ROOT
             ├拡張子(例:「.ext」)←データ格納先指定
             │           (例:「ext_auto_file」)
             │
             └データ格納先(例:「ext_auto_file」)
                ├DefaultIcon←ここにアイコンリソースを含むファイル名
                └shell        とアイコン番号を書き込みます。
                    └open
                        └command

uses
    Registry;

...............

var
   Reg: TRegistry;
begin
     Reg:= TRegistry.create;
     with Reg do begin
          try
             RootKey:= HKEY_CLASSES_ROOT;

             OpenKey('.ext', true);
             WriteString('', 'ext_auto_file');
             CloseKey;

             OpenKey('ext_auto_file', true);
             WriteString('', '××ファイル');
             CloseKey;

//////////////////////////////////////////////////////////////////////
             OpenKey('ext_auto_file\DefaultIcon', true);
             WriteString('', ParamStr(0)+ ',6');
             CloseKey;
//////////////////////////////////////////////////////////////////////

             OpenKey('ext_auto_file\shell\open\command', true);
             WriteString('', ParamStr(0)+ ' "%1"');
             CloseKey;
          finally
             free;
          end;
     end;
end;

         アプリケーションの7番目のアイコンを拡張子「.ext」の
         表示用に指定します。(アイコン番号は0から数えます) 

----------------------------------------------------------------------

2. コマンドラインオプションによって動作を変化させる。

 上記「1」のケースに「印刷」メニューと「特殊加工」メニューを追加
します。それぞれのコマンドラインオプションは「-p」と「-s」とします。

             │
             └データ格納先
                └shell
                    ├print
                    │  └command
                    ├SpecialModify
                    │  └command
                    └open
                        └command

 finallyの前に以下のコードを挟みます。

             OpenKey('ext_auto_file\shell\print\command', true);
             WriteString('', ParamStr(0)+ ' -p "%1"');
             CloseKey;

             OpenKey('ext_auto_file\shell\SpcialModify', true);
             WriteString('', '特殊加工');
             CloseKey;

             OpenKey('ext_auto_file\shell\SpcialModify\command', true);
             WriteString('', ParamStr(0)+ ' -s "%1"');
             CloseKey;


 「印刷」の方は標準的なアクションなので特に文字列を指定しなくても
日本語WindowsがOSの仕事として「印刷」と表示してくれます。

 逆にSpecialModifyの方は上記のように表示用文字列を指定しないとそのまま
SpecialModifyと表示されてしまいます。

----------------------------------------------------------------------

3. 新規作成メニューに件のファイルタイプを追加する。

 上記「1」のソースの

             OpenKey('.ext', true);
             WriteString('', 'ext_auto_file');
             CloseKey;

                      の後ろあたりに以下のコードを挟みます。

             OpenKey('.ext\ShellNew',true);
             WriteString('NullFile', '');
             CloseKey;

        これで右クリック時の「新規作成」メニューに「新規××ファイル」が
       追加されます。これで作成されるのは0バイトファイルです。0バイ
       トファイルでない特定の中身(ヘッダなど)を持ったファイルを新規
       作成メニューに組み込みたい場合は以下のような操作が必要です。

              1--- 該当アプリにパスを通す。
              2--- OSフォルダのサブフォルダ「ShellNew」にテンプレート
                    ファイルを作成する。
              3--- 上記「NullFile」文字列書き込みの代わりに件のテンプ
                    レートファイル名をパス無しで指定する。

        ぐっと面倒になるので普通は0バイトファイルが読み込まれた場合
       の処理を追加して、上記のように新規作成はNullFileで済ますのが常
       道です。

----------------------------------------------------------------------


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum FDELPHIに寄せられる質問の中から、よくある質問への回答を FDELPHIのメンバーがまとめたものです。 したがって、これらの回答はボーランド株式会社がサポートする公式のものではなく、掲示されている内容についての問い合わせは受けられない場合があります。

Copyright 1996-1998 Delphi Users' ForumFAQ編纂委員会