Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Чтение многострочного ключа ini-файла


Страницы:   1 2

Kostafey ©   (2007-04-27 17:25:00) 

Подкажите пожалуйста существует ли возможность чтения/записи многстрочных ключей ini-файлов ?
Т.е. что бы вместо

[section1]
key1='жили у бабуси 2 веселых гуся'
key2=...

можно было писать:

[section1]
key='жили у
    бабуси 2
    веселых
    гуся'
key2=...


Kostafey   (2007-04-28 20:16:00) [21]

> [12] clickmaker ©   (28.04.07 17:39)

Пример [12] работает.
Теперь понял в чем ошибка.
Если вместо TIniFile использовать TMemIniFile, то при записи потока
(неважно TStringStream или TMemoryStream) ничего записано не будет.
Вообще.

При использовании TIniFile - для записи, TMemIniFile - для чтения все
работает хорошо.
Будет ли существовать в таком случае при записи с использованием TIniFile
ограничение в 2048 символов ?


clickmaker   (2007-04-28 17:39:00) [22]


> А если даже и запись потока делать - тоже самое получается.


вот так делаешь?

procedure TForm1.Button1Click(Sender: TObject);
var
 IniFile: TIniFile;
 Stream: TStringStream;
begin
 IniFile := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));
 Stream := TStringStream.Create(Memo1.Text);
 try
   IniFile.WriteBinaryStream('Section1', 'key', Stream);
 finally
   IniFile.Free;
   Stream.Free;
 end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 IniFile: TIniFile;
 Stream: TStringStream;
begin
 IniFile := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));
 Stream := TStringStream.Create('');
 try
   IniFile.ReadBinaryStream('Section1', 'key', Stream);
   Memo2.Text := Stream.DataString;
 finally
   IniFile.Free;
   Stream.Free;
 end;
end;


Kostafey   (2007-04-28 16:45:00) [23]

> ну ё... чтобы прочесть как двоичный поток, данные и записаны
> должны быть как двоичный поток
> Ты уж определись

Ну да, по поводу [8] Kostafey ©я молчу - глупость.

А если даже и запись потока делать - тоже самое получается.
В http://kladovka.net.ru/delphibase/?action=viewfunc&topic=fileini&id=10302
как раз такой пример приводится. И он не работает.

Вообще, идея несколько в другом. Я хотел чтобы ini-файл можно было бы читать и
вручную (по F4). Если файл, становится нечитаемым в ручном режиме,
то разницы нет, можно и как [3] Loginov Dmitry ©   (27.04.07 17:47)
предложил сделать.

Или уж вообще тогда читать файл не как ini, а в двоичном режиме,
если, конечно нет лучших вариантов?


clickmaker   (2007-04-28 15:14:00) [24]


> [8] Kostafey ©   (27.04.07 18:50)

ну ё... чтобы прочесть как двоичный поток, данные и записаны должны быть как двоичный поток
Ты уж определись


Kostafey   (2007-04-27 20:22:00) [25]

Вот так да.
http://kladovka.net.ru/delphibase/?action=viewfunc&topic=fileini&id=10302
не работает.
Строки загружаются пустые.


Kostafey   (2007-04-27 18:50:00) [26]

> и как записываешь?

А пока пытаюсь просто прочесть:

 Stream := TStringStream.Create('');
 IniFile.ReadBinaryStream('Query0', 'SQL', Stream);
 ShowMessage(Stream.DataString);

Реальное содержание ini-файла:

[Query0]
sql='Select * from Dogovor, Subject where Dogovor.D_S_id = Subject.S_id'

И выдает [6]

Если просто

ShowMessage(IniFile.ReadString('Query0', 'SQL', ''));

то все OK


clickmaker   (2007-04-27 18:42:00) [27]

при чтении
Stream := TStringStream.Create('');

и как записываешь?


Kostafey   (2007-04-27 18:29:00) [28]

> [5] clickmaker ©   (27.04.07 18:20)

Пробую для однострочного варианта:

var
 ttstr:string;
...
Stream := TStringStream.Create(ttstr);
IniFile.ReadBinaryStream('Section1', 'key', Stream);
ShowMessage(Stream.DataString);

Выдает:
юp-
p-
p-
p-
p-
p-
p-
p-
p-
p-


clickmaker   (2007-04-27 18:20:00) [29]


> IniFile.ReadBinaryStream('Section1', 'key', Stream);

ShowMessage(Stream.DataString);


Kostafey   (2007-04-27 18:19:00) [30]

> существует, измени ко конечного автомата у TIniFile

А как?


> Stream := TStringStream.Create(MultiLineText);

К сожалению не приходилось еще иметь дело с потоками.
Как же правильно считать данные?

 IniFile.ReadBinaryStream('Section1', 'key', Stream);
 Stream.Position:=0;
 Showmessage(Stream.ReadString(100));

Выдает набор символов


> [3] Loginov Dmitry ©   (27.04.07 17:47)

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

> ини ограничена и не может быть больше 2048 символов.

В справке упоминаний об этом я не видел, похоже действительно
нужно работать с TMemIniFile. Спасибо.


Loginov Dmitry   (2007-04-27 17:47:00) [31]

Если так нужно, чтобы в инишке хранился многострочный текст, то можно записать его в виде одной строки:
Ini.WriteString('section1', 'key1',
 StringReplace(S, sLineBreak, '\n', [rfReplaceAll]));

Читать так:
S := StringReplace(Ini.ReadString('section1', 'key1', ''), '\n', sLineBreak, [rfReplaceAll]);

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


clickmaker   (2007-04-27 17:38:00) [32]

Stream := TStringStream.Create(MultiLineText);
IniFile.WriteBinaryStream('Section1', 'key', Stream);


tesseract   (2007-04-27 17:27:00) [33]

существует, измени ко конечного автомата у TIniFile


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо