Получение пользовательских данных (UserData) DlgItem-а

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Получение пользовательских данных (UserData) DlgItem-а

Post by citRiks »

Latest post of the previous page:

Shmuel wrote: Fri 23 Apr, 2021 17:34
citRiks wrote: Fri 23 Apr, 2021 17:23 Я когда программил всякое, поле для какой-либо потребной метаинформации "Custom/UserData" очень часто было полезным
Ну я же выше написал, как это делается...
Берёте и добавляете свои кастомные поля в таблицу элемента диалога.
да, сейчас понял что упустил смысл вами сказанного,
теперь кажется что догадываюсь о чем речь,
но надо поэкспериментировать с этим чтобы проверить правильность понимания,
чуть позжее сегодня отпишусь, спасибо.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Получение пользовательских данных (UserData) DlgItem-а

Post by citRiks »

John Doe wrote: Fri 23 Apr, 2021 17:38
citRiks wrote: Fri 23 Apr, 2021 17:23 Я про это не знал, хоть и все время собираюсь начать писать на Питоне
А питоновый адаптер разве не позволяет плагины с диалогами писать?
если вы это меня спрашиваете?
то наверное надо не меня спрашивать :)
Ну я так понимаю что не все АПИ экспортировано в питоно-адаптер,
например диалоговое АПИ не экспортировано.
Так-то конечно не помешало бы знать что экспортировано а что нет.
Я думаю что му обсуждаем "Lunatic Python" авторства @ShmuZ:
viewtopic.php?f=15&t=10017

Хотя есть еще вариант Pygin авторства @DrkNs:
viewtopic.php?f=8&t=9998
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Получение пользовательских данных (UserData) DlgItem-а

Post by Shmuel »

citRiks wrote: Fri 23 Apr, 2021 17:47 теперь кажется что догадываюсь о чем речь,
Вот пример, взято отсюда - viewtopic.php?f=60&t=9900

Code: Select all

--[[02]] {F.DI_RADIOBUTTON, 5, 3, 0, 0, 1, 0, 0, "DIF_GROUP", M.REMDUP,     op="delete"; removeFirst=false},
--[[03]] {F.DI_RADIOBUTTON, 5, 4, 0, 0, 0, 0, 0, 0,           M.CLRDUP,     op="clear";  removeFirst=false},
Обратите внимание на кастомные поля op и removeFirst.
Last edited by Shmuel on Fri 23 Apr, 2021 17:57, edited 1 time in total.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Получение пользовательских данных (UserData) DlgItem-а

Post by buniak_a_h »

Shmuel wrote: Fri 23 Apr, 2021 17:34 Берёте и добавляете свои кастомные поля в таблицу элемента диалога.
Увы, эти «кастомные поля» игнорируются (не возвращаются) по сообщению DM_GETDLGITEM. Т.е. обработчик событий должен иметь доступ к первоначальному массиву DlgItems. Я умудрился сделать такой скрипт, в котором это было никак. Пришлось обходить через DM_USER. А также "вставкой" «прослойки» между far.Dialog и настоящим хендлером, передающей в хендлер ещё один параметр. Короче, задача решена, но как-то пер-анально. Впрочем, на LUA многие приемы выглядят с непривычки прокто-логично…
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Получение пользовательских данных (UserData) DlgItem-а

Post by John Doe »

buniak_a_h wrote: Fri 23 Apr, 2021 18:29 Увы, эти «кастомные поля» игнорируются (не возвращаются) по сообщению DM_GETDLGITEM
У меня сложилось впечатление что в Си-апи аналогичная ситуация: данные бесполезны для всех кроме их владельца.
Лучше если заблуждаюсь, и можно как-то использовать для межплагинового взаимодействия.
https://t.me/FarManager — Telegram чат
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Получение пользовательских данных (UserData) DlgItem-а

Post by John Doe »

buniak_a_h wrote: Короче, задача решена, но как-то пер-анально.
Возможно стоило бы обсудить, и поискать другие возможные решения.
https://t.me/FarManager — Telegram чат
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Получение пользовательских данных (UserData) DlgItem-а

Post by Shmuel »

John Doe wrote: Fri 23 Apr, 2021 18:35 У меня сложилось впечатление что в Си-апи аналогичная ситуация: данные бесполезны для всех кроме их владельца.
Лучше если заблуждаюсь, и можно как-то использовать для межплагинового взаимодействия.
1. Думаю, что вы не заблуждаетесь. В общем случае невладелец диалога не может знать ни структуру данных, ни смысл значений их элементов.
2. А чего не хватает для межплагинного взаимодействия? Мне кажется, что Plugin.Call довольно успешно с этим справляется.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Получение пользовательских данных (UserData) DlgItem-а

Post by John Doe »

Shmuel wrote: Fri 23 Apr, 2021 19:01 В общем случае невладелец диалога не может знать ни структуру данных, ни смысл значений их элементов.
Но можно подсмотреть в исходниках, а может быть даже наоборот, специально задекларировать и предусмотреть сторонний доступ.
Но тот факт, что нигде это так не используется, заставляет предположить что не всё тут просто.
Shmuel wrote: Fri 23 Apr, 2021 19:01 Мне кажется, что Plugin.Call довольно успешно с этим справляется.
В целом да, но для некоторых задач действительно удобно оперировать данными, прикрепленными к конкретному диалогу или его элементам.
Или же общаться с помощью событий (с передачей данных, и возможностью проанализировать результаты обработки события).
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Получение пользовательских данных (UserData) DlgItem-а

Post by buniak_a_h »

John Doe wrote: Fri 23 Apr, 2021 18:36 Возможно стоило бы обсудить, и поискать другие возможные решения.
Так мне казалось, что прямое решение было запланировано, но не реализовано. Я как раз имею в виду поле tFarDialogItem.UserData. В описании структуры tFarDialogItem написано:
[12] UserData: integer
А в описании сообщения DM_GETITEMDATA написано так:
Менеджер Диалогов возвращает указатель на ранее переданные данные плагином (или 0, если плагин не ассоциировал данные с этим элементом диалога)
Также в статье, посвящённой структуре FarDialogItem написано:
intptr_t UserData;

UserData
Значение, связанное с элементом диалога. Данные можно получить с помощью DM_GETITEMDATA.
Отсюда и непонятка: то ли только целое, то ли указатель на (произвольные LUA-типовые) данные. Если реализовать передачу таблицы, то задача была бы решена прямо.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Получение пользовательских данных (UserData) DlgItem-а

Post by Shmuel »

buniak_a_h wrote: Fri 23 Apr, 2021 22:11 Если реализовать передачу таблицы, то задача была бы решена прямо.
Если это диалог вашего скрипта, то, как было указано выше, кастомные поля решают проблему.
Если же это диалог Фара или произвольного плагина, то как возможно из указателя void* (неизвестно на что указывающего) сделать таблицу?
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Получение пользовательских данных (UserData) DlgItem-а

Post by buniak_a_h »

Shmuel wrote: Fri 23 Apr, 2021 22:43 Если это диалог вашего скрипта, то, как было указано выше, кастомные поля решают проблему.
Может, я чего-то недопонял? Я писал, что эти кастомные поля невозможно получить посылкой DM_GETDLGITEM. Отсюда и обходные пути
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Получение пользовательских данных (UserData) DlgItem-а

Post by Shmuel »

Когда вы посылаете DM_GETDLGITEM, вы передаёте позицию элемента в диалоге. Следовательно по этой самой позиции у вас есть доступ к таблице данного элемента со всеми её кастомными полями. Речь идёт о диалоге в вашем скрипте.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Получение пользовательских данных (UserData) DlgItem-а

Post by buniak_a_h »

Shmuel!
1.
Shmuel wrote: Fri 23 Apr, 2021 23:19 по этой самой позиции у вас есть доступ к таблице данного элемента со всеми её кастомными полями. Речь идёт о диалоге в вашем
(подчёркивание - моё - BAX) скрипте.
А если диалог сформирован не в моём скрипте? Тогда я имею доступ только к первым 12-ти регулярным полям элемента диалога. Ни к именованным полям, ни к полям вне диапазона 1-12 так доступа нет.
2. Я опишу ту задачу, из-за которой пришлось придумывать.
В модуле есть функция, которая сама формирует диалог (массив элементов) и показывает его. При этом у этого диалога есть "стандартный" хендлер, обеспечивающий минимальные функции. Один из параметров - "дополнительный" хендлер. Его передаёт функцию вызывающий скрипт. Т.е. сама функция не имеет доступа к текущему элементу кроме как через DM_GETDLGITEM. Ну или "стандартный" хендлер должен передать массив элементов диалога в "дополнительный". Это немного нарушение принципов ООП. Ну, извините старика. Так учили…
Last edited by buniak_a_h on Fri 23 Apr, 2021 23:51, edited 1 time in total.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Получение пользовательских данных (UserData) DlgItem-а

Post by Shmuel »

buniak_a_h, дискуссия подзатянулась, этим сообщением заканчиваю своё в ней участие.

1. Вы соорудили конструкцию, при которой у вызывающего скрипта, как я понимаю, нет доступа к массиву элементов, кроме как через DM_GETDLGITEM? Мне такой подход не нравится. (Я вообще избегаю по возможности DM_GETDLGITEM).

2. У меня за все годы ни разу не возникло проблемы с недостаточностью диалог-АПИ LuaFAR'а. Поэтому и не было стимулов что-то менять.

3. Код открыт, я не вмешиваюсь более. Сделайте как вам надо, далее подайте pull request, и будет вам счастье.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Получение пользовательских данных (UserData) DlgItem-а

Post by buniak_a_h »

Shmuel wrote: Sat 24 Apr, 2021 00:07 дискуссия подзатянулась, …
Я Вас не втягивал. Даже не ожидал, что Вы вмешаетесь.
На самом деле проблема не в коде / АПИ, а во фразе:
buniak_a_h wrote: Fri 23 Apr, 2021 22:11 Значение, связанное с элементом диалога.
Достаточно было бы в описании вставить слово "Целочисленное". Ну и чуть выше по этой теме вместо «Указатель на ранее переданные данные» - целое число. Хотя, возможно, опять перепутал функции, вызываемые из LUA-скрипта с функциями плагина.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Получение пользовательских данных (UserData) DlgItem-а

Post by John Doe »

buniak_a_h wrote: Fri 23 Apr, 2021 23:51 Один из параметров - "дополнительный" хендлер.
Значит у вас уже есть полный контроль над тем, что передавать хэндлеру [дополнительно].
Если данные в любом случае у вас храняться (например есть готовый массив элементов), то не вижу почему бы просто не передать его.
Если же данные требуется специально "готовить", а неизвестно понадобятся ли они вообще, то можно передать функцию, или хэндл, через который потом дёргать методы.
https://t.me/FarManager — Telegram чат
Post Reply

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