Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.05.2013, 21:06
Oreon Oreon вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 36
Репутация: 10
По умолчанию Событие MouseLeave формы

Добрый день, возникла проблема, необходимо среагировать на покидание мышью формы. Пробую MouseLeave. Оно не срабатывает для формы, поскольку форма занята компонентами. Для компонентов срабатывает. Обрабатывать ливы всего с чего можно покинуть форму или рассчитывать с таймером позицию курсора, как-то оно не то. Может можно все таки заставить его отработать на форме за всех компонентов? ))
PS
Код:
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;

Приводит к срабатываниям при переходе с компонента на компонент или сразу же при нажатии ЛКМ (а мне как раз надо отловить уход мыши с нажатой ЛКМ)
Ответить с цитированием
  #2  
Старый 06.05.2013, 21:32
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Можно через использование айпишной GetCapture
Код:
procedure TForm1.FormDeactivate(Sender: TObject);
begin
 ReleaseCapture;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
begin
 if GetCapture = 0 then SetCapture(Handle);
 if PtInRect(Rect(Left, Top, Left + Width, Top + Height), ClientToScreen(Point(x, y))) then
  Caption:= 'Мышка на форме'  else 
  Caption:= 'Мышка за пределами формы';
 inherited;
end;//  Drkb:: 01573
Ответить с цитированием
  #3  
Старый 07.05.2013, 22:45
Oreon Oreon вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 36
Репутация: 10
По умолчанию

Ну это почти что расчет позиции курсора, наверно... Спасибо, правда надеялся, что мне ткнут в чем моя ошибка и заработает событие формы
Ответить с цитированием
  #4  
Старый 07.05.2013, 23:15
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Oreon
...правда надеялся, что мне ткнут в чем моя ошибка и заработает событие формы
А что здесь тыкать, когда это событие и так работает? Вот пример в подтверждение

Код:
// В секции type формы
procedure frmMouseEnter(var AMsg: TMessage); message CM_MOUSEENTER;
procedure frmMouseLeave(var AMsg: TMessage); message CM_MOUSELEAVE;
...
var
 flg: boolean;
procedure TForm1.frmMouseEnter(var AMsg: TMessage);
begin
flg:= true;
// срабатывает когда мышка на форме
Refresh;
end;
procedure TForm1.frmMouseLeave(var AMsg: TMessage);
begin
flg:= false;
// срабатывает когда мышка ушла с формы
Refresh;
end;// Drkb: 01574
отслеживайте состояние flg, если он в true, то мышка на форме, если в false, то ушла за пределы, вот и всё.
Ответить с цитированием
  #5  
Старый 08.05.2013, 00:44
Oreon Oreon вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 36
Репутация: 10
По умолчанию

Я это пробовал:
Цитата:
Сообщение от Oreon
PS
Код:
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;

Приводит к срабатываниям при переходе с компонента на компонент или сразу же при нажатии ЛКМ (а мне как раз надо отловить уход мыши с нажатой ЛКМ)
так что не работаит, хоть может я и туплю где, но где?
PS вообще это мне надо для попытки обойти еще одну траблу с Drag&Drop, если вы возможно сможете помочь разобраться с Drag&Drop то ловить эти события не придется. (Трабла состоит в том, что у меня получается реализовать перетаскивания как внутри формы, так и на внешние приложения, но раздельно - совместно один из подвидов - отрубается)

Последний раз редактировалось Oreon, 08.05.2013 в 00:51.
Ответить с цитированием
  #6  
Старый 08.05.2013, 00:55
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Как ты проверяешь непонятно.
Код:
type
  TForm2 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    procedure MouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
    procedure MouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
  public
    { Public declarations }
  end;

var
  Form2: TForm2;
  Wnd  : HWND;

implementation

{$R *.dfm}

procedure TForm2.MouseEnter(var Msg: TMessage);
begin
  Label1.Caption := 'Мышка на форме';
end;

procedure TForm2.MouseLeave(var Msg: TMessage);
begin
  Label1.Caption := 'Мышка вне формы';
end;
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #7  
Старый 08.05.2013, 00:56
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Испытывал и с ЛКМ и с ПКМ и с колёсиком, на форме куча компонентов лежит, панелек и др. чепухи, уходит с формы и приходит на форму мыша норм., ни каких ложных срабатываний не наблюдаю, слежу за флажком.

З.Ы. Что-то здесь не так

Цитата:
...Трабла состоит в том, что у меня получается реализовать перетаскивания как внутри формы, так и на внешние приложения, но раздельно - совместно один из подвидов - отрубается...
Внутренний (внутри приложения) и внешний (работа с другими программами) Drag&Drop это совершенно независимые вещи, они никак не могут пересекаться т.к. борландовский интерфейс перетаскивания работает без использования виндовских функций API. Это наверное, другая тема.

Последний раз редактировалось Alegun, 08.05.2013 в 01:18.
Ответить с цитированием
  #8  
Старый 08.05.2013, 01:14
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

А зачем тебе флаг?
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #9  
Старый 08.05.2013, 01:24
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от angvelem
А зачем тебе флаг?
Проверка идёт в другой процедуре, где происходит вот это
Код:
if flg then Label1.Caption:= 'Мышка на форме' else Label1.Caption:='Мышка вне формы';
Ответить с цитированием
  #10  
Старый 08.05.2013, 01:30
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Ну тогда нужен Notify или таймер.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #11  
Старый 08.05.2013, 01:35
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Пора закрывать тему - ТС свалил предварительно объяснив что это всё ему не нужно, поскольку он реализует перетаскивание как внутри проги, так и с применением внешнего драга, а в этой топке была попытка закрыть одни косяки другими. Всё как обычно
Ответить с цитированием
  #12  
Старый 08.05.2013, 01:44
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Как всегда - Мне нужно a, как сделать b, c не предлагать.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
Alegun (08.05.2013)
  #13  
Старый 08.05.2013, 20:28
Oreon Oreon вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 36
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Пора закрывать тему - ТС свалил предварительно объяснив что это всё ему не нужно, поскольку он реализует перетаскивание как внутри проги, так и с применением внешнего драга, а в этой топке была попытка закрыть одни косяки другими. Всё как обычно
Ну зачем так ТС просто не имеет возможности сидеть в теме весь день, он туда вечером смотрит... А вообще нужно, и я благодарен за попытки мне помочь, глядишь и сам поумнею... Нащет косяков - согласен, разбираясь с одними пришел к другим, но мне и то и то интересно
Ответить с цитированием
  #14  
Старый 08.05.2013, 20:41
Oreon Oreon вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 36
Репутация: 10
По умолчанию

Проверил еще раз (у меня 2010)
Код:
procedure TMainForm.FormMouseEnter(Sender: TObject);
begin
ShowMessage('');
end;
- никакой реакции
Код:
procedure TMainForm.Image1MouseEnter(Sender: TObject);
begin
ShowMessage('');
end;
- при входе сообщение. Создал новый проект на пустой форме аналогичные события вызывают сообщения. Может у меня опция какая в параметрах формы вырубана по типу "KeyPreview ", только для мыши...
Вообще приложение имеет такую конфигурацию: вся форма закрыта несколькими панелями со сплитерами, и на панелях уже собственно элементы интерфейса
Ответить с цитированием
  #15  
Старый 08.05.2013, 20:55
Oreon Oreon вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 36
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Внутренний (внутри приложения) и внешний (работа с другими программами) Drag&Drop это совершенно независимые вещи, они никак не могут пересекаться .
В теории - согласен, на практике - когда стартует драг по форме (я тащу файл на дерево каталогов) я меняю курсор, при наведении на приемник ветки подсвечиваются, при нажимании шифт/контрол курсор тоже реагирует - все отлично, но когда я пробую задействовать в маусдаун команду
Код:
DoDragDrop(dataObj, Mainform, dwOKEffects, AResult);
- курсор меняется на системный, работает внешний драг, по форме уже не работает. Именно эти команды я хотел попробовать перевесить на мауслив и столкнулся с другой проблемой которая привела к старту темы. Так что если можете - ткните в ошибку или подскажите правильный путь

Последний раз редактировалось Oreon, 08.05.2013 в 20:57.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:52.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter