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

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

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

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

Сообщение CriDos » 07.05.2013 11:25:41

Здравствуйте!
Понадобилось выяснить способ вызова дочерней формы, без передачи оной фокуса.
При использовании функции 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, активируется и фокус на созданную форму :(
Хотя все кто работают в дельфях, пишут работает отлично...
CriDos
новенький
 
Сообщения: 11
Зарегистрирован: 07.05.2013 11:06:10

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

Сообщение SeZuka » 07.05.2013 17:42:08

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

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

Это видимо фишка лазаруса, форма должна быть хоть раз показана, чтоб все заработало, у нее даже состояние такое есть fsFirstShow.
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

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

Сообщение CriDos » 08.05.2013 13:19:59

Проблема с переключением фокуса при b.Visible:=true решилась установкой более свежей версии Lazarus (snapshot).
Остановился на следующем варианте:
Код: Выделить всё
SetWindowPos(b.Handle, -1, 0, 0, 0, 0, SWP_NOACTIVATE);
ShowWindow(b.Handle, SW_SHOWNOACTIVATE);
b.Visible:=true;
CriDos
новенький
 
Сообщения: 11
Зарегистрирован: 07.05.2013 11:06:10


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 226

Рейтинг@Mail.ru