フォームが後ろに隠れないようにするには?


ahsan  2009-05-28 20:46:54  No: 34549

MDIの親フォーム(fsMDIForm)に子フォーム(fsMDIChild)が1つある状態で、
BMP等をサムネイル表示するフォーム(fsStayOnTop)を親フォームの
ツールボタンでFormShowModalで表示しています。
このサムネイルフォームで内部で画像縮小処理等を行っている最中、
親フォームの後ろに隠れてしまします。
現象がかならず発生するわけではないのですが、頻度は結構多いです。
色々調べました所、
FDのサムネイルの場合(処理時間かかる場合)で、かつ、
マウスカーソルが、タスクバーの上にある場合に発生します。
マウスカーソルが、アプリ上の場合は隠れません。
隠れる直前に、デスクトップがちらつきます。
OSはVistaです。
なにか、考えられることがありましたら、教えてください。


KHE00221  2009-05-29 11:25:10  No: 34550

隠れるフォームで

procedure TForm2.CreateParams(var Params:TCreateParams);
begin
    inherited;
    Params.WndParent := Application.MainForm.Handle;
end;


ahsan  2009-05-29 19:35:03  No: 34551

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が、
無効になっている?ような気がします。


はて?  2009-06-05 18:35:54  No: 34552

遅レスですが

ここにあるような現象でしょうかね?

[Delphi-ML:82715] メッセージボックスが親フォームの後ろに隠れる
http://www2.big.or.jp/~osamu/Delphi/delphi-browse.cgi?index=082715


初心者  2009-06-06 00:06:39  No: 34553

わたし、同じようにフォームが隠れるので
質問しました。
ソースのファイルで以下のように設定すると直りましたよ。
右から左なのでちがったらごめんなさい。

Application.MainFormOnTaskbar := False


KHE00221  2009-06-06 07:05:30  No: 34554

>それらのアプリよりサムネイルフォームの方が上にきます。

fsStayOnTop してるから

procedure TForm2.CreateParams(var Params:TCreateParams);
begin
    inherited;
    Params.WndParent := Application.MainForm.Handle;
end;

すれば  fsStayOnTop  はいらない


ahsan  2009-06-09 01:24:52  No: 34555

みなさん、どうもありがとうございます。
・はて?さん、このような現象です。
  XP以降発生するようですね。KHE00221さんの、
  対処方も記載されています。
・初心者さん、実は、この設定を行ってみたのですが、私の場合は
  だめだったんです。すみません。
・KHE00221さん、fsStyaOnTopをfsNormalにすると、
  他のアプリの背後にサムネイルホームが隠れました。(OKです)
  今までずっと、サムネイルフォームのような
  何かを選択して、次へ進むような、フォームは、
  FormStyleをfsStayOnTopで、ShoModalしていました。
  はて?さんから教えていただいた所にはXP以降発生しているように
  書かれていますが、今後作成する場合は、
  fsStayOnTop&ShowModalより、
  CreateParamsを行うほうが良いのでしょうか?


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

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






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