tavria2

Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Zloy_Gelud Цитата: ...я положил конец написав функцию ListBoxEx.GetSelectedCount() | Молодец, поздравляю! Цитата: Она прекрасно работает, но только на вкладке On Mouse Button... | В своей ф-ции ты используешь локальные переменные события On Mouse Button: e_Type, e_X и e_Y, т.к. они локальные то и работать будут в пределах текущего события. Если хочешь вынести свою ф-цию за пределы On Mouse Button, тогда нужно в ф-цию передать локальные переменные, как параметры. Замечания: Обрабатывай e_Type до вызова ф-ции. Событие навешивается не на нажатую кнопку мышки, а на отжатую: e_Type = RIGHT_BUTTON_UP; В расчете позиции элемента ты используешь константу (15), которая вылезет боком при изменении размера шрифта. Если сделать правый клик на 2-м элементе ListBox'а, при размере шрифта 14pt - результатом будет 3-й элемент. Предлагаю свой вариант, в котором не нужно учитывать бордюры и размер шрифта, а также не нужно указывать имя ListBox'а, которое будет определяться автоматом и возвращаться ф-цией вместе с индекстом выделенного элемента. Global functions Добавлено: Принудительное прерывание цикла, если найден нужный объект. Код: --[[ Ф-ция возвращает таблицу с индексами: Name - имя ListBox и Index - индекс элемента, на котором был произведен правый клик мышкой. Если правый клик был не на элементе ListBox'а, то ф-ция возвращает nil. ]]-- function RClickLisBox() local X = System.GetMousePosition(false).X; -- экранная позиция мышки X local Y = System.GetMousePosition(false).Y; -- экранная позиция мышки Y -- получаем handle окна, которое находится под курсором мышки local hWnd = DLL.CallFunction("user32.dll","WindowFromPoint", X..","..Y, DLL_RETURN_TYPE_LONG, DLL_CALL_STDCALL); local tObjects = Page.EnumerateObjects(); -- список объектов страницы for n, cName in tObjects do -- перебираем в цикле - имена объектов -- если этот объект - ListBox и его handle совпадает с handle окна под курсором мышки if (Page.GetObjectType(cName) == OBJECT_LISTBOX and String.ToNumber(ListBox.GetProperties(cName).WindowHandle) == String.ToNumber(hWnd)) then -- если ListBox local tProp = ListBox.GetProperties(cName); -- св-ва ListBox local tMousePos = System.GetMousePosition(true); -- оконная позиция мышки local LB_ITEMFROMPOINT = 425; -- (h1A9) параметр API ф-ции local lParam = (tMousePos.Y - tProp.Y) * 65536 + (tMousePos.X - tProp.X); -- параметр API ф-ции -- получаем индекс элемента ListBox под курсором мышки local nIdx = DLL.CallFunction("user32.dll", "SendMessageA", hWnd..","..LB_ITEMFROMPOINT..",0,"..lParam, DLL_RETURN_TYPE_LONG, DLL_CALL_STDCALL); nIdx = nIdx + 1; -- увеличиваем индекс на 1, т.к. API-ф-ция назначает 1-му элементу - 0-й индекс. if (nIdx <= ListBox.GetCount(cName)) then -- если индекс не превышает максимальное кол-во элементов в ListBox'е ListBox.SelectItem(cName, nIdx); -- выделяем элемент ListBox'а, на котором был правый клик return {Name = cName, Index = nIdx} -- возвращаем таблицу значений end break; -- принудительное прерывание цикла end end end ListBoxEx = {RClick = RClickLisBox}; -- объявляем действие ListBoxEx.RClick | On Mouse Button Код: if (e_Type == RIGHT_BUTTON_UP) then -- если нажата правая кнопка мышки tRes = ListBoxEx.RClick(); -- получаем имя ListBox и индекс элемента на котором был правый клик if tRes then -- если есть таблица значений Dialog.Message(tRes.Name, "SelectItem: "..tRes.Index); end end |
| Всего записей: 1127 | Зарегистр. 19-01-2005 | Отправлено: 17:17 05-01-2008 | Исправлено: tavria2, 22:53 05-01-2008 |
|