Macintosh Programming (12) - プレファレンス -		2000.Nov.

1. それって何?
 初期設定ファイル。Windowsで言う.iniとかレジストリの設定値。です。

	ソースはここ、wsize.lzh.bin 5,120 byte

 古代なDOSプログラムでは実行ファイルそのものを動的に書き換えてユーザ設定を
 記憶する。とかいう代物もありましたが。

 って、本当です。作ったことのある本人が言うんですから間違いない。DOS用な
 *.comプログラムで、実行する度にファイルスタンプが更新されるとゆー、
 今ならウイルスチェッカに真っ先に疑われるような奴。どーしてそんなことを
 したかと言うと、設定ファイルを別に作るとHDDがもったいない。とゆー、
 貧乏根性のなせる技(笑)
 初期設定ファイルを作るとそれだけで4Kは喰われる。それだったら実行ファイル
 自身を書き換えれば増加は0だ!という訳。

 …それはともかく。プログラムを終了させる時に、現在の状況を覚えておいて
 次回起動時には前回終了時の状態に復帰して欲しい。という要望に応えるもの
 です。

 #前回、ハングしたのを覚えていて、リセットしよーが何しよーがハングした
  状態で再起動する。ってのは嫌すぎなんで、ウィンドウのサイズと位置だけを
  記憶します(^^;;

 で、「Macintosh HD:システムフォルダ:初期設定」に初期設定ファイルを作る。
 というのがMacなマナーのようですね。
 日本語なフォルダ名ってのが何か嫌ですが、APIを使って取得する訳で日本語な
 名前がソースに埋め込みになるとかではないので良しとしましょうか。

2. 内容
 …特に記すことはありません。だって、起動する時に前回の内容があったら
 その通りに設定するし、なかったらしない。
 終了時には現在の状況を吐き出して終わり。ってだけです。
 ソース見れば自明。

 強いて言うなら、起動時、位置・サイズを変更してから(Windowが)見えるように
 するため、ResEditで作った時に「こいつは見えない状態でWindowを作ってね」
 とか設定する程度。

 意外とあっさりできました。って、見れば分かるけど、大幅に手抜きしてると
 言うか、ウィンドウサイズだけ変更できれば、後はどーでもよろしい。という
 作り(Graw Boxもないし、スクロールバーもない)だったりするからですけど。

 後、今回はSTR#リソースで文字列を定義してみました。STRリソースでも文字列を
 定義してますが、そっちは使ってませんです。
 IM:Overviewによれば、文字列はリソースで定義するのが普通だそーです。

 #そうすれば、ResEditだけで他国版のプログラムが作れるから。

 まぁその。そういう意見には多少、言いたいこともありますが。
 でも思想的には正解でしょう。

 面倒でも文字列はリソースで定義すべき。でしょうか。

 あと、このアプリでは初期設定ファイルのタイプを書き換えてます。クリエータを
 変更してないのは、こいつがクリエータを持っていないからですね。いや、それが
 良くないのは当然ですが、使い捨てのプログラムでAppleにクリエータを申請。
 ってのは余りに(Appleに)失礼でしょう?
 ちなみに、ファイルタイプやクリエータを指定しなくても動作的には全く問題ない
 です。

 だって、ファイルタイプを指定する方法って、しばらく分からなかったのに、
 wsizeな動作には全く問題なかったもんね。クリエータにしてもしかり。
 ファイルタイプは見た目、白紙アイコンになるのが嫌だったので設定方法を調べた
 次第です。

3. 自作関数群
 pref.cです。が、何も考えずにこれを流用してもOKOKでしょう。多分。
 Boolean findPrefDir(short *VolNum, long *DirID, Str255 PrefFile);
 プレファレンスファイルを探しますです。

 Boolean loadPref(appPref *ap);
 プレファレンスが存在していれば、独自定義のappPref構造体に読み出します。

 Boolean savePref(appPref *ap);
 プレファレンスを保存します。最後にファイルタイプを設定してアイコンの
 見かけをそれなりにしてます。

4. appPrefに付いて
 すっげーわざとらしい構造体ですね(笑)。これはRefConの話を持ち出すための
 布石です。Macではそれぞれのウィンドウを再描画する情報をそれぞれの
 ウィンドウのRefConに保存するという技法を通常取る。ということらしいです。
 そうすることで*今どのウィンドウを更新しているか*を判断する。訳です。

 各ウィンドウ毎にウィンドウプロシージャがあるWindowsとは大違い。でも、
 これ知ってようやくWindowsのGet/SetWindowLong() APIでのGWL_USERDATA指定
 に合点がいきました。

(EOF)