| 
| 
 | Вопрос # 4 805/ вопрос открыт / | 
 |  Приветствую, уважаемые эксперты!У меня есть два вопроса.
 1. Есть две формы Form1 и Form2 и обе имеют fsNormal. Form1 постоянно открыта, а вторая появляется когда я нажимаю на ESC. Отлавливаю нажатие ESC с помощью ApplicationEvents1Message потомучто кроме нажатия ESC, надо отлавливать еще разные комбинации клавиш и мыши.
 
  
  if (Msg.Message = WM_KEYDOWN) and ((Msg.wParam = vk_ESCAPE)) then
  begin
    if (form1.Active) or (form2.Active) then begin
      form1.button5.Click;
      Msg.wParam:=0;
      Handled := false;
      Exit;
    end;
  end;
 
procedure TForm1.Button5Click(Sender: TObject);
begin
  if form1.active then form2.show else form2.close;
end;Также на Form1 есть ComboBox1 (csOwnerDrawFixed) в котором вывожу список в две колонки.
 
  
procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;  Rect: TRect; State: TOwnerDrawState);
var txt:string;
begin
 with Control as TComboBox do
 begin
   canvas.FillRect(rect);
   txt:=items[index];
   if pos(#9,txt)>0 then Delete(txt,pos(#9,txt),length(txt));
   canvas.TextOut(4,rect.Top,txt);
   txt:=items[index];
   if pos(#9,txt)>0 then Delete(txt,1,pos(#9,txt));
   canvas.TextOut(rect.Right-canvas.TextWidth(txt)-4,rect.Top,txt);
 end;
end; Проблема в том, что когда список ComboBox1 раскрыт и я нажимаю ESC, у меня появляется вторая форма на переднем плане но сам список Combobox1 не пропадает. Как и где его надо закрыть?
 
 И 2й вопрос.
 На этой же Form1 есть WebBrowser. Например я начинаю загружать страницу и сам в это время переключаюсь (нажимаю ESC) на вторую форму пока она грузится. Но иногда при загрузке некоторых страниц, Form1 вылезает на передний план и становится активной. Пробовал в IExplorer загружать эту же страницу и пока она грузилась переключался на другое окно (FAR manager) но и тут, при ее загрузке IE становился на передний план. В Firefox такого нету.
 Может надо както отлавливать момент активации окна и если окно с WebBrowser не активно, то както прервать процесс активации формы? Пробовал написать вот так:
 
  
protected
 procedure WM(Var Msg : TWMActivate); message WM_ACTIVATEAPP;
....
procedure TForm1.WM(var Msg: TWMActivate);
begin
  if ((msg.Active=WA_ACTIVE)or(msg.Active=WA_ClickACTIVE))and
     ((getactivewindow<>form1.Handle)or(getactivewindow<>form2.Handle))
  then  form1.Caption('акт.');
end;Так активация окна вроде бы пропала когда я нахожусь в какойто другой программе, но когда я работаю на Form2 и происходит загрузка страницы на Form1, то Form1 опять становится на передний план.
 Пробовал сделать в Form2 стиль fsStayOnTop, но тогда с Form2 фокус всеравно убегает на Form1 да и если я в этот момент например работаю в Far, то он тоже скрывается.
 
 Спасибо.
 
|  |   Вопрос задал: Толик (статус: Посетитель)Вопрос отправлен: 10 декабря 2010, 00:53
 Состояние вопроса: открыт, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 1; последнее сообщение — 10 декабря 2010, 11:06; участников в обсуждении: 1. 
|   | Вадим К (статус: Академик), 10 декабря 2010, 11:06 [#1]:Самое первое, что приходит в голову - отказаться от esc - всё таки у нее другое назначение, чем показывать форму. Хотя если это форма "отмены действия", то может быть... 
 С Combobox можно решить. у него должно быть событие OnDropDown, которое срабатывает когда он разворачивается. И вроде было свойство даже. Поэтому, при анализе нажатия esc можно просто не показывать вторую форму.
 
 А вот с IE - тут сложнее. Это у него такой назойливый стиль. Что бы все видели, что он там загрузил.
 Галочка "подтверждения прочтения" - вселенское зло. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |