アーカイブ

2012年 5月 7日 のアーカイブ
2316 letters | 1317 views | コメントする

 今やってる作業は、元々タブ切り替えを前提としたSDIアプリだった真魚を、タブ付MDIに改造する作業だ。このSDI/MDIの定義が曖昧になりがちなのでちゃんとしておくが、広義では一つのアプリがたくさんファイルを開けたらMDIってことになってるから、タブ式の真魚は最初からMDIと言う事になる。今言ってるのはそれじゃなく、Windowsが元々の仕組みとしてサポートしてる狭義のMDIって事なんだけど、一つの親ウィンドウの中にいくつも子ウィンドウを作って、子ウィンドウを最大化すると親ウィンドウの中で最大化されるってやつ。それをこのゴールデンウィークでどうにかしようとしてて、まぁだいたいうまく行ってるんだけど、まだおかしいところがある状態。先日、Delphi XE2に環境移行した真魚をアップロードしたが、そのバージョンはDelphi XE2の不可解な挙動によりGrep出来ない状態になっているため、それを修正してさっさと次のバージョンをアップロードしたいと思ってるんだけど、なんせいろいろおかしいからアップロードできないでいる。

 Grep出来ない件に関しては、Grep自体がおかしいんじゃないから、そのDelphiの不可解な挙動部分だけ機能停止させることで、動くことは動く。Grepの挙動はむしろ旧バージョンより良くなってて、バージョンアップした回があったって感じ。でも、結果ログを表示させるボタンについて、結果0ヒットならボタンは押せないという当然の処理を、不可解な挙動であきらめざるを得ない。ボタンの文字を「実行」/「停止」で変更することは出来て、その下のボタンを「有効」/「無効」で切り替える事が出来ない。出来なくなった。以前は出来てた。以前とは、onig.dllからbregonig.dllに移行するために動作テストしてた時で、その時はたぶん64bitで試してたので、もしかしたら32bitではその時点ですでにおかしかった可能性もある。可能性でしかない理由は、現時点でなぜか64bit版はGrepウィンドウの表示だけでアクセス違反になったので試しようがないから。これはMDI化したのがキッカケだろう。現Delphiは64bitデバッガがほとんど働かないからその修正も無理に近い。なかなかまともなDelphiにはあたらないってのが、今回も購入迷った一因だったりする。

 MDI化に関しては、ようやくアクセス違反を出さずに使えるようになってきたかなって状態。これもおかしな話だが、ただ窓を作って切り替えるだけの機能のどこかでアクセス違反が発生し、しかもデバッガでは捉えられないところだったり、ブレークポイントを設定できなかったりする。履歴を見ると自分で書いたソース部分ではなく、VCL部分でストップしてるわけだから、その部分を自分で修正して対応する事は不可能な場合が多々ある。もうDelphi XE2ではタブ付MDIを作れないと思ってあきらめようかと、挫折しかけた。また付け焼き刃な対応になるが、該当するアクセス違反を発生させるウィンドウメッセージを受け取らないようにして、おそらくそのせいで何か不具合が発生するはずなので、気がついたら随時、独自で直していくという方法をとるしかない。なんかもうメッチャクチャになってきた。DelphiでのMDIが初めてやるので、やり方自体が間違ってるかもしれない。本来ならMDIアプリを作るときは、最初からMDIで作る物であり、SDIをあとからMDIに変更するってのはたぶんサポートしてないんじゃなかろうか。それでもここまで来たら後戻りは出来ないけどね。

 アクセス違反以外に問題になるのは、MDIとタブとの連動がいろんな場合にずれちゃう事。MDIの子ウィンドウがアクティブになってもタブが別のになってたり、タブだけアクティブになって子ウィンドウは別のだったり。表示上アクティブになってるウィンドウと、実際に文字入力されるウィンドウが違ったり。それらがいつ起るのかってのを、マウスで操作した場合、キーボードで操作した場合、関連付けで開いた場合、閉じた場合、タブに対して操作した場合、ウィンドウに対して操作した場合と、多方面から検証しないといけない。最初からMDIで作ってれば、あとからタブを付けてもそんなに難しくはないが、最初はSDIでタブを前提に作ってると、MDIに変更するためにつじつまを合わせることがかなり複雑化している。

Aigo A4スクリーン MDI-15

 あと、せっかくだからWindows7のタスクバーに各MDI子ウィンドウを表示したいけど、それをやるって事はXPとの互換性を捨てる事だから、やっぱり将来的にはXPで動かないって事になる。