Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.04.2010, 19:52   #1
skalt12
Пользователь
 
Регистрация: 05.07.2009
Сообщений: 87
По умолчанию onMouseLeave на TImage или TForm

привет всем, вопрос такой появился, вот смотрите, создал компонент Image свой, с поддержкой onMouseLeave, все работает, но чуть-чуть не получается реализовать реакцию на уход мыши... то есть, навожу на определенный фрагмент на форме, появляется кнопочка, например, убираю мышь с этого фрагмента, кнопочка исчезает, а если, например, убирать мышь с этого фрагмента не на форму, а куда-то вне ее сразу, то кнопочка не исчезает...

Код:
procedure TForm1.bgImgMouseEnter(Sender: TObject);
begin
  barImg.Show;
end;

procedure TForm1.bgImgMouseLeave(Sender: TObject);
begin
  barImg.Hide;
end;
может что подскажете?
skalt12 вне форума Ответить с цитированием
Старый 14.04.2010, 21:10   #2
xakkkkker
Форумчанин
 
Аватар для xakkkkker
 
Регистрация: 15.12.2007
Сообщений: 226
По умолчанию

Не совсем понял........А как работает Моус лив? Обработай такие событие как Mouse Move (Перемещение). Посмотри вложение может чем поможет
Вложения
Тип файла: rar Новая папка.rar (6.1 Кб, 16 просмотров)

Последний раз редактировалось xakkkkker; 14.04.2010 в 21:20.
xakkkkker вне форума Ответить с цитированием
Старый 15.04.2010, 01:00   #3
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

А какая версия Delphi? В новых дельфях эти события есть, если их нет к примеру у TImage, то просто опубликуй их (published) от предков.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 15.04.2010, 12:46   #4
skalt12
Пользователь
 
Регистрация: 05.07.2009
Сообщений: 87
По умолчанию

собственно, версия 7... код компаненты вот:
Код:
unit ImageEx;

 interface

 uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
   Dialogs, ExtCtrls;

 type
   TImageEx = class (TImage)
   private
     { Private declarations }
     FOnMouseLeave: TNotifyEvent;
     FOnMouseEnter: TNotifyEvent;
     procedure CMMouseEnter(var msg: TMessage);
       message CM_MOUSEENTER;
     procedure CMMouseLeave(var msg: TMessage);
       message CM_MOUSELEAVE;
   protected
     { Protected declarations }
     procedure DoMouseEnter; dynamic;
     procedure DoMouseLeave; dynamic;
   public
     { Public declarations }
   published
     { Published declarations }
     property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
     property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
   end;

 procedure Register;

 implementation

 procedure Register;
 begin
   RegisterComponents('Additional', [TImageEx]);
 end;

 { TImageEx }

 procedure TImageEx.CMMouseEnter(var msg: TMessage);
 begin
   DoMouseEnter;
 end;

 procedure TImageEx.CMMouseLeave(var msg: TMessage);
 begin
   DoMouseLeave;
 end;

 procedure TImageEx.DoMouseEnter;
 begin
   if Assigned(FOnMouseEnter) then FOnMouseEnter(Self);
 end;

 procedure TImageEx.DoMouseLeave;
 begin
   if Assigned(FOnMouseLeave) then FOnMouseLeave(Self);
 end;

 end.
Поступил более ламерским путём - добавил на форму свой компонент Image, по краям оставил место пустое, когда на этот компонент наводим мышью, появляется нужный объект, когда мышь попадает в область вне этого Image - объект исчезает.. Но только вот, очередная проблема - если быстро-быстро мышь убрать с формы, то обьект не исчезает..
skalt12 вне форума Ответить с цитированием
Старый 15.04.2010, 12:57   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
если быстро-быстро мышь убрать с формы, то обьект не исчезает..
Да есть такой прикол. Я иногда при OnMouseEnter запускаю параллельно поток (или таймер кому как нравится) и в потоке проверяю где мышка.
Тогда все работает более менее, и без OnMouseLeave
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.04.2010, 17:30   #6
skalt12
Пользователь
 
Регистрация: 05.07.2009
Сообщений: 87
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Да есть такой прикол. Я иногда при OnMouseEnter запускаю параллельно поток (или таймер кому как нравится) и в потоке проверяю где мышка.
Тогда все работает более менее, и без OnMouseLeave
ну да... тоже вариант

Последний раз редактировалось skalt12; 15.04.2010 в 17:54.
skalt12 вне форума Ответить с цитированием
Старый 15.04.2010, 18:49   #7
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Вот как это сделано в стандарте
Код:
private
    procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
...

{$IF DEFINED(CLR)}
procedure TControl.DoMouseEnter;
begin
  FParent.Perform(CM_MOUSEENTER, meTControl, FParent.FControls.IndexOf(Self));
end;

procedure TControl.DoMouseLeave;
begin
  FParent.Perform(CM_MOUSELEAVE, meTControl, FParent.FControls.IndexOf(Self));
end;
{$IFEND}

procedure TControl.CMMouseEnter(var Message: TMessage);
begin
  if FParent <> nil then
{$IF DEFINED(CLR)}
    DoMouseEnter;
  if (Message.WParam = 0) then
{$ELSE}
    FParent.Perform(CM_MOUSEENTER, 0, Longint(Self));
  if (Message.LParam = 0) then
{$IFEND}
  begin
    if Assigned(FOnMouseEnter) then
      FOnMouseEnter(Self);

    if ShowHint and not (csDesigning in ComponentState) then
      if CustomHint <> nil then
        CustomHint.ShowHint(Self);
  end;
end;

procedure TControl.CMMouseLeave(var Message: TMessage);
begin
 if FParent <> nil then
{$IF DEFINED(CLR)}
   DoMouseLeave;
  if (Message.WParam = 0) then
{$ELSE}
    FParent.Perform(CM_MOUSELEAVE, 0, Longint(Self));
  if (Message.LParam = 0) then
{$IFEND}
  begin
    if Assigned(FOnMouseLeave) then
      FOnMouseLeave(Self);

    if ShowHint and not (csDesigning in ComponentState) then
      if CustomHint <> nil then
        CustomHint.HideHint(Self);
  end;
end;
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Событие TForm HTL Общие вопросы Delphi 4 20.01.2010 18:51
TForm & TImage & PNG & Прозрачность delphi_beginner Общие вопросы Delphi 7 19.09.2009 08:46
Чтение из TForm Пaвeл Общие вопросы Delphi 3 29.03.2009 16:23
TForm NieL Общие вопросы Delphi 9 15.12.2008 18:37
Всавка из TImage в Excel или Word nevo Компоненты Delphi 6 09.10.2008 12:01