Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Хранение строковых констант в программе


Автор: Keeper89 14.8.2009, 18:48
Доброго времени суток!

Перейду сразу к вопросу. Как лучше и где лучше хранить строки, заголовки окон, динамические сообщения и т.п.? В INI, защищенном хранилище, реестре или еще как-то? Например, Тотал Коммандер делает это в языковых INI-файлах. 
Хотелось бы хранить эти данные в определенном месте, а при необходимости (или при загрузке приложения) загружать.
Также интересует хранение настроек (больших массивов данных, строковых массивов и т.п.).

Т.е. вопроса 2, но они смежны:
1) хранение программных констант, строк меню, окон сообщений и т.д.).
2) хранение настроек программы (строковых массивов, записей и т.п.).

Если будут примеры реализации - прекрасно.

Заранее спасибо.

Автор: Данкинг 14.8.2009, 19:24
В реестре. Но если у юзера нет прав на изменение реестра, тогда на помощь приходит INI. smile 

Автор: Keeper89 14.8.2009, 19:59
Данкинг, т.е. хранить сотни строк в реестре?

Автор: NightmareZ 14.8.2009, 20:16
Я храню в xml.

Автор: Данкинг 14.8.2009, 21:18
Нет, если сотни строк - то ответ ясен. Просто раньше (не знаю, как сейчас) одним из условий сертификации программы Microsoft'ом было хранение данных именно в реестре. Потому и говорю. smile 

Автор: Bose 15.8.2009, 02:17
Цитата(Данкинг @  14.8.2009,  18:24 Найти цитируемый пост)
В реестре. Но если у юзера нет прав на изменение реестра, тогда на помощь приходит INI. smile  

Так не бывает. Не должно быть. Пользователь должен иметь доступ на запись в HKCU. 

Цитата(Keeper89 @  14.8.2009,  18:59 Найти цитируемый пост)
Данкинг, т.е. хранить сотни строк в реестре? 

Ни в коем случае. Лучше в любом текстовом файле, в том же ini, или xml. В чём больше нравится в том и храни.

Автор: ~FoX~ 15.8.2009, 11:06
Цитата(Keeper89 @  14.8.2009,  19:48 Найти цитируемый пост)
больших массивов данных, строковых массивов и т.п.
, можно и в БД хранить...
Лично я пользуюсь типизированными файлами, храню многомерные массивы, больше 60 тыс. итемов. 

Автор: Keeper89 15.8.2009, 12:36
Права на запись в принципе не нужны, т.к. в первом случае (строки в программе) данные будут только считываться.

В связи с этим вопрос: допустим необходимо вывести сообщение
Цитата

"Пользователь МАША успешно зарегистрирован."
,
 где МАША - определенная переменная. 
Или другой вариант (с 2 переносами):
Цитата

"Пользователь
МАША
успешно зарегистрирован."

Как эти строки хранить в файле (INI-например) и как ее вывести в сообщении?
smile smile

Автор: Данкинг 15.8.2009, 13:46
Как-то так хранить (если я правильно понимаю задание):
Код

procedure to_file;
var
fff: TextFile;
fn,txt:string;
begin
 txt:='Пользователь '+chr(13)+'МАША'+chr(13)+'успешно зарегистрирован';
 fn:='i:\asssss.txt';
 assignfile(fff,fn);
 rewrite(fff);
 writeln(fff,txt);
 Closefile(fff);
end;


Это в обычном текстовом файле, разумеется. А вот если кто приведёт пример, как хранить в XML, то я тоже буду благодарен, так как с XML никак не разберусь.

Автор: bems 15.8.2009, 15:14
Код

Пользователь %s успешно зарегистрирован


Код

ShowMessage(Format(sReadFromFile, ['МАША']))

где sReadFromFile переменная куда ты заблаговременно прочитал

Автор: Keeper89 15.8.2009, 15:40
bems, а как быть со вторым случаем (число переносов не известно)? 

Автор: bems 15.8.2009, 21:54
не понял вопроса. А когда становится известно?

Автор: Keeper89 15.8.2009, 23:32
Ну написал я в языковом файле вот так (пример из коммандера):
Цитата

97="Переименовать/переместить файлы (%i шт.) в:"

Если заменить это на
Цитата

97="Переименовать/переместить файлы\n (%i шт.) в:\n"

То добавится 2 переноса.

В Format я не нашел автоматического преобразования "Сишных" спецсимволов, как быть? И как это может быть реализовано в TC? smile

Автор: Qu1nt 16.8.2009, 00:43
М?
Код

ShowMessage(StringReplace('blah\n blah\n', '\n', sLineBreak, [rfReplaceAll, rfIgnoreCase]));

Автор: bems 16.8.2009, 08:52
Или как вариант - символы переноса в файле остаются символами переноса в сообщении
(то есть если внутри кавычек - перенос это данные, если снаружи - разделитель)
Как быть если нужно иметь кавычки частью строки - не спрашивай)

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