![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как можно определить момент выхода курсора мыши из компонента
TeNY © (2004-10-03 17:35:00)Как можно определить момент выхода курсора мыши из компонента
ЮЮ (2004-10-08 04:42:00) [1]Может и по образцу, не работающий код все равно никому, кроме тебя не видно. Вот этот например, работает, как и ожидалось, и без рекурсий:
procedure TForm1.Memo1MouseEnter(Sender: TObject);
begin
Caption := 'Âõîäèò ...';
Application.MessageBox('MouseEnter', 'Memo1', 0);
end;
procedure TForm1.Memo1MouseLeave(Sender: TObject);
begin
Caption := '... è âûõîäèò';
Memo1.Lines.Add('çàìå÷àòåëüíî âûõîäèò');
Application.MessageBox('MouseLeave', 'Memo1', 0);
end;
З.Ы. Дикое решение - на движение мыши выкидывать модальную форму: без Alt+F4 не выйти
TeNY (2004-10-07 11:43:00) [2]Код по вашему образцу писал, и кроме ShowMessage там ничего больше нет ...
ЮЮ (2004-10-07 06:28:00) [3]значит убери ShowMessage. Вероятно код в этом обработчике опять приводит к посылке сообщения CM_MOUSELEAVE. А причина - в твоем коде, значит тебе ошибку и искать :)
TeNY (2004-10-07 06:08:00) [4]Ещё одна проблема в случае если в функции MouseLeave Стоит ShowMessage() то обработчик начиент бесконечно отрабатывать её до ошибки переполнения буфера,почему?
TeNY (2004-10-06 19:57:00) [5]Спасибо,вроде разобрался
TeNY (2004-10-06 13:39:00) [6]подробнее пожалуйста,я никогда не созлавал своих компонентов поэтому всё в новинку
begin...end (2004-10-06 13:27:00) [7]
> [28] TeNY © (06.10.04 13:25)
inherited
TeNY (2004-10-06 13:25:00) [8]У меня возникла проблема следующего плана:Cozdaл компонентне основе SPSKINBUTTON добавив как сказано выше свойсво CM_mouseleave(надо сказать что у него уже было подобное свойсво только оно не работало),надо сказать что кнопка на которую наводиш курсор она цвет меняет,убираешь все возвращается в норму,так вот этого возвращения не происходит то есть событие обрабатывается только моим обработчиком.Вся проблема состоит в том что нет исходников этой кнопки.Так вот как сделать так что событие сначало обработалось одним обработчиком а затем передала упраление родному обработчику
TeNY (2004-10-06 12:00:00) [9]А можно ли через sender определить какие сообщения отправляюстя компоненту в частности находится ли над ним мышь
ЮЮ (2004-10-06 07:51:00) [10]Даже при беглом взгляде видно, что методы Goup и BUTClick ничем не отличаются (за исключением кода), поэтому и вызываются одинаково :)
procedure TForm1.BUTOnMouseEnter(Sender: TObject);
begin
Goup(Sender);
BUTClick(Sender);
// или TButton(Sender).Click;
end;
В первом случае вызывается метод BUTClick, независимо, эта ли процедура назначена в качестве обработчика OnClick кнопки
Во втором же, вызывается именно тот обработчик, который назначен Sender-у
TeNY (2004-10-06 07:13:00) [11]Понятно.А можно ли с помощью Sender организовать взаимодейсвие по следующему алгоритме к примеру есть 5 кнопок и у каждой есть обработчик типа BUTOnMouseEnter
...
procedure TForm1.BUTOnMouseEnter(Sender: TObject);
begin
goup(sender)
end;
procedure TForm1.goup(OBJECT: TObject);
begin
////
////
///
end;
procedure TForm1.BUTClick(Sender: TObject);
begin
ShowMessage('It's OK!')
end;
так как нужно процедуру goup чтобы оно в зависимости от sender вызывала типа ОбьектЩелчок в данном случае BUTClick
ЮЮ (2004-10-06 03:45:00) [12]Sender - это объект, для которого выполняется код этого обработчика. Для доступа к св-вам этого объекта следеет привести его к нужному типу, удостоверившишь, что такое приведение типов допустимо, например
procedure TForm1.Memo1OnMouseEnter(Sender: TObject);
begin
Caption := 'Вошли в объект класса ' + Sender.ClassName;
if (Sender is TComponent) and (TComponent(Sender).Name <> '') then
Caption := Caption + ' [' TComponent(Sender).Name + ']';
end;
TeNY (2004-10-05 19:08:00) [13]а как Sender: TObjectпользоватся обьясните пожалуйста
ЮЮ (2004-10-05 09:17:00) [14]>а вот что куда писать чтобы в инспекторе обьектов появилось свойство
поместить в секцию published (а не в public, как в [14])
Но тогда, по-моему, не прокатит с
TMemo = class(StdCtrls.TMemo)
Класс придется называть иначе, дабы он появился на палитре компонентов, а стало быть правки будет гораздо больше - и в pas и в dfm, чтобы св-во появилось в инспекторе
TeNY (2004-10-05 08:40:00) [15]так это он создает компонент а просто добавил событие
а компонент создается в такой форме
unit xxx;
interface
uses
xxx;
type
TXXX = class(TXXX)
private
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Standard', [TActionManager1]);
end;
end.
а вот что куда писать чтобы в инспекторе обьектов появилось свойсво mouseleave я не знаяю вот и спрашиваю
begin...end (2004-10-05 08:06:00) [16]
> [19] TeNY © (05.10.04 07:46)
> А можно в таком случае (если один обработчик)получить от
> какой кнопки идет вызов.
Можно. Sender: TObjectтебе ни о чём не говорит?
> И я не совсем понял что за см. [14].
См. пост № 14 ( ЮЮ © (04.10.04 09:13) )
TeNY (2004-10-05 07:46:00) [17]А можно в таком случае (если один обработчик)получить от какой кнопки идет вызов.
И я не совсем понял что за см. [14].
begin...end (2004-10-04 14:08:00) [18]
> [16] TeNY © (04.10.04 10:46)
> как можно добавить это свойсво к самому компоненту
Написать наследника, см. [14].
> каждому писать ему обработчик
Один и тот же обработчик можно назначить 10 кнопкам.
TeNY (2004-10-04 12:10:00) [19]<><img scr='AY'><>
TeNY (2004-10-04 10:46:00) [20]Это всё очень хорошо,но как можно добавить это свойсво к самому компоненту а то у меня около 10ка кнопок и каждому писать ему обработчик...
Обьясните пожалуйста