[Delphi:90835] fsStayOnTopのフォームなのに隠れてしまう

2,495 views
Skip to first unread message

Hirao

unread,
Oct 31, 2008, 4:49:54 AM10/31/08
to Del...@ml.users.gr.jp
Hiraoです。

Form1(メインのフォーム)からForm2を呼び出して表示しています。
Form2の内容を確認しながらForm1で入力をしたいので Form2のFormStylleをfsStayOnTop
にしました。Form1のFormStylleはfsNormalです。また、Form1からは Form2.Show;
で表示します。

こうするとForm2を前に表示させたまま後ろのForm1の操作ができるのですが、ユーザーか
指摘があり何かの拍子でForm2が隠れてしまい、Form1の操作ができなくなるときがあるら
しいです。私もいろいろ操作をしてみたのですが再現ができません。

このようなご経験はありますか?
過去ログをみるとMessageBoxでは報告されていますけど今ひとつ該当しないようです。

何か情報ありませんでしょうか?

環境 Delphi 7+Windows Xp SP3
客先環境は Xp ですけど SP はバラバラです。

nagao_support

unread,
Nov 1, 2008, 4:15:08 PM11/1/08
to Del...@ml.users.gr.jp
Nagaoです。
私もHiraoさんと同じ問題で以前から困っています。
どなたかよい情報を教えていただけませんか?

Yoshihito Umetsu

unread,
Nov 1, 2008, 5:44:13 PM11/1/08
to Del...@ml.users.gr.jp
梅津と申します。

以下のAPIを使用してはいかがでしょうか?

procedure TForm2.FormCreate(Sender: TObject);
begin
SetWindowPos( self.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE + SWP_NOMOVE );
end;

Takuo Nakamura

unread,
Nov 2, 2008, 9:25:31 AM11/2/08
to Del...@ml.users.gr.jp
中村@ブレーンです。

"[Delphi:90835] fsStayOnTopのフォームなのに隠れてしまう" において
Hirao <hi...@stannet.ne.jp> さんは書きました


>Form1(メインのフォーム)からForm2を呼び出して表示しています。
>Form2の内容を確認しながらForm1で入力をしたいので Form2のFormStylleをfsStayOnTop
>にしました。Form1のFormStylleはfsNormalです。また、Form1からは Form2.Show;
>で表示します。
>
>こうするとForm2を前に表示させたまま後ろのForm1の操作ができるのですが、ユーザーか
>指摘があり何かの拍子でForm2が隠れてしまい、Form1の操作ができなくなるときがあるら
>しいです。私もいろいろ操作をしてみたのですが再現ができません。

これはいかがでしょう。

Form1 からForm2 を表示:

var
f: TForm;
:
:
f := TForm2.Create(Self);
SetWindowLong(f.Handle, GWL_HWNDPARENT, Handle); // Handle はForm1 のウィンドウハンドル

補足:

ウィンドウの関係を Owned/Owner の関係にすると ウィンドウ間の Z-Order が保障されます。
#Owned が Owner の前

どの Delphi からかは忘れてしまいましたが、 Delphi 2007/2009 では API を使わなくとも
新設された、TFormのPopupMode/PopupParent プロパティで Owner/Owned ウィンドウの
関係を作ることができます。

+---------------------------------------------+
|Takuo Nakamura from Hino City, Tokyo JAPAN |
+---------------------------------------------+

nagao_support

unread,
Nov 3, 2008, 4:51:26 PM11/3/08
to Del...@ml.users.gr.jp
梅津さん、こんにちは。長尾です。
お知らせくださいましたように私のプログラムを変更し、正常に動作することを確認しました。
私のユーザーの方でもこのプログラム変更で、異常が解消するかをこれらか問い合わせます。
教えてくださり、ありがとうございました。

nagao_support

unread,
Nov 3, 2008, 5:13:52 PM11/3/08
to Del...@ml.users.gr.jp
中村@ブレーンさん、こんにちは。長尾です。

返事くださいましてありがとうございます。

> var
> f: TForm;
> :
> :
> f := TForm2.Create(Self);
> SetWindowLong(f.Handle, GWL_HWNDPARENT, Handle); // Handle はForm1 のウィンドウハンドル

unit Unit2には既に
  var
   Form2: TForm2;
があるので、unit Unit1では
var
   f: TForm;
は加えず、下記のように変えた上で、動作テストしたところ、見かけ上は希望通りに
動作しましたが、何かまづいことがあるでしょうか?
なお、動作テストに先立ち、
   プロジェクト-オプション
で表示される画面で、Fom2は「自動作成の対象」ではなく、「選択可能なフォーム」
に変更しましたが、これも正しい操作でしょうか?

*************************************************************
var
Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Form2 := TForm2.Create(Self);
SetWindowLong(Form2.Handle, GWL_HWNDPARENT, Handle);
Form2.show;
end;


----- Original Message -----
From: "Takuo Nakamura" <naka...@asahi.email.ne.jp>
To: <Del...@ml.users.gr.jp>

Hirao

unread,
Nov 3, 2008, 8:07:50 PM11/3/08
to Del...@ml.users.gr.jp
梅津 さん、中村 さん、こんにちは、Hiraoです。コメントありがとうございます。

梅津さんのご提示のコードで試してみます。

Nagao さん、おぉ同士。そちらはですか?私のほうは今日プログラムを差し替えて
しばらく試してもらいます。
無事何事もなければいいのですが...


Yuzuru Kato

unread,
Nov 3, 2008, 8:28:23 PM11/3/08
to Del...@ml.users.gr.jp
加藤と申します。

画像から顔認識などの画像認識をDelphiでやりたいと思っています。

IntelのOpenCVが使えると簡単にできそうなのですが,
http://opencv.jp/
これをDelphiでどう使ったらよいか悩んでおります。C++のDLLを使うためのラッ
パークラスがあると助かるのですが見つけられずにおります。既にラッパークラ
スがあればその所在を,ないのであればC++のDLLをDelphiで使うための手順を教
えていただけるとうれしいです。

開発ではDelphi2007とDelphi2009を使っておりますが,良い方法がございました
らご教授いただけるとありがたいです。

よろしくお願いいたします。

高井 繁雄

unread,
Nov 3, 2008, 8:34:46 PM11/3/08
to Del...@ml.users.gr.jp
高井と申します。

確かCソースをDelphiに変換するツールがあったと
思いますので、これを使ってある程度まではCのヘッダを
変換出来ると思います。

その後、細かいところを手修正という感じでしょうか。
たぶん、これがそのツールだと思います。

http://c2pas.sourceforge.net/

以上、ご確認の程よろしくお願いいたします。


中村拓男

unread,
Nov 3, 2008, 10:25:09 PM11/3/08
to Del...@ml.users.gr.jp
中村@ブレーンです。

Form2 は「自動作成の対象」の場合、Application.CreateForm が自動的にフォームを作って
その参照を入れる先として確保されているグローバルな変数なので、
「選択可能なフォーム」はフォームの場合は自由に使ってかまいません。

補足:

Windows では伝統的に特定のウィンドウの前に別のウィンドウを「浮かす」場合、
Owned/Owner の関係を使っていますが、Delphi では伝統的に fsStayOnTop(TopMopst)を
使ってきました。これが原因みたいです。


関連情報

[Delphi-ML:82715] メッセージボックスが親フォームの後ろに隠れる
http://www2.big.or.jp/~osamu/Delphi/delphi-browse.cgi?index=082715
「Windows XP で 実行時エラー '5' が発生する」(多分関連してます(^^;)
http://support.microsoft.com/default.aspx?scid=kb;ja;811469

nagao_support さんは書きました:

----------
東京都 日野市 中村拓男

戸田 英夫

unread,
Nov 4, 2008, 5:11:41 AM11/4/08
to Del...@ml.users.gr.jp
戸田@お仕事中です

----- Original Message -----
From: ""中村拓" "男"" <tknak...@brain-tokyo.jp>
To: <Del...@ml.users.gr.jp>
Sent: Tuesday, November 04, 2008 12:25 PM
Subject: [Delphi:90849] Re: fsStayOnTopのフォームなのに隠れてしまう


> 中村@ブレーンです。

お久しぶりです (^_^ゞ

> 補足:
>
> Windows では伝統的に特定のウィンドウの前に別のウィンドウを「浮かす」場合、
> Owned/Owner の関係を使っていますが、Delphi では伝統的に
> fsStayOnTop(TopMopst)を
> 使ってきました。これが原因みたいです。

補足の補足

StayOnTop の API って W98 以降で仕様変更って、 MSDN  で公示がありませんでしたっけ?

だって Windows の System でエラーが発生しても StayOnTop で隠されてしまうので...

NT4 以降では System側で占有となったと記憶しているんですが...

---- (-_-)(-_-)(-_-) THE REAL PROGRAMMER (-_-)(-_-)(-_-) ----
At the beach, The Real Programmer is the one drawing flowcharts in the sand.
戸田 英夫 mailto: Hideo...@hiroshima.ntt-west.jp


nagao_support

unread,
Nov 4, 2008, 11:15:39 PM11/4/08
to Del...@ml.users.gr.jp
中村@ブレーンさん、こんにちは。長尾です。
返事くださいましてありがとうございました。

----- Original Message -----
From: ""中村拓" "男"" <tknak...@brain-tokyo.jp>
To: <Del...@ml.users.gr.jp>
Sent: Tuesday, November 04, 2008 12:25 PM
Subject: [Delphi:90849] Re: fsStayOnTopのフォームなのに隠れてしまう

Reply all
Reply to author
Forward
0 new messages