MDIと右端の検出

1164 letters | 1690 views | コメントする

 Delphi以外だとどうなるのか分からないが、少なくともDelphiでは、MDIの最大化状態で別の子ウィンドウを表示すると、それによって隠れた方の子ウィンドウは裏で、「最大化されてない大きさ」に戻されているようだ。一つのMDI親ウィンドウにつき、最大化されているMDI子ウィンドウは同時に一つまでって事で、他は最大化されてない状態で待機する。だから、切り替えようとすると毎回、最大化されてない子ウィンドウがチラっと表示されたあとに最大化された子ウィンドウが出る。特にスクロールバーが目立って見える。それが嫌なので、何か色々工夫したりはしている。

 今回の現象は、タブを切り替えるとスクロール位置が入力位置のある行に戻っちゃうよってことだった。MDIにしたことによって、タブが切り替わった瞬間のチラっと見えるスクロールバーを隠すために、いろいろ余計なことをしすぎて、そのいろいろやってることのどれかがスクロールの位置をリセットしちゃうんだろうなぁと思ってたんだけどそうではなかった。普通にDelphiでMDIの仕様上(Delphi以外は分からないが)、裏に回ったときに勝手にMDI子ウィンドウは最大化解除されてるから、タブ切り替えの度に子ウィンドウの横幅は変動しているわけだ。そのとき「右端で折り返す」オプションにしてると、幅が変わったんだから当然折り返し文字数も変更する。折り返し文字数を変更すると、例えば100行のテキストが折り返して200行とかになってるかも知れないわけで、その折り返して何行になってるかが変わると、全何行あるうちの今何行の所にいるかっていう部分も違ってくる。折り返しの文字数を変更しても変なところを表示させないために、あえて入力位置のある行に戻していたわけだ。タダのタブ式ではそれで問題がなかったが、MDIだとただタブ切り替えしただけで右端の位置が変わるので、その度に入力位置までもっどっちゃうって事が起るわけだ。

 さてその勝手に子ウィンドウになった状態ってのは、勝手にではなくユーザー操作で子ウィンドウになった状態と区別できない。子ウィンドウだからって右端折り返しを検出しないとかって事をするわけにはいかない。付け焼き刃的な対策ではあるが、最前面の編集ウィンドウ以外は折り返しの処理をしないっていう風にしておいた。でもそれじゃあ例えば並べて表示とかした場合、そのどっちか片方は正しく右端で折り返してても、もう片方はおかしな事になってるかも知れない。でもとりあえずこれ以外に方法が見つからない。

 あとせっかく開く履歴を増やしたのに、メニューのアクセルキーを設定し忘れてた。これは緊急を要するバグじゃないので、まぁ直しておくよって程度。

たぶん関連のある記事:

コメントは終了しています。