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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 20.10.2012, 23:59
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от YVitaliy
Код:
procedure TForm1.sbt_StatMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  pt: TPoint;
begin
  sbt_Stat.Perform( BM_SETSTATE, 1, 0 );
  with Sender as TButton do
  begin
    pt := Point(Left, Top + Height);
    pt := Parent.ClientToScreen(pt);
  end;
  PopupMenu1.Popup(pt.X, pt.Y);
  sbt_Stat.Perform( BM_SETSTATE, 0, 0 );
end;
В OnMouseMove.
Ну если от Sender'а отталкиваться - тогда уж до конца :
Код:
procedure TForm1.sbt_StatMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
  pt: TPoint;
begin
  with Sender as TButton do
  begin
    Perform(BM_SETSTATE, 1, 0);
    pt := Parent.ClientToScreen(Point(Left, Top + Height));
    PopupMenu1.Popup(pt.X, pt.Y);
    Perform(BM_SETSTATE, 0, 0);
  end;
end;

p.s. Хотя конструкцию with я недолюбливаю...
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
DOR (21.10.2012)
  #17  
Старый 21.10.2012, 09:24
DOR DOR вне форума
Начинающий
 
Регистрация: 14.01.2011
Сообщения: 171
Версия Delphi: 7
Репутация: 10
По умолчанию

Не сочтите за наглость, так чтобы было вообще при вообще, как сделать чтобы при смене фокуса меню закрывалось. Спасибо.
Ответить с цитированием
  #18  
Старый 21.10.2012, 13:24
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от DOR
Не сочтите за наглость, так чтобы было вообще при вообще, как сделать чтобы при смене фокуса меню закрывалось. Спасибо.
Ничего не делать - при потере фокуса меню и так скрывается (обычно).
Ответить с цитированием
  #19  
Старый 21.10.2012, 13:34
DOR DOR вне форума
Начинающий
 
Регистрация: 14.01.2011
Сообщения: 171
Версия Delphi: 7
Репутация: 10
По умолчанию

Хм, у меня не скрывается, приходиться щелкнуть в свободном месте, только после этого пропадает.
Ответить с цитированием
  #20  
Старый 21.10.2012, 13:45
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

При смене фокуса на такую же кнопку с выпадающим меню?
Ответить с цитированием
  #21  
Старый 21.10.2012, 13:47
DOR DOR вне форума
Начинающий
 
Регистрация: 14.01.2011
Сообщения: 171
Версия Delphi: 7
Репутация: 10
По умолчанию

Не всегда, иногда это просто кнопка, иногда на выпадающую
Ответить с цитированием
  #22  
Старый 21.10.2012, 14:11
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Может так? Но я пока только с таймером допер.
ЗЫ Кусок кода
Код:
if  form1.ControlAtPos(pt,true,true).ClassType = TButton then
     if form1.ControlAtPos(pt,true,true).Tag=54 then
     Button1MouseMove(form1.ControlAtPos(pt,true,true),[],pt.X, pt.Y);
 
в обработчике таймера удали, если используешь OnMouseMove для TButton.
Вложения
Тип файла: rar popup.rar (1.9 Кбайт, 17 просмотров)

Последний раз редактировалось YVitaliy, 21.10.2012 в 14:14.
Ответить с цитированием
  #23  
Старый 21.11.2012, 00:01
DOR DOR вне форума
Начинающий
 
Регистрация: 14.01.2011
Сообщения: 171
Версия Delphi: 7
Репутация: 10
По умолчанию

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

Цитата:
Сообщение от DOR
Возвращаясь к теме, в выложенном примере, скрытие меню происходит только если перевести курсор на какой нить другой буттон, а не убрать фокус с кнопки и при этом (после скрытия меню) кнопка под которым вылазило меню, остается вжатой (. Помогите пожалуйста добить эту тему.
Нашёл в тырнете один варьянт как заставить "убраться" попапку после слёта с неё курсора, но он очень громоздкий, более 100 строк и около 5ти процедур в теле, это не айс, да в добавок он глючный, нарушает всю аплику, потому забил на энто дело. Есть более простые, на мой взгляд, способы - либо по таймеру послать эмульку эскейпа, (программно нажать на баттон Esc) типа:
Код:
keybd_event(VK_ESCAPE, MapVirtualKey(VK_ESCAPE, 0), 0, 0);
keybd_event(VK_ESCAPE, MapVirtualKey(VK_ESCAPE, 0), KEYEVENTF_KEYUP,0);
либо постануть попапке мессагу WM_NULL типа:
Код:
PostMessage(PopupMenu.Handle, WM_NULL, 0, 0);
Но здесь свои подводные каменюги: вроде нужно ловить сообщения для/от всплывающей менюхи, особливо про схождение с неё грызуна чтоб таймер включить (по идее это возможно, исчезает же при уходе выделение пунктов, здесь наверное задействуются WM_ENTERMENULOOP или WM_EXITMENULOOP, точно не проверял, походу эти мессаги в обход класса проходят) иначе, закроется менюшка даже под мышой, но к сожалению, я таких заморочек не знаю, только лишь открыто/закрыто на ум приходит(GetGUIThreadInfo:= GUITHREADINFO.hwndMenuOwner = 0:закр; <>0: откр) но это всё шлётся после клика по пунктам меню:-( Однажды я с таким сталкивался, плюнул, и сварганил эрзац попапки из связки панель+листбокс, но это было давно и очень нудно.
Ещё могу предложить немного модифицнуть в примере процедуру Button1MouseMove, дописав первой строчкой вот это:
Код:
if Application.Active then begin ...всё остальное... end;
иначе попапка будет вылазить и при неактивной форме, или сквозь другие проги, что не совсем хорошо.
Ответить с цитированием
  #25  
Старый 24.11.2012, 04:41
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Вот ещё бы в темочке писатеньки без выпендрёжечка.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
Alegun (24.11.2012)
  #26  
Старый 24.11.2012, 04:48
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от angvelem
Вот ещё бы в темочке писатеньки без выпендрёжечка.
Хаяшо:-), учту на будущее!
Ответить с цитированием
  #27  
Старый 24.11.2012, 09:09
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,036
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Alegun
Хаяшо:-), учту на будущее!

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

Цитата:
Сообщение от lmikle
Ну, если надо отследить именно уход фокуса, то в обработчике события OnExit надо просто проверить, что меню еще открыто, и если да, то просто закрыть его.
К сожалению, OnExit происходит после потери фокуса всплывающим меню посредством клика мышки или клавы :-( , а ТС нужно отловить именно момент ухода курсора с формы меню (фокус на ней остаётся).
Ответить с цитированием
  #29  
Старый 25.11.2012, 01:30
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Я в самопальном меню использовал WM_MOUSELEAVE.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #30  
Старый 25.11.2012, 03:23
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Для выхода я в примере использую EndMenu - должна закрывать все меню, так что эмулировать esc нет смысла.

Для "убора" фокуса с кнопки нужно (!) кликнуть по какому-нибудь другому контролу. Сам по себе фокус никуда не денется (если конечно не убирать его "вручную"). А для клика на другой контрол нужно навести на него мышь (при открытом меню tab не работает). А процедура (которая в таймере) отлавливает это наведение, и закрывает все меню, если tag в этого контрола не равен 55. В примере лежит и панель, неужели при наведении на нее меню не закрывается?
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter