Summary: | Инфо Бухгалтер: не сохраняется файл настроек | ||
---|---|---|---|
Product: | WINE@Etersoft | Reporter: | Денис Баранов <baraka> |
Component: | Файловые операции | Assignee: | Илья Шпигорь <shpigor> |
Status: | CLOSED FIXED | QA Contact: | |
Severity: | normal | ||
Priority: | P3 | CC: | kondratyuk, lav, pav, shpigor, vitperov |
Version: | 1.0.11 | Keywords: | WINEHQ |
Target Milestone: | --- | ||
Hardware: | PC | ||
OS: | All | ||
Whiteboard: | |||
Заявки RT: | Связано с: | ||
Дата напоминания: | |||
Bug Depends on: | 2792 | ||
Bug Blocks: | 2814, 4284 | ||
Attachments: | скрин |
WritePrivateProfileInt - такой WINAPI функции нет. Скорее всего имеется ввиду какая-то внутренняя функция инфо-бухгалтера типа: int WritePrivateProfileInt(LPSTR section,LPSTR keyword,int value,LPSTR inifile) { char entry[32]; wsprintf(entry,"%d",value); return (WritePrivateProfileString(section,keyword,entry,inifile)); } (взято с форума MSDN) после нажатия на ОК в указанном диалоге, записываются настройки типа: fixme:profile:WritePrivateProfileStringA section=Options, entry=ExtrCalc, string=OFF, file=IBW.INI fixme:profile:WritePrivateProfileStringA section=Highlight, entry=UseHighlight, string=1, file=IBW.INI ... Запись идёт в секции: Highlight, Fonts, и Options (только 1 строка). Проверил другие функции kernel32 для записи в *.ini файл - они не вызываются. Существует 2 файла: IBW.INI в папке windows и IB.INI в папке с программой Проверил оба файла: при изменении настроек во вкладке "хозяйственная деятельность" файлы не измениются! Хотя checkbox'ы в этой вкладке сохранятся. Возможно они сохраняются в реестр? В реестр настройки точно не сохраняются. В какой файл они сохраняются - выяснить пока не удалось. Чтобы не тратить лишнее время написал письмо разработчику. Получил ответ на письмо:
> Эти настройки лежат не в ini а в ibw8.cfg (для сетевой версии в ibwn8.cfg).
Действительно в указонном файле лежит что-то похожее. Но файл это бинарный!
Теперь понятно почуму для сохранения настроек не используется WritePrivateProfileString.
Настройки записываются какой-то другой функцией (скорее всего не WINAPI).
Пробовал трейсить по каналу file - файл открывается. Но ничего полезного выяснить не удалось.
Получил ответ от разработчиков Инфо-бухгалтера: Тут все несколько интереснее, считывание настроек происходит при старте программы, изменения хранятся в переменных и записываются в файл при закрытии. Т.к. эта настройка сбрасывается при нажатии на ОК в диалоге, скорее всего глючит именно Edit (используется стандартное окно ввода текста с обработчиками проверки символов на цифры). Причем окно такого же типа используется в Отчеты - Материальный отчет - Макс. порядок корр. счетов, но там изменения сохраняются. Есть версия, что в wine используется не тот разделитель, но тут мы еще посмотрим что конкретно там происходит (системный программист находится не в нашем офисе и по телефону это выяснять довольно неудобно). Похоже ошибка и вправду связана с edit контролом, т.к. остальные настройки успешно сохраняются. Есть небольшое замечание - настройка в edit'е сбрасывается только на той вкладке tab'а, которая была активна при нажатии 'Ок'. Т.е. если на вкладке нет ни одного edit контрола, то все настройки сохранятся. Удалось выяснить причину ошибки. Инфо-Бухгалтер закрывает окно "Настройки" таким образом, что сначала уничтожается родитель edit контролов, а потом они сами. Когда родитель уничтожается он посылает WM_DESTROY всем дочерним элементам. Edit контрол обрабатывая это сообщение уничтожает свою EDITSTATE структуру и все дальнейшие сообщения перенаправляет в DefWindowProc. После того как родитель уничтожен, перед уничтожением edit контрола приложение запрашивает его текст. Но EDITSTATE, где этот текст хранится, уже нет и запрос обрабатывает DefWindowProc. В результате чего приложение получает неверное значение и параметр сохраняется неверно. Решить эту проблему без хаков весьма затруднительно. Возможно, стоит пересмотреть способ хранения текста в edit контроле. Послал соответствующий тест на winehq. Выложил хак. Это временное решение - хранить текст edit контрола помимо EDITSTATE, еще и как текст окна. На самом деле windows так не делает, но пока ничего лучше придумать не получилось. Появилась идея, как можно решить багу более корректно. Патч пока прикладывать не надо. Более корректное решение заключается в том, чтобы уничтожать EDITSTATE структуру по сообщению WM_NCDESTROY. Тесты подтвердили, что в windows такое же поведение контрола. Соответствующий патч выложил. Патч приняли в оригинальный wine. |
Created attachment 854 [details] скрин Не сохраняются настройки в ini-файлах (функция WritePrivateProfileInt пишет 0). В скрине графа «Строк в окне проводок», заходить через Установка — Настройки. По умолчанию 3, при изменении на любое число после закрытия и открытия заново 0.