View Issue Details

IDProjectCategoryView StatusLast Update
0001882Far ManagerPlugins APIpublic2011-12-23 11:10
Reportermax rusov Assigned Tovskirdin  
PrioritynormalSeverityminorReproducibilityhave not tried
Status closedResolutionfixed 
Fixed in Version3.0 
Summary0001882: Разрешить "перехват" макрофункций Dlg.GetValue и ItemCount/CurPos в диалогах.
DescriptionПо мотивам топика http://forum.farmanager.com/viewtopic.php?f=8&t=6633

Исходная задача:

Во многих плагинах используется элемент диалога типа UserControl, который представляет собой суть список или таблицу разной степени навороченности. Делается это, отчасти, по причине бедности возможностей стандартного LISTBOX, но сейчас - не о том. Такой элемент, внешне выглядя как обычный список, никак не поддается автоматизации с помощью макросов, потому что в нем не работают макрофункции ItemCount/CurPos. Предлагаю устранить этот недостаток

Предлагаю:

1. В макрофункцию Dlg.GetValue добавить Type=11, при котором для контролов ListBox / ComboBox будет возвращаться количество элементов списка.

2. Добавить код нотификации DN_GETVALUE, который макродвижек будет посылать диалогу, при вызове макрофункций Dlg.GetValue и ItemCount,
CurPos (в контексте диалога). При этом:

Param1 - содержит ID контрола
Param2 - содержит указатель на структуру, приблизительно такую:

TFarGetValue = record
  GetType :Integer; // Что запрашивается, соответствует параметру Type марофункции dlg.getvalue
  ResType :Integer; // Тип результата
  Result :Pointer; // Результат
end;

3. Стандартный обработчик диалога заполняет эту структуру, в соответствии с правилами, описанными в документации на dlg.getvalue: http://api.farmanager.com/ru2/macro/macrocmd/prop_func/dialog.html, а у разработчика плагинов появляется возможность перекрыть нотификацию и возвращать что-то свое.

В первую очередь - это позволит CustomControl'у "притворяться" обычным списком. Кроме того, появляется возможность запрашивать у диалога/контролов дополнительные данные, предусмотренные автором плагина. Для этого предлагается разрешить передавать в dlg.getvalue произвольное значение Type, выделив для "прикладных" запросов диапазон адресов, например > 100.
TagsNo tags attached.
Build2220

Activities

vskirdin

2011-09-16 11:11

administrator   bugnote:0007704

Может имеет смысл DN_GETVALUE посылать только для UserControl?
Зачем менять инфу у стандартных элементов?

vskirdin

2011-09-16 11:24

administrator   bugnote:0007705

наверное структуру лучше такую:

struct TFarGetValue
{
    int GetType;
    FarMacroValue Val;
};


enum FARMACROVARTYPE
{
    FMVT_UNKNOWN = -1,
    FMVT_INTEGER = 0,
    FMVT_STRING = 1,
    FMVT_DOUBLE = 2,
};

struct FarMacroValue
{
    FARMACROVARTYPE type;
    union
    {
        __int64 i;
        double d;
        const wchar_t *s;
    }
#ifndef __cplusplus
    Value
#endif
    ;
};

max rusov

2011-09-16 11:35

reporter   bugnote:0007706

Last edited: 2011-09-16 11:39

>Может имеет смысл DN_GETVALUE посылать только для UserControl?
>Зачем менять инфу у стандартных элементов?

Я бы слал всегда, для общности. Хуже/сложнее от этого не будет, а дополнительная гибкость появляется. Например, можно запрашивать доп. инф-ю у всего диалога, при Pos=0...

> наверное структуру лучше такую:

Ну, раз теперь есть FarMacroValue, то, конечно, лучше.

vskirdin

2011-09-16 12:01

administrator   bugnote:0007707

Если в getvalue понятно, то что делать с ItemCount, CurPos в части:

GetType :Integer; // Что запрашивается, соответствует параметру Type

vskirdin

2011-09-16 12:17

administrator   bugnote:0007708

пробуй (только в части гетвалюе)

http://skirda-file.googlecode.com/files/m0001882.zip

Здесь
msg = DN_GETVALUE (=4118)
Param1 = номер элемента диалога
Param2 = TFarGetValue* - заполненные

Return: 0 - макродвиг игнорирует
1 - в Param2 модифицированные данные - макродвиг берет эти данные

max rusov

2011-09-16 12:30

reporter   bugnote:0007709

> Если в getvalue понятно, то что делать с ItemCount, CurPos в части:

Предлагалось:

> 1. В макрофункцию Dlg.GetValue добавить Type=11, при котором для контролов ListBox / ComboBox будет возвращаться количество элементов списка.

Тогда:

CurPos шлет DN_GETVALUE c Type = 7
ItemCount - Type = 11

Не очень красиво, возможно, но ничего лучше не придумалось.

vskirdin

2011-09-16 16:05

administrator   bugnote:0007711

понял.
кстати, Type = 11 есть в тестовом билде

vskirdin

2011-09-19 06:12

administrator   bugnote:0007713

build 2199

shmuel

2011-09-20 07:28

developer   bugnote:0007715

Last edited: 2011-09-20 08:46

Пробую 2199 на UserControl.
Макрос: msgbox("message",dlg.getvalue(1,11))

Почему-то Param1 передаётся в DN_GETVALUE как 0. Ноль ведь зарезервирован для самого диалога, а элементы должны указываться, начиная с единицы, не так?

samlyukov

2011-09-20 13:59

reporter   bugnote:0007716

поправки, должно быть переделано в контексте всего фар-апи:
struct TFarGetValue -> FarGetValue
FARMACROVARTYPE type -> Type
union
{
  __int64 i; -> I
  double d; -> D
  const wchar_t *s; -> S
}

vskirdin

2011-09-21 07:25

administrator   bugnote:0007717

0 для диалога - это в макросах.
не путай внутреннюю кухню, которая с нуля начинается и внешнюю, для юзеров, где нумерация с 1 начинается.

max rusov

2011-09-21 07:27

reporter   bugnote:0007718

А тогда DN_GETVALUE для диалога будет как? -1? Или вообще не посылается?

vskirdin

2011-09-21 08:05

administrator   bugnote:0007719

не посылается, а что ты хочешь видеть от "диалога" для type == 11?

max rusov

2011-09-21 08:13

reporter   bugnote:0007720

> появляется возможность запрашивать у диалога/контролов дополнительные данные,
> предусмотренные автором плагина. Для этого предлагается разрешить передавать в
> dlg.getvalue произвольное значение Type, выделив для "прикладных" запросов
> диапазон адресов, например > 100.

Я не настаиваю, просто мне кажется это может оказаться полезным. Хотя конкретных usecase'ов у меня сейчас нет...

max rusov

2011-09-26 22:03

reporter   bugnote:0007750

Протестировал, вроде все работает, спасибо. Поддержал пока только в бете MacroLib'а.

vskirdin

2011-10-13 13:30

administrator   bugnote:0007875

Вот так прет:

Если Index > DlgItemCount (DlgItemCount получаем через dlggetvalueFunc(0,0) и прибавляем 1 и дальше), тогда dlggetvalueFunc просто делает send диалогу и возвращает в макрос то, что вернул плагин.

ы?

vskirdin

2011-10-13 13:43

administrator   bugnote:0007876

добавка.
Если Index==-1 - то это про диалог, тогда если TypeInf >=0 && TypeInf <= 6 то в диалоговую процедуру передается ровно то, что заявленов доке, иначе {FMVT_UNKNOWN, 0}.
Если (текущая область не диалог) или (Index < DlgItemCount и произошла внутренняя ошибка), то плагин не получит DN_GETVALUE.

vskirdin

2011-10-13 14:08

administrator   bugnote:0007879

build 2220
условия описаны в changelog

Issue History

Date Modified Username Field Change
2011-09-15 11:09 max rusov New Issue
2011-09-16 11:11 vskirdin Note Added: 0007704
2011-09-16 11:24 vskirdin Note Added: 0007705
2011-09-16 11:35 max rusov Note Added: 0007706
2011-09-16 11:39 max rusov Note Edited: 0007706
2011-09-16 12:01 vskirdin Note Added: 0007707
2011-09-16 12:17 vskirdin Note Added: 0007708
2011-09-16 12:30 max rusov Note Added: 0007709
2011-09-16 16:05 vskirdin Note Added: 0007711
2011-09-19 06:12 vskirdin Note Added: 0007713
2011-09-19 06:12 vskirdin Assigned To => vskirdin
2011-09-19 06:12 vskirdin Status new => feedback
2011-09-20 07:28 shmuel Note Added: 0007715
2011-09-20 08:46 shmuel Note Edited: 0007715
2011-09-20 13:59 samlyukov Note Added: 0007716
2011-09-21 07:25 vskirdin Note Added: 0007717
2011-09-21 07:27 max rusov Note Added: 0007718
2011-09-21 07:27 max rusov Status feedback => assigned
2011-09-21 08:05 vskirdin Note Added: 0007719
2011-09-21 08:13 max rusov Note Added: 0007720
2011-09-26 22:03 max rusov Note Added: 0007750
2011-10-13 13:30 vskirdin Note Added: 0007875
2011-10-13 13:43 vskirdin Note Added: 0007876
2011-10-13 14:08 vskirdin Note Added: 0007879
2011-10-13 14:08 vskirdin Status assigned => feedback
2011-12-23 11:10 alexy Build => 2220
2011-12-23 11:10 alexy Status feedback => closed
2011-12-23 11:10 alexy Resolution open => fixed
2011-12-23 11:10 alexy Fixed in Version => 3.0