![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
События в Лэйбле [D6, WinME]
SPeller © (2002-05-04 14:10:00)Столкнулся с такой вот штукой: есть форма, в которой по событиям MouseEnter и MouseLeave на Лэйблах происходит отрисовка некоего текста. Но если поверх неё показать модально другую форму, то по идее первая форма должна вести себя так как если бы Enabled был равен False и не воспринимать события мыши. С одной стороны это так, но вот события MouseLeave и MouseEnter продолжают работать причём странно! Программно невозможно определить что они работают. Вот пример кода:
TForm1 = class(TForm)
....
private
....
testover:boolean; {флаг, что форма2 показана}
public
....
end;
var
Form1: TForm1;
implementation
.......
...
{Где-то в коде показываем вторую форму}
Form2.showmodal;
testover:=true;
EndDoing; { Моя процедура для завершения некоторых действий}
...
procedure TForm1.lbl1MouseEnter(Sender: TObject);
begin
if testover then exit; {Выходим если форма2 показана}
_drawtext(tlabel(sender).Tag,true); {Отрисовка текста в своей пр-ре}
if testover then {Для проверки выводим в lbltest значение testover}
lbltest.caption:="True"
else
lbltest.caption:="False";
end;
procedure TForm1.lbl1MouseLeave(Sender: TObject);
begin
if testover then exit; {То же самое}
_drawtext(tlabel(sender).Tag,false);
if testover then
lbltest.caption:="True"
else
lbltest.caption:="False";
end;
По алгоритму если форма2 показана, то мы выходим из процедуры и не рисуем текст, всё правильно. Но на самом деле, при показе формы события отрабатываются, причём надпись на lbltest НИКОГДА не станет True, хотя testover верочно ставится в True и нигдев другом месте программы не используется.
Однако эта проблема легко решаема если поставить действия по показу второй формы в таком порядке:
testover:=true;
Form2.showmodal;
EndDoing;
Процедура EndDoing выполняется успешно и в том и в другом случаях.
Что это может быть такое ? В чём разница при выполнении первого и второго вариантов показа формы ?
Anatoly Podgoretsky (2002-05-05 07:35:00) [1]SPeller © (04.05.02 16:26)
if testover then exit;{То же самое}
_drawtext(tlabel(sender).Tag,false);
if testover then
lbltest.caption:="True"
Никогда не станет "True", не что и жалуешься
else
lbltest.caption:="False";
end;
По алгоритму если форма2 показана, то мы выходим из процедуры и не рисуем текст, всё правильно. Но на самом деле, при показе формы события отрабатываются, причём надпись на lbltest НИКОГДА не станет True, хотя testover верочно ставится в True и
SPeller (2002-05-05 04:35:00) [2]Ах вон оно чего.... Благодарю!
Набережных С. (2002-05-04 21:06:00) [3]Управление из ShowModal не вернется, пока Form2 не будет закрыта.
Ты делаешь testover:=true; после того, как форма закроется.
SPeller (2002-05-04 16:26:00) [4]2troits © (04.05.02 15:09)
Они происходят когда мышь "заходит" и покидает этот Лэйбл
2Anatoly Podgoretsky © (04.05.02 15:26)
А с чего бы ей стать "True" если if testover then exit;
А там где if testover then exit есть изменение значения testover ?? Смотрите внимательней код.
Anatoly Podgoretsky (2002-05-04 15:26:00) [5]А с чего бы ей стать "True" если if testover then exit;
troits (2002-05-04 15:09:00) [6]А что такое события MouseEnter и MouseLeave?
Когда они наступают? Просто D6 у меня нет, а в D5 у TLabel, по-моему, таких событий нет.