Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TIniFile и многострочный текст, Как записать\прочитать? 
:(
    Опции темы
stab
Дата 16.6.2005, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



Посоветуйте каким образом в TIniFile лучше хранить многострочный текст. Надо сохранить\прочитать строковое значение такого вида:

Цитата
Line1
Line2
Line3


Хранить надо именно в ini-файлах, т.к. сторонние утилиты для, которых нужен этот файл требуют ini и ни чего другого.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Pakshin A. S.
Дата 16.6.2005, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Легче не придумать!!!

Заменяем ^M^J на какой-нить символ, например |

Запихиваем это в файл...

При чтении заменяем | на ^M^J

Запихиваем это в мемо....
PM   Вверх
stab
Дата 16.6.2005, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



Парадоксально, но именно так и пробовал, пишется нормально, а вот читается только до первой трубы (|), а дальше нет, пробовал на Windows XP Pro Eng SP2. Плюс к этому, в документации написано, что символы с кодами меньше 32 (пробел) могут не читаться.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Akella
Дата 16.6.2005, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Код

Var
  slIni:TStringList;
begin
try
  slIni:=TStringList.create;
  slIni.Clear;
  slIni.loadfromfile('c:\myfolder\file.ini');
или
  slIni.savetofile('c:\myfolder\file.ini');
finally
slIni.free;
slIni:=nil;
end;


PM MAIL   Вверх
Pakshin A. S.
Дата 16.6.2005, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Вот код на всякий случай:

Код

const
 EnterI = '|'; // Переход на строку в файле
 EnterM = ^M^J; // переход на строку в компоненте

function IniEnter(Str: string):string;
begin
 if Pos(EnterI, Str) = 0
  then
   Result:=StringReplace(Str, EnterM, EnterI, [rfReplaceAll])
  else
   Result:=StringReplace(Str, EnterI, EnterM, [rfReplaceAll])
end;

Добавлено @ 08:48
Код

uses IniFiles;

const
 EnterI = '|';
 EnterM = ^M^J;

function IniEnter(Str: string):string;
begin
 if Pos(EnterI, Str) = 0
  then
   Result:=StringReplace(Str, EnterM, EnterI, [rfReplaceAll])
  else
   Result:=StringReplace(Str, EnterI, EnterM, [rfReplaceAll])
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 f: TIniFile;
begin
 f:= TIniFile.Create('C:\Demo.ini');
 f.WriteString('Demo', 'Memo', IniEnter(Memo1.Lines.Text));
 f.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 f: TIniFile;
begin
 f:= TIniFile.Create('C:\Demo.ini');
 Memo1.Text:=IniEnter(f.ReadString('Demo', 'Memo', ''));
 f.Free;
end;


Все работает... на достаточно больших мемо...

Это сообщение отредактировал(а) Pakshin A. S. - 16.6.2005, 08:48
PM   Вверх
stab
Дата 16.6.2005, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



Pakshin A. S., не работает в общем этот метод, попробую другие разделители...


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Pakshin A. S.
Дата 16.6.2005, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



У меня ХР Prof работает с 1000 строк по четыре буквы в каждой...

Не наю... Может не то что-то написал?
PM   Вверх
stab
Дата 16.6.2005, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



Может можно как-нибудь без разделителей обойтись? Хранить, например, каждую строку в отдельном значении... т.е. что-то вроде:

Цитата
Value_Line1=Line1
Value_Line2=Line2
Value_Line3=Line3
...


или как-то проще можно?


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Pakshin A. S.
Дата 16.6.2005, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



НАФИГ? Проверь корректность кода... У меня свободно работает прога с цифрами в каждой строчке от 1 до 64000... Долго правда, но все-таки работает!
PM   Вверх
stab
Дата 16.6.2005, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



А все, понял в чем беда, при записи ^J оставался. Спасибо за то, что убедил, что метод рабочий, а то я уже начал всякие извращения выдумывать. smile


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Pakshin A. S.
Дата 16.6.2005, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Т. е.? Что в итоге написал?
Добавлено @ 09:13
Кстати, а ини файл то не безразмерный!

Я бы все-таки в отдельном текстовом хранил... Или вообще для всего этого создал бы базу данных и работал с нею, т. к. по-моему это быстрее...
Добавлено @ 09:16
Вариант разонравился...
smile Плохой вариант smile Плохой вариант smile Плохой вариант...
PM   Вверх
Pakshin A. S.
Дата 16.6.2005, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



О! Вот это больше нравится...

Код

uses IniFiles;

const
 EnterI = '|';
 EnterM = ^M^J;
 Ident = 'Memo';
 NextIdent = 'Memo2';

function IniEnter(Str: string):string;
var
 i:integer;
begin
 if Pos(EnterI, Str) = 0
  then
   Result:=StringReplace(Str, EnterM, EnterI, [rfReplaceAll])
  else
   Result:=StringReplace(Str, EnterI, EnterM, [rfReplaceAll])
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 f: TIniFile;
begin
 f:= TIniFile.Create('C:\Demo.ini');
 f.WriteString('Demo', Ident, IniEnter(Memo1.Lines.Text));
 f.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 s:string;
begin
 RichEdit1.Lines.LoadFromFile('C:\Demo.ini');
 s:=RichEdit1.Text;
 Delete(s, 1, Pos(Ident, s) + Length(Ident));
 s:=Copy(s, 1, Pos(NextIdent+'=', s)-1);
 Memo1.Lines.Text:=IniEnter(s);
end;


Только RichEdit нуна спрятать или заменить его на что-нить создаваемое тут же...
Добавлено @ 09:29
Вместо NextIdent можно какой-нить постфикс использовать и дописывать его к преобразованному тексту...
PM   Вверх
stab
Дата 16.6.2005, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



Цитата(Pakshin @ 16.6.2005, 06:11)
Т. е.? Что в итоге написал?

Как у тебя, у меня замена была по ^M только.
Цитата(Pakshin @ 16.6.2005, 06:11)
Я бы все-таки в отдельном текстовом хранил... Или вообще для всего этого создал бы базу данных и работал с нею, т. к. по-моему это быстрее...

Я бы тоже, но нужно, как говориться, backward compatibility обеспечить.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Pakshin A. S.
Дата 16.6.2005, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Цитата
backward compatibility


А по-русски?
PM   Вверх
<Spawn>
Дата 16.6.2005, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Pakshin A. S. Видимо, "обратная совместимость" smile

Добавлено @ 12:24
Имхо, плохая идея хранить такие массивы текста в Ini... Обязательно должен быть другой выход. Почему, к примеру, не хранить пути в INI к реальным файлам с данными?


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0911 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.