Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.10.24;
Скачать: [xml.tar.bz2];

Вниз

Как можно определить момент выхода курсора мыши из компонента   Найти похожие ветки 

 
TeNY ©   (2004-10-03 17:35) [0]

Как можно определить момент выхода курсора мыши из компонента


 
Рыба ©   (2004-10-03 18:07) [1]

CMMouseLeave


 
TeNY ©   (2004-10-03 18:45) [2]

А подробнее пожалуйста...
:(


 
TeNY ©   (2004-10-03 19:36) [3]

Ни у одной кнопки нет события MouseLeave или CMMouseLeave


 
KilkennyCat ©   (2004-10-03 19:38) [4]

добавляем

procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;


 
KilkennyCat ©   (2004-10-03 19:39) [5]


> TeNY ©   (03.10.04 19:36) [3]


вот в исходник компонента кнопки и добавляем... но лучше написать свой, отталкиваясь от стандартной кнопки.


 
Zeqfreed ©   (2004-10-03 19:40) [6]


TForm1 = class(TForm)...
private
procedure CMMouseLeave(var Msg : TMessage); message CM_MouseLeave;
...

procedure TForm1.CMMouseLeave(var Msg : TMessage);
begin
//Здесь твои действия
end;


Писал наизусть... если что не так, извиняй ;)


 
TeNY ©   (2004-10-04 05:57) [7]

Спасибо!


 
AlexV   (2004-10-04 08:39) [8]

А как обработать выход курсора мыши не из формы, а из некоторого другого компоненты, например, memo, который лежит на форме Form1


 
piople ©   (2004-10-04 08:43) [9]


> AlexV

Создать данный обработчик события для Memo, который лежит на Form1 ;))))


 
Wish ©   (2004-10-04 08:43) [10]

Наверху же все написанно, просто подставб свой TMemo и наслаждайся жизнью! =)


 
AlexV   (2004-10-04 08:51) [11]

Вот это меня и интересует, как именно создать этот обработчик не для формы, а для Memo.


 
piople ©   (2004-10-04 08:54) [12]

Удалено модератором


 
AlexV   (2004-10-04 08:56) [13]

Ну не знаю, как это делать, что теперь :-(


 
ЮЮ ©   (2004-10-04 09:13) [14]



unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TMemo = class(StdCtrls.TMemo)
 private
   FOnMouseLeave: TNotifyEvent;
   FOnMouseEnter: TNotifyEvent;

   procedure CMMouseEnter(var Msg : TMessage); message CM_MouseEnter;
   procedure CMMouseLeave(var Msg : TMessage); message CM_MouseLeave;
 public
   property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
   property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
 end;

 TForm1 = class(TForm)
   Memo1: TMemo;
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
   procedure Memo1OnMouseEnter(Sender: TObject);
   procedure Memo1OnMouseLeave(Sender: TObject);
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

{ TMemo }

procedure TMemo.CMMouseEnter(var Msg: TMessage);
begin
 if Assigned(FOnMouseEnter) then FOnMouseEnter(Self);
end;

procedure TMemo.CMMouseLeave(var Msg: TMessage);
begin
 if Assigned(FOnMouseLeave) then FOnMouseLeave(Self);
end;

procedure TForm1.Memo1OnMouseLeave(Sender: TObject);
begin
 Caption := "... и выходит";
 Memo1.Lines.Add("замечательно выходит");
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Memo1.OnMouseEnter := Memo1OnMouseEnter;
 Memo1.OnMouseLeave := Memo1OnMouseLeave;
end;

procedure TForm1.Memo1OnMouseEnter(Sender: TObject);
begin
 Caption := "Входит ...";
end;

end.



 
AlexV   (2004-10-04 09:40) [15]

Спасибо ЮЮ
:-)


 
TeNY ©   (2004-10-04 10:46) [16]

Это всё очень хорошо,но как можно добавить это свойсво к самому компоненту а то у меня около 10ка кнопок и каждому писать ему обработчик...

Обьясните пожалуйста


 
TeNY ©   (2004-10-04 12:10) [17]

<><img scr="AY"><>


 
begin...end ©   (2004-10-04 14:08) [18]


> [16] TeNY ©   (04.10.04 10:46)


> как можно добавить это свойсво к самому компоненту

Написать наследника, см. [14].

> каждому писать ему обработчик

Один и тот же обработчик можно назначить 10 кнопкам.


 
TeNY ©   (2004-10-05 07:46) [19]

А можно в таком случае (если один обработчик)получить от какой кнопки идет вызов.

И я не совсем понял что за см. [14].


 
begin...end ©   (2004-10-05 08:06) [20]


> [19] TeNY ©   (05.10.04 07:46)


> А можно в таком случае (если один обработчик)получить от
> какой кнопки идет вызов.

Можно. Sender: TObject тебе ни о чём не говорит?

> И я не совсем понял что за см. [14].

См. пост № 14 ( ЮЮ © (04.10.04 09:13) )


 
TeNY ©   (2004-10-05 08:40) [21]

так это он создает компонент а просто добавил событие
а компонент создается в такой форме
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 я не знаяю вот и спрашиваю


 
ЮЮ ©   (2004-10-05 09:17) [22]

>а вот что куда писать чтобы в инспекторе обьектов появилось свойство

поместить в секцию published (а не в public, как в [14])

Но тогда, по-моему, не прокатит с
 TMemo = class(StdCtrls.TMemo)
Класс придется называть иначе, дабы он появился на палитре компонентов, а стало быть правки будет гораздо больше - и в pas и в dfm, чтобы св-во появилось в инспекторе


 
TeNY ©   (2004-10-05 19:08) [23]

а как Sender: TObject пользоватся обьясните пожалуйста


 
ЮЮ ©   (2004-10-06 03:45) [24]

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-06 07:13) [25]

Понятно.А можно ли с помощью 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 07:51) [26]

Даже при беглом взгляде видно, что методы Goup и BUTClick ничем не отличаются (за исключением кода), поэтому и вызываются одинаково :)

procedure TForm1.BUTOnMouseEnter(Sender: TObject);
begin
 Goup(Sender);
 BUTClick(Sender);
 // или TButton(Sender).Click;
end;

В первом случае вызывается метод BUTClick, независимо, эта ли процедура назначена в качестве обработчика OnClick кнопки

Во втором же, вызывается именно тот обработчик, который назначен Sender-у


 
TeNY ©   (2004-10-06 12:00) [27]

А можно ли через sender определить какие сообщения отправляюстя компоненту в частности находится ли над ним мышь


 
TeNY ©   (2004-10-06 13:25) [28]

У меня возникла проблема следующего плана:Cozdaл компонентне основе SPSKINBUTTON добавив как сказано выше свойсво CM_mouseleave(надо сказать что у него уже было подобное свойсво только оно не работало),надо сказать что кнопка на которую наводиш курсор она цвет меняет,убираешь все возвращается в норму,так вот этого возвращения не происходит то есть событие обрабатывается только моим обработчиком.Вся проблема состоит в том что нет исходников этой кнопки.Так вот как сделать так что событие сначало обработалось одним обработчиком а затем передала упраление родному обработчику


 
begin...end ©   (2004-10-06 13:27) [29]


> [28] TeNY ©   (06.10.04 13:25)

inherited


 
TeNY ©   (2004-10-06 13:39) [30]

подробнее пожалуйста,я никогда не созлавал своих компонентов поэтому всё в новинку


 
TeNY ©   (2004-10-06 19:57) [31]

Спасибо,вроде разобрался


 
TeNY ©   (2004-10-07 06:08) [32]

Ещё одна проблема в случае если в функции MouseLeave Стоит ShowMessage() то обработчик начиент бесконечно отрабатывать её до ошибки переполнения буфера,почему?


 
ЮЮ ©   (2004-10-07 06:28) [33]

значит убери ShowMessage. Вероятно код в этом обработчике опять приводит к посылке сообщения CM_MOUSELEAVE. А причина - в твоем коде, значит тебе ошибку и искать :)


 
TeNY ©   (2004-10-07 11:43) [34]

Код по вашему образцу писал, и кроме ShowMessage там ничего больше нет ...


 
ЮЮ ©   (2004-10-08 04:42) [35]

Может и по образцу, не работающий код все равно никому, кроме тебя не видно. Вот этот например, работает, как и ожидалось, и без рекурсий:

procedure TForm1.Memo1MouseEnter(Sender: TObject);
begin
 Caption := "&#194;&#245;&#238;&#228;&#232;&#242; ...";
 Application.MessageBox("MouseEnter", "Memo1", 0);
end;

procedure TForm1.Memo1MouseLeave(Sender: TObject);
begin
 Caption := "... &#232; &#226;&#251;&#245;&#238;&#228;&#232;&#242;";
 Memo1.Lines.Add("&#231;&#224;&#236;&#229;&#247;&#224;&#242;&#229;&#235;&#252;&#237;&#238; &#226;&#251;&#245;&#238;&#228;&#232;&#242;");
 Application.MessageBox("MouseLeave", "Memo1", 0);
end;


З.Ы. Дикое решение - на движение мыши выкидывать модальную форму: без Alt+F4 не выйти



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.10.24;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.075 c
4-1095862398
nika_ufc
2004-09-22 18:13
2004.10.24
шрифты


14-1096648446
Abuzer
2004-10-01 20:34
2004.10.24
FreeReport


1-1097049347
456
2004-10-06 11:55
2004.10.24
создать кнопку (на форме) во время работы программы


14-1097135766
Mike Kouzmine
2004-10-07 11:56
2004.10.24
Скончался Морис Уилкинс


14-1096547992
aleshap
2004-09-30 16:39
2004.10.24
Таблица - Grid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский