開発:Delphi5, Delphi6, Turbo Delphi Explorer
環境:XP SP3 + IME 2007, Vista
現象:文字を入力・変換し、変換候補が一覧で表示されると、フォームの
Zオーダーが変わってしまう。
再現する最小プログラム
・フォームを二つ用意(Unit1.pasとunit2.pas)
自動生成は、Unit1のみ
・Unit1のusesにunit2を追加
・Unit1にEditとButtonを一つずつ配置し、ボタンのイベントで下記を記述
procedure TForm1.Button1Click(Sender: TObject);
begin
if Form2 = nil then Form2 := TForm2.Create(Self);
Form2.Show;
end;
・Unit2には、Editを一つ配置
・Unit1,Unit2 共に、FormStyle = fsStayOnTop を指定
再現方法
1)プログラムを実行し、Unit1のボタンを押して、両方のフォームを表示させる
2)アクティブなフォームが、前面になることを確認し、フォームが重なるように移動する。
3)アクティブフォームのEditで、漢字入力モードにして、文字入力し、変換を行う。
4)変換候補がリストで表示されると、背後にあったフォームが前面に移動し、
変換リストだけ前面に表示される。
IME 2007 の不具合なのか、仕様によるものなのかわかりません。
回避策とかないでしょうか?
これはアプリケーション・ウインドウがらみの問題だと思いますが,
詳しいことはわかりせん.
Vista対応はDelphi2007からですから,この問題は自力解決でしょうね.
fsStayOnTopにしているのは,テストのためだと思いますが,
一番簡単な解決方法は,fsNormalにすることかも知れません.
他にも解決策があるかも知れませんが,今考え付いたのこれだけです.
Visga関係のリンクを貼ってあります.参考になればいいのですが.
http://mrxray.on.coocan.jp/Others/DelphiInVista.htm
Mr.XRAYさん、レスありがとうございます。
レスいただいた内容は、間接的(?)に役に立ちました。
で、結論から言うと
https://www.petitmonte.com/bbs/answers?question_id=6316
ここでKHE00221さんが回答されているように、WndParentを指定する方法を
利用させていただきました。
実際には、CreateParams ではなく、SetWindowLongを使用しました。
SetWindowLong(Form2.Handle, GWL_HWNDPARENT, Handle);
簡単にテストしてみたところ、報告した現象は出ないように見えるので
他(の機能)に問題がないか確認してみます。
# 昨日から上記の方法を試していたにも関わらず、後から開く方の
# フォームでなんとかしようとして、失敗・諦め(理由はいろいろ)。
# Mr.XRAYさんのレスを読んでいて、なぜか閃き、先に開く方で
# テストしたら簡単にできる。
# 後がだめなら前でという簡単なことなのに、このテの閃きが
# 鈍ってきたな〜と思う、今日この頃。
# もうトシだな〜・・・(´・ω・`)
ツイート | ![]() |