Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Пользовательские настройки и их хранение


Автор: VasRip 28.5.2013, 14:34
Как правильно реализовать хранение пользовательских настроек приложения. такие как размеры окон положения кнопок, выбранные фильтры и и другие мелочи полезные пользователю. 


В каком формате и если есть компоненты для хранения подскажите плизз

Автор: Dem_max 28.5.2013, 16:02
Ini File

Автор: VasRip 29.5.2013, 07:56
говорят Ini  прошлый век. может есть еще какие варианты кроме INI ???


просто хочется рассмотреть все варианты и выбрать лучший  

Автор: Usper 29.5.2013, 08:40
Нагло врут! smile Как вариант хранить в реестре.

Автор: Dem_max 29.5.2013, 09:21
Ну еще XML

Автор: Alexeis 29.5.2013, 10:07
 XML хорошо, поскольку позволяет хранить удобно древовидные структуры данных, юникодные строки и т.д. , но есть у него один минус - не умеет хранить массивы. С этой точки зрения лучше формат JSON . Он более современный, позволяет хранить не только древовидные структуры, но и массивы, и массивы объектов, но тоже имеет один недостаток - у него юникодные строки хранятся в нечитабельном для блокнота виде. 
  У билдера есть встроенные классы для работы с JSON, впрочем и MSXML тоже поддерживается.

  Если деревья не нужны, а уровень вложенности простой, то ini, почему нет. Возможно, его считали несовременным, потому что раньше его принято было хранить в папке с программой, в этом случае он был общим для всех пользователей. Но ведь ничего не мешает разместить его в пользовательской директории APPDATA . 

Автор: VasRip 29.5.2013, 10:37
ну ясно спс БОЛЬШОЕ

Автор: Alexeis 29.5.2013, 10:49
  А ну да, еще Ini файлы по спецификации не поддерживают юникод. Если и можно работать в юникоде, то специальными библиотеками, выходящими за рамки спецификации. 

Автор: Usper 2.7.2013, 09:00
А где лучше хранить ini-файлы? Было бы не плохо положить рядом с исполняемым файлом, но ведь исполняемый файл может оказаться в папке куда у него не будет прав на запись... И как проверить, что файл вообще создан, если пользоваться встроенным в билдер классом TIniFile?

Автор: xvr 2.7.2013, 11:45
Цитата(Usper @  2.7.2013,  09:00 Найти цитируемый пост)
А где лучше хранить ini-файлы?

У пользователя в профиле. Доступен в виде переменной окружения APPDATA (альтернатива - USERPROFILE)


Автор: Usper 2.7.2013, 15:18
Но всё-таки есть ли возможность что-нибудь записать в файл, который будет лежать рядом с исполняемым, где-нибудь в program files?

Автор: Alca 2.7.2013, 15:52
Ну так попробуй  smile 

Автор: Usper 2.7.2013, 16:28
Дык попробовал, не выходит ничего  smile стандартный класс TIniFile старичка билдера 6 ничего не делает (даже никаких сообщений об ошибке не выдаёт) на вин7, если я пытаюсь сохранить настройки рядышком в ProgramFiles. Понятно, что можно найти пользовательскую папку, но не хотелось бы smile 

Автор: Alca 2.7.2013, 17:25
Код покажи

Автор: volatile 2.7.2013, 19:38
Цитата(Usper @  2.7.2013,  16:28 Найти цитируемый пост)
старичка билдера 6 ничего не делает (даже никаких сообщений об ошибке не выдаёт) на вин7, если я пытаюсь сохранить настройки рядышком в ProgramFiles.

Чтобы писать реально в ProgramFiles/*.* нужно запускать программу с правами админа.

Для старых программ вин7 перенаправляет запись в какой-то из каталогов пользователя (точно не помню).
Так что искать этот ини файл, в ProgramFiles не нужно.

Автор: Dem_max 3.7.2013, 04:29
Цитата(Alexeis @ 29.5.2013,  10:49)
А ну да, еще Ini файлы по спецификации не поддерживают юникод. Если и можно работать в юникоде, то специальными библиотеками, выходящими за рамки спецификации.

Не знаю как у тебя, но у меня в Ini файле хранятся юникодные строки, и пользуюсь обычным TIniFile !!!!

Автор: Usper 3.7.2013, 09:51
volatile, у меня в ProgramFiles в семёрке в каталоге оперы валяются какие-то логи. Значит ли это, что всё-таки можно исхитрится и записать что-нибудь в ProgramFiles без админских прав? На самом деле мне не ini файл нужно сохранять, а результаты калибровки прибора (по сути просто текстовый файл с цифрами) и как-то не логично их хранить где-то отдельно. Но похоже другого выхода нет.

Автор: xvr 3.7.2013, 09:59
Цитата(Usper @  3.7.2013,  09:51 Найти цитируемый пост)
Значит ли это, что всё-таки можно исхитрится и записать что-нибудь в ProgramFiles без админских прав?

Почти. Вот на http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8C_%D1%83%D1%87%D1%91%D1%82%D0%BD%D1%8B%D1%85_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B5%D0%B9_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D0%B5%D0%B9есть статья по этому поводу

Автор: volatile 3.7.2013, 11:43
Цитата(Usper @  3.7.2013,  09:51 Найти цитируемый пост)
у меня в ProgramFiles в семёрке в каталоге оперы валяются какие-то логи.

Скорей всего это логи инсталятора, который всегда запускаецца с админ правами.
Опера врядли будет туда писать.

Добавлено через 7 минут и 18 секунд
Вообще по идеологии M$, в ProgramFiles обычная программа не должна ничего писать.
Если нужно что-то общее для всех, то есть соответствующий каталог "\Users\All Users\" или что-то типо того.

Добавлено через 13 минут и 9 секунд
Цитата(volatile @  3.7.2013,  11:43 Найти цитируемый пост)
 "\Users\All Users\" или что-то типо того. 

есть переменная окружения ALLUSERSPROFILE

Автор: Usper 3.7.2013, 14:42
Да нет, это логи краша Java-машины smile правда они подозрительно старые.
В общем картина вцелом ясна, нужно забить на порочную практику писать куда хочешь и что хочешь smile даже если это вызывает определённые (на самом деле довольно сильные! приборов к компу может быть подключено несколько и калибровочные данные у каждого свои, пока это решается созданием отдельных папочек для каждого прибора) неудобства. Всем спасибо!

Автор: VasRip 8.7.2013, 13:54
ну первое это права админа) а второе не вижу не каких проблем писать рядом с исполнимым файлом
пишу
Код

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
TIniFile *Ini=new  TIniFile(GetCurrentDir()+"/options.ini"); //настройк
Ini->WriteInteger("Edits","DBGrid1",DBGrid1->Width);
Ini->WriteInteger("Edits","DBGrid1_ID_OBJECT",DBGrid1->Columns->Items[0]->Width);
Ini->WriteInteger("Edits","DBGrid1_FIO",DBGrid1->Columns->Items[1]->Width);
Ini->WriteInteger("Edits","DBGrid1_ADDRESS",DBGrid1->Columns->Items[2]->Width);

Ini->WriteInteger("Edits","DBGrid2",DBGrid2->Width);
Ini->WriteInteger("Edits","DBGrid2_ID_OBJECT",DBGrid2->Columns->Items[0]->Width);
Ini->WriteInteger("Edits","DBGrid2_DAT",DBGrid2->Columns->Items[1]->Width);
Ini->WriteInteger("Edits","DBGrid2_RESULT",DBGrid2->Columns->Items[4]->Width);

delete Ini;
}


читаю
Код

void __fastcall TForm1::FormCreate(TObject *Sender)
{



TIniFile *Ini=new  TIniFile(GetCurrentDir()+"/options.ini"); //настройк
 DBGrid1->Width=Ini->ReadInteger("Edits","DBGrid1",0);
 DBGrid1->Columns->Items[0]->Width=Ini->ReadInteger("Edits","DBGrid1_ID_OBJECT",0);
 DBGrid1->Columns->Items[1]->Width=Ini->ReadInteger("Edits","DBGrid1_FIO",0);
 DBGrid1->Columns->Items[2]->Width=Ini->ReadInteger("Edits","DBGrid1_ADDRESS",0);
 DBGrid1->Font->Size=Ini->ReadInteger("Font","Font_size",0);
 DBGrid1->Font->Name=Ini->ReadString("Font","Font_Font","000");

 DBGrid2->Width=Ini->ReadInteger("Edits","DBGrid2",0);
 DBGrid2->Columns->Items[0]->Width=Ini->ReadInteger("Edits","DBGrid2_ID_OBJECT",0);
 DBGrid2->Columns->Items[1]->Width=Ini->ReadInteger("Edits","DBGrid2_DAT",0);
 DBGrid2->Columns->Items[4]->Width=Ini->ReadInteger("Edits","DBGrid2_RESULT",0);
 DBGrid2->Font->Size=Ini->ReadInteger("Font","Font_size",0);
 DBGrid2->Font->Name=Ini->ReadString("Font","Font_Font","000");
 delete Ini;



}


Единственная проблема это права админа. 

Автор: volatile 8.7.2013, 22:59
1.
Цитата(VasRip @  8.7.2013,  13:54 Найти цитируемый пост)
Единственная проблема это права админа. 

а никто и не говорил что там какие-то проблемы, кроме прав админа.

2.
Цитата(VasRip @  8.7.2013,  13:54 Найти цитируемый пост)
 TIniFile(GetCurrentDir()+"/options.ini"); //настройк

Вы пишете не в каталог программы, а в текущую директорию.
То что они у вас по случаю совпадают, не означает что так будет всегда.

Автор: Dem_max 9.7.2013, 09:08
Цитата

То что они у вас по случаю совпадают, не означает что так будет всегда.

Все верно, а иногда current dir может выдавать хитрый путь куда либо !!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)