Укажите отработанное время

Отработанное время:
Продуктивное время:
Bug 2793 - Инфо Бухгалтер: не сохраняется файл настроек   Make a simular bug
Summary: Инфо Бухгалтер: не сохраняется файл настроек
Status: CLOSED FIXED
Alias: None
Product: WINE@Etersoft
Classification: Продукты (Products)
Component: Файловые операции (show other bugs)
Version: 1.0.11
Hardware: PC All
: P3 normal
Target Milestone: ---
Assignee: Илья Шпигорь
QA Contact:
URL:
Whiteboard:
Keywords: WINEHQ
Depends on: 2792
Blocks: 2814 4284
  Show dependency treegraph
 
In work:
Reported: 2008-11-01 20:41 MSK by Денис Баранов
Modified: 2010-01-20 16:22 MSK (History)
5 users (show)

See Also:
Заявки RT:
Связано с:
Дата напоминания:


Attachments
скрин (23.08 KB, image/png)
2010-11-18 03:58 MSK, Денис Баранов
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Денис Баранов 2008-11-01 20:41:06 MSK
Created attachment 854 [details]
скрин

Не сохраняются настройки в ini-файлах (функция WritePrivateProfileInt пишет 0). В скрине графа «Строк в окне проводок», заходить через Установка — Настройки. По умолчанию 3, при изменении на любое число после закрытия и открытия заново 0.
Comment 1 Виталий Перов 2008-11-17 17:42:58 MSK
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)
Comment 2 Виталий Перов 2008-11-17 19:10:49 MSK
после нажатия на ОК в указанном диалоге, записываются настройки типа:

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'ы в этой вкладке сохранятся.

Возможно они сохраняются в реестр?
Comment 3 Виталий Перов 2008-11-17 20:10:09 MSK
В реестр настройки точно не сохраняются.

В какой файл они сохраняются - выяснить пока не удалось.
Чтобы не тратить лишнее время написал письмо разработчику.
Comment 4 Виталий Перов 2008-11-18 17:56:32 MSK
Получил ответ на письмо:
> Эти настройки лежат не в ini а в ibw8.cfg (для сетевой версии в ibwn8.cfg).

Действительно в указонном файле лежит что-то похожее. Но файл это бинарный!
Теперь понятно почуму для сохранения настроек не используется WritePrivateProfileString.

Настройки записываются какой-то другой функцией (скорее всего не WINAPI).

Пробовал трейсить по каналу file - файл открывается. Но ничего полезного выяснить не удалось.
Comment 5 Виталий Перов 2008-11-19 18:29:26 MSK
Получил ответ от разработчиков Инфо-бухгалтера:

Тут все несколько интереснее, считывание настроек происходит при старте 
программы, изменения хранятся в переменных и записываются в файл при 
закрытии. Т.к. эта настройка сбрасывается при нажатии на ОК в диалоге, 
скорее всего глючит именно Edit (используется стандартное окно ввода 
текста с обработчиками проверки символов на цифры). Причем окно такого 
же типа используется в Отчеты - Материальный отчет - Макс. порядок корр. 
счетов, но там изменения сохраняются. Есть версия, что в wine 
используется не тот разделитель, но тут мы еще посмотрим что конкретно 
там происходит (системный программист находится не в нашем офисе и по 
телефону это выяснять довольно неудобно).
Comment 6 Илья Шпигорь 2009-11-11 16:07:57 MSK
Похоже ошибка и вправду связана с edit контролом, т.к. остальные настройки успешно сохраняются.

Есть небольшое замечание - настройка в edit'е сбрасывается только на той вкладке tab'а, которая была активна при нажатии 'Ок'. Т.е. если на вкладке нет ни одного edit контрола, то все настройки сохранятся.
Comment 7 Илья Шпигорь 2009-11-13 16:55:47 MSK
Удалось выяснить причину ошибки.

Инфо-Бухгалтер закрывает окно "Настройки" таким образом, что сначала уничтожается родитель edit контролов, а потом они сами. Когда родитель уничтожается он посылает WM_DESTROY всем дочерним элементам. Edit контрол обрабатывая это сообщение уничтожает свою EDITSTATE структуру и все дальнейшие сообщения перенаправляет в DefWindowProc. 

После того как родитель уничтожен, перед уничтожением edit контрола приложение запрашивает его текст. Но EDITSTATE, где этот текст хранится, уже нет и запрос обрабатывает DefWindowProc. В результате чего приложение получает неверное значение и параметр сохраняется неверно.

Решить эту проблему без хаков весьма затруднительно. Возможно, стоит пересмотреть способ хранения текста в edit контроле. Послал соответствующий тест на winehq. 

Выложил хак. Это временное решение - хранить текст edit контрола помимо EDITSTATE, еще и как текст окна. На самом деле windows так не делает, но пока ничего лучше придумать не получилось.
Comment 8 Илья Шпигорь 2009-11-13 22:32:17 MSK
Появилась идея, как можно решить багу более корректно. Патч пока прикладывать не надо.
Comment 9 Илья Шпигорь 2009-11-15 14:25:47 MSK
Более корректное решение заключается в том, чтобы уничтожать EDITSTATE структуру по сообщению WM_NCDESTROY. Тесты подтвердили, что в windows такое же поведение контрола.

Соответствующий патч выложил.
Comment 10 Илья Шпигорь 2010-01-20 10:43:11 MSK
Патч приняли в оригинальный wine.