Заголовок: Делаем Delphi-форму всегда поверх других окон
Вопрос: Как сделать так, чтобы форма в Delphi (2009 Pro) всегда была поверх других окон, даже если она не активна?
Ответ: Для того чтобы сделать Delphi-форму всегда поверх других окон, можно воспользоваться свойством FormStyle. Нужно установить значение этого свойства в fsStayOnTop. Тогда форма будет всегда поверх других окон, независимо от того, активна она или нет.
Пример кода на Object Pascal (Delphi):
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Self.FormStyle := fsStayOnTop;
end;
end.
В данном примере в методе FormCreate устанавливается значение свойства FormStyle в fsStayOnTop. Теперь форма будет всегда поверх других окон, независимо от того, активна она или нет.
Альтернативный ответ: В более новых версиях Delphi (2007/2009) поведение VCL изменилось в отношении родителя формы. Родителем формы теперь является главная форма, а родителем главной формы - рабочий стол. Если вы хотите изменить это поведение, можно изменить строку Application.MainFormOnTaskbar в файле *.dpr на False, чтобы получить старое поведение. Однако это также делает ваше приложение странным в Vista и Windows 7. Другой вариант - переопределить виртуальный метод CreateParams во всех ваших немодальных дочерних формах и установить поле Params.WndParent в рабочий стол (HWND_DESKTOP) или все еще существующий Application.Handle.
Пример кода на Object Pascal (Delphi):
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TMyChildForm = class(TForm)
protected
procedure CreateParams(var Params: TCreateParams); override;
end;
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
MyChildForm.CreateParams(Params);
end;
procedure TMyChildForm.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.WndParent := HWND_DESKTOP;
end;
end.
В данном примере в методе CreateParams устанавливается значение поля Params.WndParent в HWND_DESKTOP. Теперь форма будет всегда поверх других окон, независимо от того, активна она или нет.
Вопрос: Как сделать Delphi-форму всегда поверх других окон, даже если она не активна?
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS