MDIの親フォーム(fsMDIForm)に子フォーム(fsMDIChild)が1つある状態で、
BMP等をサムネイル表示するフォーム(fsStayOnTop)を親フォームの
ツールボタンでFormShowModalで表示しています。
このサムネイルフォームで内部で画像縮小処理等を行っている最中、
親フォームの後ろに隠れてしまします。
現象がかならず発生するわけではないのですが、頻度は結構多いです。
色々調べました所、
FDのサムネイルの場合(処理時間かかる場合)で、かつ、
マウスカーソルが、タスクバーの上にある場合に発生します。
マウスカーソルが、アプリ上の場合は隠れません。
隠れる直前に、デスクトップがちらつきます。
OSはVistaです。
なにか、考えられることがありましたら、教えてください。
隠れるフォームで
procedure TForm2.CreateParams(var Params:TCreateParams);
begin
inherited;
Params.WndParent := Application.MainForm.Handle;
end;
KHE00221さん、ありがとうございます。
この方法で、隠れなくなりました。
ところが、別のアプリを起動orアクティブにすると
それらのアプリよりサムネイルフォームの方が上にきます。
この方法はフォームにどのような変化が起きているのでしょうか?
NETで調べると、
http://mrxray.on.coocan.jp/Halbow/VCL06.html
に詳しく記載ありましたが、よく理解できませんでした。
又、別途、私なりに調べていたのですが、
隠れてしまう個所がだいたいわかりました。
サムネイルフォームで、最初、前処理として、
FDがセットされているかどうかや、
書き込みできるかどうかなどチェック後、
FindFirst〜FindNextでループしながらファイルを読み、画像圧縮
を行っています。ループ中で、キャンセルボタンを効かせたかった
ので、Application.ProcessMessages;を使っていますが、この時に
どうも、隠れてしまうようです。
それで、ループ中のApplication.ProcessMessages;はそのままで、
このループの中に入る直前に、
Application.ProcessMessages;
SetWindowPos(Self.Handle,HWND_TOP,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE);
の2行を追加したところ、今のところですが、隠れなくなりました。
推測ですが、前処理に時間がかかった場合、fsStayOnTopが、
無効になっている?ような気がします。
遅レスですが
ここにあるような現象でしょうかね?
[Delphi-ML:82715] メッセージボックスが親フォームの後ろに隠れる
http://www2.big.or.jp/~osamu/Delphi/delphi-browse.cgi?index=082715
わたし、同じようにフォームが隠れるので
質問しました。
ソースのファイルで以下のように設定すると直りましたよ。
右から左なのでちがったらごめんなさい。
Application.MainFormOnTaskbar := False
>それらのアプリよりサムネイルフォームの方が上にきます。
fsStayOnTop してるから
procedure TForm2.CreateParams(var Params:TCreateParams);
begin
inherited;
Params.WndParent := Application.MainForm.Handle;
end;
すれば fsStayOnTop はいらない
みなさん、どうもありがとうございます。
・はて?さん、このような現象です。
XP以降発生するようですね。KHE00221さんの、
対処方も記載されています。
・初心者さん、実は、この設定を行ってみたのですが、私の場合は
だめだったんです。すみません。
・KHE00221さん、fsStyaOnTopをfsNormalにすると、
他のアプリの背後にサムネイルホームが隠れました。(OKです)
今までずっと、サムネイルフォームのような
何かを選択して、次へ進むような、フォームは、
FormStyleをfsStayOnTopで、ShoModalしていました。
はて?さんから教えていただいた所にはXP以降発生しているように
書かれていますが、今後作成する場合は、
fsStayOnTop&ShowModalより、
CreateParamsを行うほうが良いのでしょうか?
ツイート | ![]() |