|
Вопрос # 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 - тут сложнее. Это у него такой назойливый стиль. Что бы все видели, что он там загрузил.
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|