お世話になります。
Form1〜Form4はいずれも同じサイズ(小さい時計表示程度のサイズ)です。
いずれも、デスクトップ最前面に表示をさせたいので、fsStayOnTopにしています。
Form1からポップアップメニューでForm2〜4を表示させています。
表示した直後は、すべてのFormが最前面に表示されていますが、
Form1以外のFormをクリックすると、最前面の表示が解除されてしまいます。
BorderStyleはすべてのフォームがbsNoneでClientHeightは25、ClientWidth125でサイズも共通にし、縦に並べるように表示をさせています。
何か良い対処方法はございますか?
私は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;
Fusaさんありがとうございます。
Form1〜4のすべてを、他のWindowsアプリケーションの最前面に表示を
させたいのですが・・・・。
それぞれのFormのOnCreate部に、上記のSetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE); を記述して、
Form1から2.3.4のそれぞれをShowメソッドで表示をさせてみましたが、
うまくいかないのですが。
TopMostにする順番も関係するようですね。
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.Show;
Form2.TopMost := True;
Form1.TopMost := True;
end;
どうも、動作がすっきりしませんが
メインフォームであるForm1を最後にTopMost:=Trueにしてみてください。
ちょっと目先を変えて、こんなのは?
フォームに重なりがあると、違和感がありますけど。
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;
ん?さん
ありがとうございます。
やってみます。
ツイート | ![]() |