Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 805

Раздел: Delphi » Прочее
/ вопрос открыт /

Приветствую, уважаемые эксперты!
У меня есть два вопроса.
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 - тут сложнее. Это у него такой назойливый стиль. Что бы все видели, что он там загрузил.
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:41
Выполнено за 0.03 сек.