![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чтение многострочного ключа ini-файла
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