Текущая позиция в DI_LISTBOX при включении фильтра

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
Post Reply
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Текущая позиция в DI_LISTBOX при включении фильтра

Post by buniak_a_h »

Мне кажется, или я нашёл ошибку?
Ситуация: имеется элемент DI_LISTBOX. Юзер нажал CtrlAltF (включение фильтра) и ввёл такую букву, из-за которой текущая строка отфильтровывается (происходит перемещение на новую позицию в списке). После этого её (новую позицию) невозможно (или я не знаю как) определить.
Вот маленький пример. Обратите внимание, что SelectPos == 0 !!!
  1. local F = far.Flags
  2.  
  3. local w,h = 50,10
  4.  
  5. local List={}
  6.  
  7. for i=utf8.byte('A'), utf8.byte('Z') do List[#List+1]={Text=utf8.char(i):rep(20), Flags={}} end
  8.  
  9. local aDlg = { {'DI_LISTBOX',3,1,46,9,List,0,0,0,'Тест'} }
  10.  
  11. local function fDlg(hDlg, Msg)
  12.  
  13.  if Msg == F.DN_LISTCHANGE then
  14.  
  15.   local aPos = hDlg:send(F.DM_LISTGETCURPOS, 1)
  16.  
  17.   --[[*D*]]far.Show('15: ', 'aPos.TopPos', aPos.TopPos, 'aPos.SelectPos', aPos.SelectPos)
  18.  
  19.  end
  20.  
  21. end
  22.  
  23. far.Dialog(win.Uuid'D92C28E5-AB8B-4BBD-A882-D25CAE468AB9', -1, -1, w,h,nil,aDlg,nil,fDlg)
Для воспроизведения:
1. Запустите скрипт (lua:@err.lua)
2. Включите режим фильтрации (CtrlAltF)
3. Введите букву Z (например. Главное - не A)
На экран выведется содержимое ответа на сообщение DM_LISTGETCURPOS. Обратите внимание на aPos.SelectPos!
Last edited by HaRT on Sun 25 Apr, 2021 22:28, edited 2 times in total.
Reason: Убрано спец. оформление Темы (Значок)
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Текущая позиция в DI_LISTBOX при включении фильтра

Post by citRiks »

buniak_a_h, если сделать так, позицию получаем в Prm2:

Code: Select all

local F = far.Flags
local w,h = 50,10
local List={}
for i=utf8.byte('A'), utf8.byte('Z') do List[#List+1]={Text=utf8.char(i):rep(20), Flags={}} end
local aDlg = { {'DI_LISTBOX',3,1,46,9,List,0,0,0,'Тест'} }
local function fDlg(hDlg, Msg, Prm1, Prm2) -- <<== !! CHANGE HERE
 if Msg == F.DN_LISTCHANGE then
  le({evt = Msg, ctl_id = Prm1, pos_new = Prm2 }) -- <<== !! CHANGE HERE
  local aPos = hDlg:send(F.DM_LISTGETCURPOS, 1)
  --[[*D*]]far.Show('15: ', 'aPos.TopPos', aPos.TopPos, 'aPos.SelectPos', aPos.SelectPos)
    return false -- <<== !! CHANGE HERE !! ЭТО ТО ЧТО ДЕЛАЕТ ЗАЦИКЛИВАНИЕ
 end
end
far.Dialog(win.Uuid'D92C28E5-AB8B-4BBD-A882-D25CAE468AB9', -1, -1, w,h,nil,aDlg,nil,fDlg)
То что по запросу DM_LISTGETCURPOS мы получаем неактуальное значение "0",
это наверное все же логично, потому что событие еще не завершилось,
и его можно даже запретить вернув false:
https://api.farmanager.com/ru/dialogapi ... hange.html
правда тогда в этом скрипте это будет замкнутый цикл.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Текущая позиция в DI_LISTBOX при включении фильтра

Post by buniak_a_h »

citRiks wrote: Sun 25 Apr, 2021 22:49 buniak_a_h, если сделать так, позицию получаем в Prm2:
В Prm2 - новая позиция, которая будет после перемещения. А меня интересовало как раз то положение, которое было до перемещения. Например, в отдельном окне - редактирование значения. А при перемещении надо сохранить введённое в "старую" запись.
Ладно, буду запоминать в своей переменной, куда перешёл в прошлый раз.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Текущая позиция в DI_LISTBOX при включении фильтра

Post by citRiks »

buniak_a_h wrote: Sun 25 Apr, 2021 21:48 После этого её (новую позицию) невозможно (или я не знаю как) определить.
buniak_a_h wrote: Sun 25 Apr, 2021 23:29А меня интересовало как раз то положение, которое было до перемещения
Есть тут разница в показаниях - не кажется, или я ошибаюсь? :)
Но таки да, в момент события DN_LISTCHANGE меню (список) полностью теряет свое состояние, а это уже не совсем логично
Безуспешно пробовал добыть состояние на момент события следующими способами:
1.) Dlg.GetValue(-1, 0)
2.) Dlg.GetValue(-1, 6)
3.) Dlg.GetValue(-1, 7)
4.) Menu.Value
5.) Object.CurPos
6.) Dlg.CurPos
7.) Dlg.PrevPos
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Текущая позиция в DI_LISTBOX при включении фильтра

Post by buniak_a_h »

citRiks wrote: Mon 26 Apr, 2021 18:52 Есть тут разница в показаниях
Да-да, я изначально неправильно сформулировал. Старую, откуда движок диалога переместил из-за фильтра, определить невозможно. Некорректность формулировки привела к неправильному коду.
Кстати!
citRiks wrote: Sun 25 Apr, 2021 22:49 То что по запросу DM_LISTGETCURPOS мы получаем неактуальное значение "0",
это наверное все же логично, потому что событие еще не завершилось,
и его можно даже запретить вернув false
При переходе клавишами ситуация аналогичная, но это не мешает получить текущую (т.е. старую, до перехода) позицию. Возможно, дело в том, что при обычном переходе эта позиция видна. А при применении фильтра - нет. Хотя по сути ситуация аналогична.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Текущая позиция в DI_LISTBOX при включении фильтра

Post by citRiks »

buniak_a_h, по идее еще можно другими месаджами (кроме DM_LISTGETCURPOS) попробовать получить состояние списка, но выглядит уже сомнительно, так как все уже пробованное дружно говорит "у нас сейчас нету состояния списка"
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Текущая позиция в DI_LISTBOX при включении фильтра

Post by buniak_a_h »

citRiks wrote: Mon 26 Apr, 2021 19:20 buniak_a_h, по идее еще можно другими месаджами (кроме DM_LISTGETCURPOS) попробовать получить состояние списка, но выглядит уже сомнительно, так как все уже пробованное дружно говорит "у нас сейчас нету состояния списка"
Да решена задача. При переходе запоминаю новую позицию их Param2 в переменной, а когда нужна предыдущая - беру оттуда.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Текущая позиция в DI_LISTBOX при включении фильтра

Post by citRiks »

buniak_a_h wrote: Mon 26 Apr, 2021 19:31 Да решена задача. При переходе запоминаю новую позицию их Param2 в переменной, а когда нужна предыдущая - беру оттуда.
ну это некузяво, сложна, нескладно.
ну ладн, еще одна нескладность в копилку из многих нескладностей.
Post Reply

Return to “Нужна помощь”