複数のFormのfsStayOnTopの関係について


Hoby  2006-08-30 06:56:21  No: 23035

お世話になります。
Form1〜Form4はいずれも同じサイズ(小さい時計表示程度のサイズ)です。
いずれも、デスクトップ最前面に表示をさせたいので、fsStayOnTopにしています。
Form1からポップアップメニューでForm2〜4を表示させています。
表示した直後は、すべてのFormが最前面に表示されていますが、
Form1以外のFormをクリックすると、最前面の表示が解除されてしまいます。
BorderStyleはすべてのフォームがbsNoneでClientHeightは25、ClientWidth125でサイズも共通にし、縦に並べるように表示をさせています。

何か良い対処方法はございますか?


Fusa  2006-08-30 15:27:04  No: 23036

私はBorderStyleは無視して
TopMostプロパティを
つくって制御しています。
参考にしてください。

type
  TForm1 = class(TForm)
    CheckBox1: TCheckBox;
    procedure FormShow(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
  private
  private
    FTopMost: Boolean;
    procedure SetTopMost(const Value: Boolean);
    function GetTopMost: Boolean;
  public
    property TopMost: Boolean read GetTopMost write SetTopMost;
  end;

procedure TForm1.FormShow(Sender: TObject);
begin
  FTopMost := True;//or False;
  Self.TopMost := Self.TopMost;
  //Self.FormStyle:=fsStayOnTopにしておくこと
  //TopMostプロパティをコードで設定することで
  //FormStyleの値とは関係なく最前面状態が変化する
end;

procedure TForm1.SetTopMost(const Value: Boolean);
begin
  if Value then
  begin
    SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE);
  end else
  begin
    SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE);
  end;

  FTopMost := Value;
end;

function TForm1.GetTopMost: Boolean;
begin
  Result := FTopMost;
end;


Hoby  2006-08-31 07:27:28  No: 23037

Fusaさんありがとうございます。

Form1〜4のすべてを、他のWindowsアプリケーションの最前面に表示を
させたいのですが・・・・。

それぞれのFormのOnCreate部に、上記のSetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE);  を記述して、

Form1から2.3.4のそれぞれをShowメソッドで表示をさせてみましたが、
うまくいかないのですが。


Fusa  2006-09-01 08:27:46  No: 23038

TopMostにする順番も関係するようですね。

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Show;
  Form2.TopMost := True;
  Form1.TopMost := True;
end;

どうも、動作がすっきりしませんが
メインフォームであるForm1を最後にTopMost:=Trueにしてみてください。


ん?  2006-09-02 00:53:48  No: 23039

ちょっと目先を変えて、こんなのは?
フォームに重なりがあると、違和感がありますけど。

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    procedure AppDeactivate(Sender: TObject);
  end;

procedure WindowTopMost(Handle: THandle);
begin
  SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, 
     SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);
end;

procedure TForm1.AppDeactivate(Sender: TObject);
var
  i:Integer;
begin
  for i := 0 to Screen.FormCount -1 do begin
    if Screen.Forms[i] <> Screen.ActiveForm then begin
      WindowTopMost(Screen.Forms[i].Handle);
    end;
  end;
  if Screen.ActiveForm <> nil then begin
    WindowTopMost(Screen.ActiveForm.Handle);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnDeactivate := AppDeactivate;
end;


Hoby  2006-09-08 22:26:32  No: 23040

ん?さん
ありがとうございます。
やってみます。


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

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






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