View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0002616 | Wishes | Plugins API.Dialog | public | 2014-03-06 16:33 | 2014-03-19 14:31 |
| Reporter | JohnDoe | Assigned To | |||
| Priority | normal | Severity | minor | Reproducibility | N/A |
| Status | new | Resolution | open | ||
| Product Version | 3.0 | ||||
| Summary | 0002616: В момент DN_INITDIALOG неверно работают некоторые функции | ||||
| Description | В частности AdvControl (ACTL_GETWINDOWINFO) и MacroControl (MCTL_GETAREA) возвращают неверную информацию. | ||||
| Additional Information | Тикет связан с 0002587 | ||||
| Tags | No tags attached. | ||||
| Build | |||||
|
|
Что-то я не уверен, что это баг. DN_INITDIALOG - это сигнал об инициализации внутренних компонентов (которые диалоговая процедура может изменить), но никак не полноценная работа диалога. |
|
|
>Что-то я не уверен, что это баг. Я тоже, поэтому это в разделе Wishes. Возможно нужно отдельное событие срабатывающее однократно в уже инициализированном диалоге, что-то типа DN_INITDIALOGDONE |
|
|
Чем не устраивает DN_DRAWDIALOGDONE (с учетом build 3836)? Это событие однозначно говорит, что диалог отрисован и готов к эксплуатации. Тут есть одно но - если заюзать ACTL_REDRAWALL, в ответ на DN_DRAWDIALOGDONE, то нишиша не увидим диалога (здесь нужен анализ - т.е. отдельный Инц). |
|
|
Для инфы последовательность (вроде ничего не пропустил): DN_INITDIALOG DN_GOTFOCUS DN_DRAWDIALOG DN_CTLCOLORDIALOG N раз { DN_DRAWDLGITEM DN_CTLCOLORDLGITEM } DN_DRAWDIALOGDONE |
|
|
>Чем не устраивает DN_DRAWDIALOGDONE (с учетом build 3836)? DN_DRAWDIALOGDONE приходит после каждой перерисовки, т.е. может и 100500 раз в одном диалоге А нужно событие, которое приходит 1 раз. P.S Пардон, я ещё не пробовал 3836 |
|
|
Попробовал 3836 из соседнего тикета (0002587:0011961), но всё по-прежнему. |
|
|
> А нужно событие, которое приходит 1 раз. Отлови DN_DRAWDIALOG, выстави свой флаг (hint: блок "твоих" данных у диалога) При отлове очередного DN_DRAWDIALOGDONE проверь флаг. А поподробнее про "1 раз". Ты хочешь что-то проинициализировать для "этого диалога", чтобы потом этим пользоваться, пока диалог работает? |
|
|
>Отлови [...] выстави [...] проверь Знаю (пользуюсь) и другими изощрёнными методами. Но хочется по-человечески. >чтобы потом этим пользоваться, пока диалог работает? Это, и не только. Например в другом скрипте http://forum.farmanager.com/viewtopic.php?f=15&t=8476 мне просто требуется однократное действие. |
|
|
(ответ на 0002587:0011981) >Значит DN_DRAWDIALOGDONE с установкой внутреннего флага, что ты уже получил данные. 1. Как насчёт отменить DN_DRAWDIALOGDONE для элементов (заменить на DN_DRAWDLGITEMDONE) 2. Или передавать ID элемента в Param1 (первый DN_DRAWDIALOGDONE должен получить -1) >Второй вариант: добавить новый месаг DM_GETDIALOGTITLE[...] >Делать? Подождём, обдумать надо. ACTL_GETWINDOWTYPE тоже нужно чем-то заменить, иначе невозможно узнать диалог у нас или меню. >Как воспользоваться? Очистить? Заполнить? Отобразить? В существующем скрипте - просто активировать режим >Если в скриптах юзается плагиновое АПИ, то видимо и поступать надо так, как будто плагин пишешь :-) Так и делаем. А поскольку плагиновое апи несовершенно и имеет пробелы, то обходимся имеющимся, или используем макро апи. Ну и пишем вот на мантис, в надежде улучшить ситуацию. Собственно, почему не добавить специальное событие? |
|
|
> 1. Как насчёт отменить DN_DRAWDIALOGDONE для элементов (заменить на DN_DRAWDLGITEMDONE) Правильно я понимаю, что: DN_DRAWDLGITEMDONE будет появляться только(и согласно Писанию), если закончили рисовать весь диалог и, если рисуем _только_ один элемент, то нужен новый месаг DN_DRAWDLGITEMDONE(Param1=ID,Param2=0) >>Второй вариант: добавить новый месаг DM_GETDIALOGTITLE[...] >Подождём, обдумать надо. ACTL_GETWINDOWTYPE тоже нужно чем-то заменить, иначе невозможно узнать диалог у нас или меню. А чего ждать? Не получишь ты никогда корректных данных, вызывая ACTL_GETWINDOWTYPE в процессе инициализации диалога (точнее до тех пор, пока он не начнет взаимодействовать с юзером - т.е. проинициализирован и первый раз отрисован). >>Как воспользоваться? Очистить? Заполнить? Отобразить? >В существующем скрипте - просто активировать режим ...чтобы в начале взаимодействия пользователя с диалогом фильтр уже был активным, так? В первом DN_DRAWDIALOGDONE: SendDlgMessage(DM_SETFOCUS,на_листбокс_или_комбобокс) SendDlgMessage(DM_SETDROPDOWNOPENED,TRUE) SendDlgMessage(DM_KEY,послать_Ctrl-Alt-F) не то? |
|
|
>если рисуем _только_ один элемент, то нужен новый месаг DN_DRAWDLGITEMDONE (Param1=ID,Param2=0) Лично мне это сейчас нужно только чтобы DN_DRAWDIALOGDONE приходил согласно писания - один раз. Но кто-то же зачем-то сделал это для каждого элемента? Может даже использует? Если же никто не использует, то можно пока обойтись без этого нового DN_DRAWDLGITEMDONE. (Просто привести в соответствие с писанием, т.е. убрать лишние DN_DRAWDIALOGDONE) >Не получишь ты никогда корректных данных, вызывая ACTL_GETWINDOWTYPE в процессе инициализации диалога Подождать альтернативного решения, типа того о чём сказано выше. >чтобы в начале взаимодействия пользователя с диалогом фильтр уже был активным, так? Именно. Но если после DN_DRAWDIALOGDONE, то уже можно использовать Menu.Filter() |
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2014-03-06 16:33 | JohnDoe | New Issue | |
| 2014-03-13 07:31 | vskirdin | Note Added: 0011904 | |
| 2014-03-13 11:20 | JohnDoe | Note Added: 0011913 | |
| 2014-03-18 11:37 | vskirdin | Note Added: 0011963 | |
| 2014-03-18 11:39 | vskirdin | Note Added: 0011964 | |
| 2014-03-18 12:18 | JohnDoe | Note Added: 0011965 | |
| 2014-03-18 12:19 | JohnDoe | Note Edited: 0011965 | |
| 2014-03-18 12:31 | JohnDoe | Note Added: 0011966 | |
| 2014-03-19 07:01 | vskirdin | Note Added: 0011973 | |
| 2014-03-19 07:47 | JohnDoe | Note Added: 0011974 | |
| 2014-03-19 13:17 | JohnDoe | Note Added: 0011983 | |
| 2014-03-19 13:45 | vskirdin | Note Added: 0011984 | |
| 2014-03-19 14:31 | JohnDoe | Note Added: 0011986 |