アーカイブ

2006年 8月 30日 のアーカイブ

妥協はしたくないので、いずれはちゃんと調べてどうにかしたいが、今は妥協して置こう。
と言うつもりで書いていたら、書きながら悪いところが思いついて、今解決した。

Delphi製のアプリは、表示されるウィンドウの他に、表示されないウィンドウを持っている。
そうでないアプリを作ることも出来るし、偽パッドはそうやって作った物だ。
だから出来ないことではないが、VCLの恩恵を全て捨てることになる。
本体ウィンドウはVCLである必要はないが、ダイアログボックスは絶対VCLじゃなきゃダメ。
VCLじゃないダイアログボックスを作るのは本気で面倒だ。
面倒だからついつい、ユーザーにはわかりにくいダイアログが出来てしまう。
なるべくわかりやすい設定ダイアログとかを作るために、あえてVCLで作っているのだ。
しかしVCLを使う限り、表示されないウィンドウに役割を与えているという宿命からは逃れられない。
その宿命がどんなデメリットになるかは、来年発売されるVistaで明るみになる。

これまでのWindowsでは、タスクバーの各アプリのタイトル部分にマウスカーソルを置くと、
長い名前で省略された部分がツールチップヘルプとして表示されたわけだが、
Vistaでは、そのウィンドウのサムネイル画像が表示される。
切り替える前に何のウィンドウかを目で見て確認できるという配慮だ。
Delphiアプリの場合、タスクバーに表示されるのは別の見えないウィンドウだ。
よって、タスクバーにマウスカーソルを置いても、サムネイル画像は表示されない。
これは極めて不利なので、見えてるウィンドウをタスクバーに表示するコードと、
見えないウィンドウをタスクバーに表示させないコードを書いて、対策を行った。
その対策のせいで、案の定、いまおかしな事になっている。

具体的にはこれを参考にした。
http://homepage2.nifty.com/Mr_XRAY/Delphi/plSamples/T_SDIStyleApp.htm
これは本当は、今ここに書いたような目的でやる物ではない。
まして、タブ式でウィンドウを一つにまとめた真魚がやるべき物じゃない。
しかし目的を達成させることは出来ると思い、安易にマネをしてみたのだが、
それじゃやっぱりダメだった。
今のバージョン2.17は、そのダメな状況になる場合がある。

何がダメかというと、上記サイトでは隠し窓と本窓の関係を完全に断ち切っている。
これは、複数のSDIウィンドウがタスクマネージャーから見れるようにするための工夫だ。
真魚でこれをやっちゃうと、真魚の本窓がダイアログボックスより前に来たり、
そのための対策をすると今度はクリックしても反応しなくなったり、
どうにも望み通りの動作をしなくなり、あちらを直せばこちらがおかしいになってしまう。
そこで、真魚の場合は本窓と隠し窓の関係を断ち切らない。
そうすると今度は、タスクマネージャーに表示されなくなるので、隠し窓を隠さない。
そうするとタスクバーに表示されちゃうのでEXスタイルを変更する。
と、ここまでで何をやったかと言えば、裏エクスプローラと全く同じ方法にしただけだ。

昔っから定番の方法で書けば最初から何の問題もなかったのだ。
単一プロセスでマルチウィンドウを実現する必要のあるSDIアプリを作ってるわけではないのだ。
でも、余計なことをしたおかげで、VCLの宿命とモード付きの複雑さを理解した。

まだベータ版しか出てないOSに振り回されるのは好ましくないね。