ShowWindow(SW_SHOWNOACTIVAT) и отсутствие контролов.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
CriDos
новенький
Сообщения: 11
Зарегистрирован: 07.05.2013 11:06:10

ShowWindow(SW_SHOWNOACTIVAT) и отсутствие контролов.

Сообщение CriDos »

Здравствуйте!
Понадобилось выяснить способ вызова дочерней формы, без передачи оной фокуса.
При использовании функции ShowWindow(hWnd, nCmdShow); форма открывается без передачи фокуса, но с отсутствием на ней каких либо контролов...
Как правильно реализовать данную идею?
Код:

Код: Выделить всё

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, Forms, StdCtrls, Windows;

type

  { TForm1 }

  TForm1 = class(TForm)
    b: TForm1;
    Button1: TButton;
    procedure Button1MouseEnter(Sender: TObject);
    procedure Button1MouseLeave(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1MouseEnter(Sender: TObject);
begin
  b := TForm1.Create(self);
  b.Left:=100;
  b.Top:=100;
  ShowWindow(b.Handle, SW_SHOWNOACTIVATE);

  //b.Show;
  //SetFocus;
end;

procedure TForm1.Button1MouseLeave(Sender: TObject);
begin
  b.Free;
end;

end.


Добавлено спустя 4 часа 52 минуты 48 секунд:
Пытался использовать небольшой хак:

Код: Выделить всё

ShowWindow(b.Handle,SW_SHOWNOACTIVATE);
 b.Visible := True;

Но при присвоении параметру Visible значения true, активируется и фокус на созданную форму :(
Хотя все кто работают в дельфях, пишут работает отлично...
SeZuka
постоялец
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Сообщение SeZuka »

Так а чем не нравится как у вас раньше было?
//b.Show;
//SetFocus;

Добавлено спустя 32 минуты 18 секунд:
CriDos писал(а):Хотя все кто работают в дельфях, пишут работает отлично..

Это видимо фишка лазаруса, форма должна быть хоть раз показана, чтоб все заработало, у нее даже состояние такое есть fsFirstShow.
CriDos
новенький
Сообщения: 11
Зарегистрирован: 07.05.2013 11:06:10

Сообщение CriDos »

Проблема с переключением фокуса при b.Visible:=true решилась установкой более свежей версии Lazarus (snapshot).
Остановился на следующем варианте:

Код: Выделить всё

SetWindowPos(b.Handle, -1, 0, 0, 0, 0, SWP_NOACTIVATE);
ShowWindow(b.Handle, SW_SHOWNOACTIVATE);
b.Visible:=true;
Ответить