Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.19;
Скачать: CL | DM;

Вниз

Глюк с INI файлами?   Найти похожие ветки 

 
Igor__ ©   (2002-09-07 22:05) [0]

Может это и не глюк, но если можете, то помогите.
На форме стоит RichEdit1, Button1(Сохранить), Button2(Загрузить).
Две процедуры:
procedure TForm1.Button1Click(Sender: TObject);
var
ini:TIniFile;
s:TMemoryStream;
begin
S:=TMemoryStream.Create;
Ini:=TiniFile.Create("demo.ini");

RichEdit1.Lines.SaveToStream(S);
ini.WriteBinaryStream("1","1",S);

ini.Free;
s.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
ini:TIniFile;
s:TMemoryStream;
begin
S:=TMemoryStream.Create;
Ini:=TiniFile.Create("demo.ini");

ini.ReadBinaryStream("1","1",S);
RichEdit1.Lines.LoadFromStream(s);

ini.Destroy;
s.Destroy;
end;


И проблема: в ini не пишет и не читает.


 
Юрий Зотов ©   (2002-09-07 23:56) [1]

Искал-искал, но в классе TIniFile методов Read/WriteBinaryStream так и не нашел. Скопировал Ваш код в Delphi - и она тоже не нашла.

> И проблема: в ini не пишет и не читает.
Проблема не в этом. Проблема в том, что даже не компилируется.

> Глюк с INI файлами
Вы уверены, что глюк именно с INI файлами?


 
Igor__ ©   (2002-09-08 04:13) [2]

Может у тебя не тот Delphi?
У меня D6 и там есть ReadBinaryStream унаследованный от TCostumIniFile.
Если у тебя нет такой функции тогда , пожалуйста, посоветуй, как записать TMemoryStream в ini файл.


 
kex86 ©   (2002-09-08 05:10) [3]

А ты (или Вы) вообще находил файл "demo.ini"? Насколько мне известно, файлы инициализации по умолчанию находятся в системной папке, там же и создаются (c:\windows\, кажется), короче, попробуй написать полное имя файла
sazonov_n@mail.ru


 
Igor__ ©   (2002-09-08 05:48) [4]

Находил:
[1]
1=


 
Юрий Зотов ©   (2002-09-08 14:13) [5]

Да, у меня D5. Sorry, что не обратил внимания на заголовок.

Вот первое, что пришло в голову. Проверено, работает. От версии Delphi и Windows не зависит. Но это решение "в лоб" - побайтовое сохранение/чтение с преобразованием каждого байта в его шестнадцатиричное строковое представление (при сохранении) и обратно (при чтении). Алгоритм универсальный и надежный, но наверное, самый неэкономный и самый медленный из всех возможных.

Впрочем, идея ясна, а если потребуется - усовершенствуйте. И еще - имейте в виду, что RichEdit, помимо самого текста, пишет свою служебную информацию (поэтому для чистоты эксперимента я взял Memo - с ним лучше отлаживаться).

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject); // Save
procedure Button2Click(Sender: TObject); // Load
private
FIniFileName: string;
FSection: string;
FKey: string;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
FIniFileName := ChangeFileExt(Application.ExeName, ".ini");
FSection := "Section";
FKey := "Key"
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Stream: TMemoryStream;
P: ^Byte;
S: string;
i: integer;
begin
Stream := TMemoryStream.Create;
try
Memo1.Lines.SaveToStream(Stream);
P := Stream.Memory;
for i := 1 to Stream.Size do
begin
S := S + IntToHex(P^, 2);
P := Pointer(DWORD(P) + 1)
end
finally
Stream.Free
end;
with TIniFile.Create(FIniFileName) do
try
WriteString(FSection, FKey, S)
finally
Free
end
end;

procedure TForm1.Button2Click(Sender: TObject);
var
Src: string;
Dest: array of byte;
i: integer;
begin
with TIniFile.Create(FIniFileName) do
try
Src := ReadString(FSection, FKey, "")
finally
Free
end;
SetLength(Dest, Length(Src) div 2);
for i := 0 to Length(Dest) - 1 do
Dest[i] := StrToInt("$" + Src[2 * i + 1] + Src[2 * i + 2]);
with TMemoryStream.Create do
try
WriteBuffer(Dest[0], Length(Dest));
Memo1.Lines.Text := String(PChar(Memory))
finally
Free
end
end;


 
Moris   (2002-09-08 17:23) [6]

Вобшем то не вижу большой проблемы
Надо только хелп читать внимательно


 
Moris   (2002-09-08 17:32) [7]

Перед записью потока непомешалобы установить позиция
в нем а то она указывает на конец
procedure TForm1.Button1Click(Sender: TObject);
var
ini:TIniFile;
s:TMemoryStream;
begin
S:=TMemoryStream.Create;
Ini:=TiniFile.Create("c:\temp\demo.ini");
RichEdit1.Lines.SaveToStream(S);
s.Seek(0,soFromBeginning);
ini.WriteBinaryStream("1","1",S);
ini.Free;
s.Free;
end;
И все, у меня работает такчто Igor__ © идея у тебя была правельная


 
Smiths   (2002-09-08 19:34) [8]

А разве у ini-файла нет ограничения на размер в 64 Кб?



Страницы: 1 вся ветка

Текущий архив: 2002.09.19;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.016 c
14-61259
BigBadMutuh
2002-08-17 01:33
2002.09.19
Нужен козырной снимок или рисунок бабочки.


14-61260
Пахан
2002-08-23 09:33
2002.09.19
DELPHI 6


1-61152
Коля
2002-09-07 04:49
2002.09.19
Как прочесть данные из бинарного файла?


3-60983
juster
2002-08-24 11:31
2002.09.19
SQL запрос


3-61018
Logo
2002-08-28 13:12
2002.09.19
Field not found