DM_GETDLGITEMSHORT: operation not implemented Topic is solved

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

DM_GETDLGITEMSHORT: operation not implemented

Post by buniak_a_h »

Здравствуйте.
То ли я чего-то не понимаю то ли ошибка.
%FARHOME%\Encyclopedia\FarEncyclopedia.ru.chm wrote: Сообщение DM_GETDLGITEMSHORT посылается Менеджеру диалогов для получения информации о заданном элементе. Отличается от DM_GETDLGITEM тем, что FarDialogItem.Data, FarDialogItem.Mask и FarDialogItem.History всегда возвращаются как NULL.
В результате получаю:

Code: Select all

C:\Program Files\Far Manager\Plugins\LuaMacro\LuaMacro.dll:
...Data\Roaming\Far Manager\Profile\Macros\Bax.Test\www.lua:5: bad argument #1 to 'send' (operation not implemented)
ЧЯДНТ ???
Last edited by buniak_a_h on Mon 23 Dec, 2019 11:59, edited 1 time in total.
Shmuel
Posts: 6211
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 342 times

"Вылет" при посылке DM_GETDLGITEMSHORT

Post by Shmuel »

buniak_a_h wrote: Mon 23 Dec, 2019 11:57 bad argument #1 to 'send' (operation not implemented)
Ровно то, что написано. DM_GETDLGITEMSHORT не реализован в LuaFAR'е (вероятно я посчитал, что можно без него обойтись).
buniak_a_h
Posts: 2522
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 139 times
Been thanked: 310 times
Contact:

"Вылет" при посылке DM_GETDLGITEMSHORT

Post by buniak_a_h »

Спасибо. Гугль-переводчик подвёл, неправильно это сообщение перевёл: "операция не выполнена" …
citRiks
Posts: 1293
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 385 times
Been thanked: 78 times

"Вылет" при посылке DM_GETDLGITEMSHORT

Post by citRiks »

Shmuel,
А может быть напрасно что его нету?
На большие элементы-списки, например историю, DM_GETDLGITEM берет по 20 милисекунд,
на все остальные обычные элементы - ноль миллисекунд.
имело бы смысл получать урезанный вариант элементов без списков, если они не нужны
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
Shmuel
Posts: 6211
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 342 times

"Вылет" при посылке DM_GETDLGITEMSHORT

Post by Shmuel »

citRiks wrote: Sat 02 Jan, 2021 03:35 А может быть напрасно что его нету?
Может и напрасно. Хотя у меня не было практического случая, чтобы это ощутить.
citRiks
Posts: 1293
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 385 times
Been thanked: 78 times

"Вылет" при посылке DM_GETDLGITEMSHORT

Post by citRiks »

Shmuel,
на всякий случай сообщаю :)что вот у меня есть такой случай
надо читать все элементы у всех диалогов для некоего анализа,
исходные данные такие:
* незагруженный (10% нагрузки) процессор со средним CPU в 10%
Intel(R) Core(TM) i5-2410M CPU @ 2.30GHz, 2301 Mhz, 2 Core(s), 4 Logical Processor(s)
Installed Physical Memory (RAM) 12.0 GB
* история из 30,000 записей
* код такой:

Code: Select all

local t_dlg_elm_get_1 = Far.UpTime
local dlg_elem = hDlg:send(
	"DM_GETDLGITEM",
--	"DM_GETDLGITEMSHORT",
	1)
local t_dlg_elm_get_2 = Far.UpTime
local t_dlg_elm_get = t_dlg_elm_get_2 - t_dlg_elm_get_1
if t_dlg_elm_get > 0 then
	win.OutputDebugString(string.format("time to get dialog elem: %s, %s list items", t_dlg_elm_get, #dlg_elem[6]))
end
В среднем, повторно запуская чтобы были "горячие" запуски,
получаем в среднем 80 милисекунд, что весьма ощутимо,
тем более что в историю приходится лазить очень часто..
Last edited by citRiks on Sat 02 Jan, 2021 16:16, edited 1 time in total.
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
Shmuel
Posts: 6211
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 342 times

"Вылет" при посылке DM_GETDLGITEMSHORT

Post by Shmuel »

citRiks wrote: Sat 02 Jan, 2021 16:15 на всякий случай сообщаю :)что вот у меня есть такой случай
Из вашего примера мало что можно понять, но если каждый раз нужно получать 30000 значений элементов диалога, то скорее всего править надо алгоритм.
Данную тему более обсуждать не буду, извините.
citRiks
Posts: 1293
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 385 times
Been thanked: 78 times

"Вылет" при посылке DM_GETDLGITEMSHORT

Post by citRiks »

Shmuel,
тему можно и не обсуждать, да :) и cпасибо за внимание
Но на всякий случай отмечу что, что 30,000 это не количество элементов диалога,
а количество значений в списке, которые как раз и не нужны,
но идут в нагрузку к запросу на элемент, который нужен, но без этого его списка.
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
citRiks
Posts: 1293
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 385 times
Been thanked: 78 times

"Вылет" при посылке DM_GETDLGITEMSHORT

Post by citRiks »

Shmuel wrote: Sat 02 Jan, 2021 16:52 Из вашего примера мало что можно понять,
дополненный пример происходящего:

Code: Select all

local F = far.Flags
local G = far.Guids

local tbl_dlg_menu_hist_guid = {
	[G.HistoryCmdId]	= true,
	[G.HistoryEditViewId]	= true,
	[G.HistoryFolderId]	= true
}

Event { description = "Test DM_GETDLGITEM(SHORT) for \"historical\" menus";
	group = "DialogEvent";
	condition = function(evt, fde)
		-- we interested only in single open event:
		if	evt	~= F.DE_DLGPROCEND
		or	fde.Msg ~= F.DN_GOTFOCUS
		then	return
		end
		-- dialog info should be ready to read it:
		local	dlg_info = far.SendDlgMessage(fde.hDlg, F.DM_GETDIALOGINFO)
		if not	dlg_info
		then 	return
		end
		-- normalize binary GUID representation to readable string:
		local	dlg_guid = string.upper(win.Uuid(dlg_info.Id))
		-- GUIDs of interest only:
		return	tbl_dlg_menu_hist_guid[dlg_guid]
	end;
	action = function(evt, fde)
		-- lets put time measure base point:
		local t_dlg_elm_get_1 = Far.UpTime
		-- fetch the menu item SINGLE element:
		local dlg_elem = fde.hDlg:send(
			-- currently the only flag message to get it:
			"DM_GETDLGITEM",
			-- this was not implemented:
		--	"DM_GETDLGITEMSHORT",
			-- number of the menu list element in the dialog structure:
			1)
		local t_dlg_elm_get_2 = Far.UpTime
		-- so, the time is: (average is 80 ms on decent hosts)
		local t_dlg_elm_get = t_dlg_elm_get_2 - t_dlg_elm_get_1
		-- this is the ELEMENT list of VALUES:
		local tbl_hist_list = dlg_elem[6]
		-- put this small report here: (catch it with DbgView of SysInternals, for example)
		win.OutputDebugString(string.format("FAR: time to get dialog elem: %s, which has %s history items", t_dlg_elm_get, #tbl_hist_list))
	end;
}
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
Shmuel
Posts: 6211
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 342 times

"Вылет" при посылке DM_GETDLGITEMSHORT

Post by Shmuel »

citRiks, ну допустим это нужно, так просите Фар-груп, создайте виш на трекере и т.п. и т.д.
citRiks
Posts: 1293
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 385 times
Been thanked: 78 times

"Вылет" при посылке DM_GETDLGITEMSHORT

Post by citRiks »

А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
buniak_a_h
Posts: 2522
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 139 times
Been thanked: 310 times
Contact:

"Вылет" при посылке DM_GETDLGITEMSHORT

Post by buniak_a_h »

citRiks, если я правильно понял, Вы составляете список имён историй (выводите в OutputDebugString). Я бы лучше попросил расширить функционал Dlg.GetValue. Есть какая-то незавершённость: все элементы итема можно проверить, а 6-й почему-то нельзя. Чем он хуже?
citRiks
Posts: 1293
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 385 times
Been thanked: 78 times

"Вылет" при посылке DM_GETDLGITEMSHORT

Post by citRiks »

buniak_a_h,
не, это просто для примера медленности обычного (не ШОРТ) ГЕТИТЕМ-а
мне надо получать элемент без списка, а список всегда придается в комплекте,
что слишком затратно для компутера и медленно для юзера,
когда прилагаемый список большой, конкретно у меня проблемы с ~10 тысячами
еще раз, речь не про 10000 элементов, а про 10000 значений в списке элемента
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
citRiks
Posts: 1293
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 385 times
Been thanked: 78 times

"Вылет" при посылке DM_GETDLGITEMSHORT

Post by citRiks »

buniak_a_h,
про Dlg.GetValue() не понял, что у него не соответствует заявленным здесь АПИ?
https://api.farmanager.com/ru/macro/mac ... g.GetValue
не сообщает о фокусе когда должен (Type = 6) ?
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
buniak_a_h
Posts: 2522
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 139 times
Been thanked: 310 times
Contact:

"Вылет" при посылке DM_GETDLGITEMSHORT

Post by buniak_a_h »

citRiks wrote: Sun 03 Jan, 2021 07:05 buniak_a_h,
про Dlg.GetValue() не понял, что у него не соответствует заявленным здесь АПИ?
https://api.farmanager.com/ru/macro/mac ... g.GetValue
не сообщает о фокусе когда должен (Type = 6) ?
1. Я ошибся, говоря про FarDialogItem.History - Вы в Вашем примере анализируете другой элемент (Param).
2. Я, вроде, не писал, что Dlg.GetValue не соответствует описанию. Просто нет значения Type, по которому можно получить FarDialogItem.History (а также FarDialogItem.Mask, FarDialogItem.MaxLength и FarDialogItem.UserData). Причём при Type=7 для CheckBox и RadioButton фактически возвращается FarDialogItem.Selected (ну, т.е. FarDialogItem[6]), и даже для ListBox-а и ComboBox-а возвращается некий результат анализа 6-го элемента FarDialogItem (текущая позиция - элемент FarDialogItem[6].SelectIndex). А вот сам 6-й элемент (например, если это - массив FarList) - не получить. А хотелось бы именно здесь иметь доступ к любому элементу FarDialogItem-а
Locked

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