Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Приложение теряет фокус на старте


Автор: Злоумышленник 24.6.2007, 22:54
При запуске проги она оказывается не в фокусе (из-за мсжбокса).
Код

program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.MessageBox('Hallo, Vingrad!',':-)');
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

Но если заюзать 
Код

MessageBox(Application.Handle,'Hallo, Vingrad!',':-)',MB_OK);

или сначала показать какую-нить форму, то работает нормально. Почему так?

Автор: Yanis 25.6.2007, 06:39
Цитата(Злоумышленник @  24.6.2007,  23:54 Найти цитируемый пост)
При запуске проги она оказывается не в фокусе (из-за мсжбокса).

У меня всё нормально. Фокус попадает на главную форму, как и должно быть.

Автор: STFN 7.8.2007, 19:06
Тут оставляем все как есть...

Код

...
{$R *.res}

begin
  Application.Initialize;
  Application.MessageBox('Hallo, Vingrad!',':-)');
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.




а главной форме в событие OnActivate пишем....

Код

procedure TForm1.FormActivate(Sender: TObject);
begin
  Application.BringToFront; 
end;


все smile

Автор: MetalFan 7.8.2007, 19:48
Цитата(STFN @  7.8.2007,  19:06 Найти цитируемый пост)
в событие OnActivate пишем

а ничего, что OnActivate возникнет при передаче фокуса ввода форме... зачем тогда лишние телодвижения то?

Автор: STFN 7.8.2007, 21:26
Цитата

а ничего, что OnActivate возникнет при передаче фокуса ввода форме... зачем тогда лишние телодвижения то?


у меня работает только такой способ. иначе фокус на форму не попадает. проверял на Delphi 7, система winxp sp2.

Автор: Sunvas 8.8.2007, 13:12
Цитата(Злоумышленник @  24.6.2007,  22:54 Найти цитируемый пост)
Почему так?

Чтобы понять почему так, нужно посмотреть, как устроен Application.MessageBox. Вот код.
Код

function TApplication.MessageBox(const Text, Caption: PChar; Flags: Longint): Integer;
var
  ActiveWindow: HWnd;
  WindowList: Pointer;
  MBMonitor, AppMonitor: HMonitor;
  MonInfo: TMonitorInfo;
  Rect: TRect;
  FocusState: TFocusState;
begin
  ActiveWindow := GetActiveWindow; //<--Обратите внимание на эту строку
  MBMonitor := MonitorFromWindow(ActiveWindow, MONITOR_DEFAULTTONEAREST);
  AppMonitor := MonitorFromWindow(Handle, MONITOR_DEFAULTTONEAREST);
  if MBMonitor <> AppMonitor then
  begin
    MonInfo.cbSize := Sizeof(TMonitorInfo);
    GetMonitorInfo(MBMonitor, @MonInfo);
    GetWindowRect(Handle, Rect);
    SetWindowPos(Handle, 0,
      MonInfo.rcMonitor.Left + ((MonInfo.rcMonitor.Right - MonInfo.rcMonitor.Left) div 2),
      MonInfo.rcMonitor.Top + ((MonInfo.rcMonitor.Bottom - MonInfo.rcMonitor.Top) div 2),
      0, 0, SWP_NOACTIVATE or SWP_NOREDRAW or SWP_NOSIZE or SWP_NOZORDER);
  end;
  WindowList := DisableTaskWindows(0);
  FocusState := SaveFocusState;
  if UseRightToLeftReading then Flags := Flags or MB_RTLREADING;
  try
    Result := Windows.MessageBox(Handle, Text, Caption, Flags);
  finally
    if MBMonitor <> AppMonitor then
      SetWindowPos(Handle, 0,
        Rect.Left + ((Rect.Right - Rect.Left) div 2),
        Rect.Top + ((Rect.Bottom - Rect.Top) div 2),
        0, 0, SWP_NOACTIVATE or SWP_NOREDRAW or SWP_NOSIZE or SWP_NOZORDER);
    EnableTaskWindows(WindowList);
    SetActiveWindow(ActiveWindow); //<--И на эту строку
    RestoreFocusState(FocusState);
  end;
end;


Строки, на которые стоит посмотреть, я выделил.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)