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)