2026/01/16(金) [n年前の日記]
#1 [delphi] Delphiでリソースファイルの追加
Windows11 x64 25H2 + Delphi 12 でスクリーンセーバを作ろうとしているけれど、そのまま何もしないと、「スクリーンセーバの変更」ウインドウのリスト上にはファイル名が表示されてしまう。表示されるスクリーンセーバ名を指定したい。
_スクリーンセーバーを作ったが、名前を設定できずにファイル名になってしまう
リソースファイルを埋め込めば任意の名前を指定できるらしい。
コンパイルすれば .rc が .res に変換されて .exe に内包されるらしい。
また、ソース中の最初のあたりに、以下の一文が増えていた。myresources.rc から myresources.res を作成してリソースとして組み込め、という指定なのではないかな…。
.rc ファイルに書いた内容は以下。
前述のページによると、スクリーンセーバを作る場合は以下の条件を満たすファイル名にしたほうがいいらしい。
例えば、ファイル名が「SSHOGEPI.SCR」なら、スクリーンセーバ変更ウインドウのリスト上では「Hogepi」という名前で表示される。最初の「SS」は省略して表示される。
ただ、Windows11 x64 25H2上では、SSWrapDp.scr というファイル名でも ―― 8文字に収まってるが大文字小文字が混在してるファイル名でも、中のリソースを読み込んで、リストにその名前を出してくれた。
_スクリーンセーバーを作ったが、名前を設定できずにファイル名になってしまう
リソースファイルを埋め込めば任意の名前を指定できるらしい。
- プロジェクトフォルダ内に、myresource.rc というテキストファイル(リソーススクリプトファイル?)を作成。
- 中身をテキストで書く。
- プロジェクト → プロジェクトに追加。
- ファイル種類を「リソースファイル (.rc)」にして、myresources.rc を開く。
コンパイルすれば .rc が .res に変換されて .exe に内包されるらしい。
また、ソース中の最初のあたりに、以下の一文が増えていた。myresources.rc から myresources.res を作成してリソースとして組み込め、という指定なのではないかな…。
{$R 'myresources.res' 'myresources.rc'}
.rc ファイルに書いた内容は以下。
STRINGTABLE PRELOAD DISCARDABLE BEGIN 1 "スクリーンセーバ名" END
前述のページによると、スクリーンセーバを作る場合は以下の条件を満たすファイル名にしたほうがいいらしい。
- 8文字+拡張子3文字。
- 8文字は全部大文字。
- 拡張子は .scr。
- 最初の2文字を「SS」にする。この2文字は、スクリーンセーバ変更ウインドウ上では消えてくれる。
例えば、ファイル名が「SSHOGEPI.SCR」なら、スクリーンセーバ変更ウインドウのリスト上では「Hogepi」という名前で表示される。最初の「SS」は省略して表示される。
ただ、Windows11 x64 25H2上では、SSWrapDp.scr というファイル名でも ―― 8文字に収まってるが大文字小文字が混在してるファイル名でも、中のリソースを読み込んで、リストにその名前を出してくれた。
◎ 書いてる内容の意味 :
.rc に書いたテキストはどういう意味を持つのか少し調べた。
STRINGTABLE は文字列テーブルがここから書かれているよ、という記述だろうし、BEGIN - END は、ここからここまでが文字列テーブルだよ、という記述だろう。しかし、1 は何…?
_第128章 スクリーンセーバー その2
_winsdk-10/Include/10.0.16299.0/um/ScrnSave.h at master - tpn/winsdk-10
_リソースの作成 (mixi 日記アーカイブ)
_mieki256's diary - Windows用スクリーンセーバの作り方をまだもうちょっと調べてる
C/C++でスクリーンセーバを書く場合も .rcファイルにスクリーンセーバ名を書いておくのだけど、scrnsave.h の中で定義されている IDS_DESCRIPTION で指定された文字列がスクリーンセーバ名を示す、ということになっているらしい。ScrnSave.h のコメントで以下が書かれてる。
そして、IDS_DESCRIPTION は以下の数値が定義されている。
つまり、Delphi でスクリーンセーバを作る時も、.rc の中でIDが1になってる文字列を指定しておけば、それがスクリーンセーバ名として反映される、ということだろう…。
ただ、idsAppName という定義もあるようで…。そちらを指定するとスクリーンセーバ名になると解説してるページも見かけた…。
AIに尋ねてみたら以下の返答を出してきた。
レジストリキー名、ウインドウクラス名、エラーメッセージタイトル等で使われるのが idsAppName。とAIが言っている。
よく分からんけどスクリーンセーバ名を指定したいだけなら、IDS_DESCRIPTION (=1) だけを指定しておけばいいのかもしれない。
STRINGTABLE は文字列テーブルがここから書かれているよ、という記述だろうし、BEGIN - END は、ここからここまでが文字列テーブルだよ、という記述だろう。しかし、1 は何…?
_第128章 スクリーンセーバー その2
_winsdk-10/Include/10.0.16299.0/um/ScrnSave.h at master - tpn/winsdk-10
_リソースの作成 (mixi 日記アーカイブ)
_mieki256's diary - Windows用スクリーンセーバの作り方をまだもうちょっと調べてる
C/C++でスクリーンセーバを書く場合も .rcファイルにスクリーンセーバ名を書いておくのだけど、scrnsave.h の中で定義されている IDS_DESCRIPTION で指定された文字列がスクリーンセーバ名を示す、ということになっているらしい。ScrnSave.h のコメントで以下が書かれてる。
This string should contain a less than 25 char name/description of the screen saver. This string is what will be seen by the user in the Control Panel's Desktop applet screen saver listbox. この文字列には、スクリーンセーバーの名前/説明(25文字未満)を含める必要があります。 この文字列は、コントロールパネルのデスクトップアプレットのスクリーンセーバーリストボックスに表示されます。
そして、IDS_DESCRIPTION は以下の数値が定義されている。
#define IDS_DESCRIPTION 1
つまり、Delphi でスクリーンセーバを作る時も、.rc の中でIDが1になってる文字列を指定しておけば、それがスクリーンセーバ名として反映される、ということだろう…。
ただ、idsAppName という定義もあるようで…。そちらを指定するとスクリーンセーバ名になると解説してるページも見かけた…。
AIに尋ねてみたら以下の返答を出してきた。
`scrnsave.h` を使用してスクリーンセーバーを開発する場合、
`IDS_DESCRIPTION` と `idsAppName` はどちらも文字列リソースですが、
その役割と「誰が参照するか」が明確に異なります。
結論から言うと、`IDS_DESCRIPTION` は「外向き(設定画面用)」、
`idsAppName` は「内向き(プログラムの管理用)」の名前です。
レジストリキー名、ウインドウクラス名、エラーメッセージタイトル等で使われるのが idsAppName。とAIが言っている。
よく分からんけどスクリーンセーバ名を指定したいだけなら、IDS_DESCRIPTION (=1) だけを指定しておけばいいのかもしれない。
[ ツッコむ ]
以上です。