7.15(2)
QuickTime3.01が出たそうなのでダウンロードしてきた。例の、StandardGetFileで「.txt」で終わるテキストファイルを選択したときに…という問題が密かに解決しているんじゃないかと思って。プラグインが2.01になっただけらしいんだけど、Appleのことだからわからんよな…と思って外付にインストールして試してみたのだが、結果は変わらず。やはり、ややこしいけどStandardGetFilePreviewで選ぶようにするしかないのかなぁ。うーん、ややこしい。まあぼくはQT3を入れるつもりはないのでどうでもいいといえばいいんだけど(だいたいブラウズ機能だけ使えればぼくは十分なのに、Proにアップグレードしろーって毎回いわれたらうっとうしいだけ(笑))、QT3を入れている人にとっては面倒な問題といえばそうだよな…。
今まで一度だけ報告を受けただけなのでそれほど再現性は高くないのかなと思うんだけど、一度あったということは他にもあるんじゃないかという気もするし。問題の起こった当の「とんぷーすたっと」では、開くファイルは「〜.txt」というファイルに限定されているし、ファイルのクリエータはデフォルトではSimpleText(ttxt)だからとんぷーすたっととは違うし、そこにQT3を入れてMacOS
Easy Openを使って…とやったらすぐに再現できたはずだし。後半の条件が揃わなくて問題が起こっていない人が多いのかな? ま、ともかく、QT3.01でもこの問題は解決しない、ということで。
前に書いていたテキスト置き換えルーチンReplaceTextについて少し。前に、ReplaceTextで複数の場所を同時に置き換えてもらうのはちょっと面倒かも…なんていうことを書いていたが、手持ちの本(THINK
C下巻)を読んでいたら気になる記述を発見。ReplaceTextの返り値は、Mungerと同様に「置き換えた場所」だと思っていたんだが、「置き換えた回数」と書いてある。前にIMを見たときはそこまで確認しなかったからなぁ…。これが本当なら、「^0」の置き換えもReplaceTextを使えば一発で解決するはず。また、おそらく、ダイアログのParamTextでもReplaceTextを使っているのではないかと予想できる。
一応念のため、IMでその記述のある箇所を探してみた。Textの中の、Text Utilities、5-75ページの上の方に、「ReplaceText
returns an integer value. If the returned value is positive, it indicates the number
of substitutions performed; if it is negative, it indicates an error. The constant
noErr is returned if there was no error and no substitutions were performed.」と書いてある。たしかに「置き換えた回数」になっている。だったらこれを使えばやはり一発でできるということなのだが、、これをせずにMungerでループをまわした理由はなんなのだろう。「^0」(や「タ0」)がファイル名に含まれている可能性は考えなかったのだろうか。
たしかにReplaceTextは、Mungerにくらべてちょっと使いにくい感じはする。引数として渡すのにテキストへのハンドルを指定しないといけないから、ポインタであったり文字列がStr255型であったりした場合には、ハンドルに変換してやらないといけない。しかしこの手間をかけるのとMungerでループをまわすのを考えたらたいして変わらないような気もする。ましてやMungerは2バイト文字に対応していないわけだから。速度的にはMungerの方が高速なのだろうとは思うけど。
とりあえず、ReplaceTextの動作を確かめるために以下のようなルーチンを書いてみた。
void ReplaceString(Str255 base,Str15 key,Str255 subs)
{
Handle baseH,subsH;
OSErr err;
short result;
err=PtrToHand(&base[1],&baseH,*base);
err=PtrToHand(&subs[1],&subsH,*subs);
result=ReplaceText(baseH,subsH,key);
if (result>0)
{
*base=GetHandleSize(baseH);
BlockMove(*baseH,&base[1],*base);
}
}
|
ってここまで作ってから思ったけど、keyとsubsの順番が逆の方がわかりやすかったか。ま、いいや。ReplaceTextのStr255バージョンらしきもの(笑)。ま、エラーチェックをさぼっているからかなり修正の余地があるけど。置き換えたら255文字以上になってしまった場合の考慮もしていないし。このルーチンを使って、「^0と^0を置き換える」の「^0」を「これ」に置き換える実験をしてみた。すると「これとこれを置き換える」になり、resultには2が返ってきた。また、「^0とタ0を置き換える」で試すと、「これとタ0を置き換える」となり、2バイト文字に対応していることも確認できた。
ParamTextでもReplaceTextを呼んでいるかどうかを確かめようと思ったのだが、MacsBugでReplaceTextが呼ばれたら止まるように仕掛けてみたらほとんどデバッガから抜け出せない状態になってしまったのでその方法は断念。そんなにしょっちゅう呼び出されるルーチンなのか…。あとは機能拡張でも作ってReplaceTextが呼ばれたらわかるようにするか、ParamTextを呼ぶ直前でMacsBugに落としてトレースしてみるか、かな。まあこのReplaceTextの動きを見るかぎりではParamTextでも使っていると考えて差し支えないかなと思うが。
さて、と。次はどうしようかな…。今までに「そのうち…」としたままにしていたものをってのもあるかな。でもなにが残っていたんだったか忘れた…(笑)。今日、たぶんまいまいの登録CDが届くはずだから、まいまい登録記念(?)で「アーカイブサイズ比較」とかやってみようかなとか思ったりもしつつ(笑)。
7.15
変更作業はお休み(笑)。まあ主要なページは変更できたかなと思うからしばらくはこのままいこう。ソフトのページはいじろうかなと思っているけど、残りの自転車とSentierはいじるかどうか不明。あ、そういえば掲示板の過去ログのページへのリンクをはり忘れていたからそれを修正。
Finderのファイル表示でDrawStringを使っているのではないのか…って話に関する続き。考えるより試してみた方が早いだろうと、Colorful_INITを入れて再起動してみたところ、Finderのファイル表示にもちゃんと効果があらわれた。とするとDrawStringを使っているということなのだが、なぜ文字化けが直らないのだろう…。
Geneva2Osakaでは、DrawStringをひっかけているのだけど、文字化けをいじる前にフォントをチェックしている。Osakaになっているか、あるいはシステムフォントになっているときに変更しているからFinderのファイル表示でもいけるのではないかと思っていたのだが…、、わからないので適当なファイルを選んでそのファイル名が表示されたときにデバッガに落ちて止まるように改造して実験してみた。Finderが起動してファイルが表示され…というところでデバッガに落ち、さあ、トレース開始。(ppcのアセンブラは詳しくないので例によって68kバージョンで)
カレントポートのフォントIDをチェック…のところで、$44(A6)(だったかな)を参照しているみたいだが、たぶんこれが「port->txFont」なんだろう。これが0x4000(Osaka)か0x0000(システムフォント)になっていれば引っ掛かるはずだが…、と、、見てみるとその値は0x0001…。これってアプリケーションフォントだったっけ? 手元にある本をチェックしてみるとやはりアプリケーションフォントはID=1になるらしい。ということは、ID=1のときもチェックすべきだってことか…。
ただ、システムフォントやアプリケーションフォントの時も置き換えをするというのは不必要な場合もあると思う。日本語システムではデフォルトでシステムフォント、アプリケーションフォントはともにOsakaになっているから対処するのが妥当なところかなとは思うのだけど…。また、Finderでの表示フォントは変更することができるから、Osaka以外に変更した場合に文字化けが起こってしまうのも不便なところだな。対処するフォントを指定できるようにするのが一番なのかな…。
それとは別に、まだ対応できていないシステムルーチンに関する処理について。文字を表示するためのルーチンはDrawStringだけじゃなくて、DrawTextなんかもある。ダイアログなんかで表示される文章、ボタンはDrawTextで書かれているらしいからダイアログの文字化けに対処しようと思ったらDrawTextのパッチが必須だ。また、Finderで「情報を見る」を使って表示されるウィンドウでも一部DrawTextを使っているからそのあたりも同時に対処できるようになるかなと思う。もうひとつDrawCharというルーチンがあるのだがこれをパッチすることによって効果が得られる場合があるのかどうかわからないので今のところは予定がない。もうひとつNDrawJustというルーチンもあるな…。これがどんな場合に使われているのかはちょっとわからないが、ひょっとしたらこれも考えないといけないのかもしれない。
あとは、TEか。TEはどういうルーチンで文字を書いているのかなー。ちょっとわからない。TextBoxっていうルーチンがあるからこれも引っかけてやらないといけないのかもしれないが…。。
あまり複雑になると動作速度の問題が出てくるかなという気もする。まあ今のところはおそらく、文字の変更にかかる時間よりも表示自体にかかる時間の方が大きいと思うけど。理想的は必要な機能、不必要な機能を選り分けて使えるようにできるようにすることか。するとコントロールパネルってことになるが、、どうすっかなー。
全然関係ないけど、むぅぶ3巻を購入(自己紹介の漫画の欄参照)。帯にクレオパトラだとかモナリザだとか楊貴妃だとかいろいろ名前が書いてあるのだけど、その中によく見ると「田中麻理鈴」という名前が…。最初全然気付かなかったんだけどさっき見てたら発見。何のことだかわからない人は、「悪女」を読もう(笑)。あと、おまけが2巻までと雰囲気変わってた。どうなるんだろ。あとは明日(もう今日か)はびーらぶの発売日。立ち読みしにいかねば。
それから…。ICQを入れ替えて番号が変わった。なんか桁が増えた。しかしコンタクトリストになにも入っていないとこんなにすっきりするんだなぁ…(笑)。これを見て「登録させろー」あるいは「登録してくれー」って思った方は、メールよろしく。
|