MS IME 2007 で のZオーダーが強制変更される

解決


ぽむぽむ  2009-06-16 01:58:54  No: 34785

開発: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 の不具合なのか、仕様によるものなのかわかりません。
回避策とかないでしょうか?


Mr.XRAY  2009-06-16 18:02:19  No: 34786

これはアプリケーション・ウインドウがらみの問題だと思いますが,
詳しいことはわかりせん.
Vista対応はDelphi2007からですから,この問題は自力解決でしょうね.

fsStayOnTopにしているのは,テストのためだと思いますが,
一番簡単な解決方法は,fsNormalにすることかも知れません.
他にも解決策があるかも知れませんが,今考え付いたのこれだけです.

Visga関係のリンクを貼ってあります.参考になればいいのですが.

http://mrxray.on.coocan.jp/Others/DelphiInVista.htm


ぽむぽむ  2009-06-17 00:24:35  No: 34787

Mr.XRAYさん、レスありがとうございます。
レスいただいた内容は、間接的(?)に役に立ちました。

で、結論から言うと

https://www.petitmonte.com/bbs/answers?question_id=6316
ここでKHE00221さんが回答されているように、WndParentを指定する方法を
利用させていただきました。

実際には、CreateParams ではなく、SetWindowLongを使用しました。
SetWindowLong(Form2.Handle, GWL_HWNDPARENT, Handle);

簡単にテストしてみたところ、報告した現象は出ないように見えるので
他(の機能)に問題がないか確認してみます。

# 昨日から上記の方法を試していたにも関わらず、後から開く方の
# フォームでなんとかしようとして、失敗・諦め(理由はいろいろ)。
# Mr.XRAYさんのレスを読んでいて、なぜか閃き、先に開く方で
# テストしたら簡単にできる。
# 後がだめなら前でという簡単なことなのに、このテの閃きが
# 鈍ってきたな〜と思う、今日この頃。
# もうトシだな〜・・・(´・ω・`)


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加