Форум: "Основная";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
ВнизНепонятка с TStringList, как записать в файл? а потом прочесть Найти похожие ветки
← →
Net_Prosto (2004-04-14 11:05) [0]Здрувствуйте уважаемый кодеры! :) Извеняюсь что отвлекаю Вас от дел, но у меня проблема, которую я не могу решить ни как :(. В файл записываю TStringList, но вот прочитать его ни как не могу. Вот код:
DescFile=record
section:string[255]; //Раздел
Name:string[255]; //Название
Desc:TStringList; //Описание
end;
procedure TfrmMain.DBOpenDesc;
var buf:DescFile;
Begin
AssignFile(FFile,DBFilePath);
Reset(FFile);
mDesc.Lines.Clear; //Объект TMemo
try
while not Eof(FFile) do
begin
buf.Desc:=TStringList.Create;
Read (FFile, Buf);
lFileName.Caption:=buf.Name;
mdesc.Lines.AddStrings(buf.Desc);
buf.desc.free;
end;
finally
CloseFile(FFile);
end;
end;
Gостоянно выскакивает ошибка в памяти, что делать, очень нужно!
← →
Johnmen © (2004-04-14 11:26) [1]А что же ты хочешь, если читаешь из файла адрес Desc ??? Но не содержимое стринглиста ?
← →
Vlad © (2004-04-14 11:32) [2]Desc.LoadFromFile ?
← →
Aleksandr © (2004-04-14 11:59) [3]Ну, нельзя же читать ссылку. Строка-то обычно читается так:
SetLength(s,i);
F.Read(s[1],i)
А не проще создать потомка от TObjectList и научить его "читать" и "писать" свои итемы? Вообще, со StringList на чтение-запись работать не советую - очень медленно, убедился на практике. Как и с файловыми потоками. Гораздо быстрее загружать в TMemoryStream, а оттуда по-объектно.
← →
Net_Prosto (2004-04-14 13:20) [4]Попробовал сделать, но ничего не получилось. Может кто подскажет рабочий код?
SetLength(s,i);
F.Read(s[1],i)
не понял это. И как прочитать не адрес из файла, а содержимое?
Очень благодарен за ответы!
← →
Aleksandr © (2004-04-14 13:48) [5]Ну, например, как записать в файл, считать из файла эту твою запись:
procedure MyDescFileWriteProc(DescFile : TDescFile);
var
i,j : integer;
M : TMemoryStream;
b : byte;
procedure MyWriteStr(aStr : string);
begin
b:=length(aStr); //запоминаем длину строки
M.Write(b,SizeOf(b)); //записываем ее в файл
if b>0 then
M.Write(aStr[1],b) //записываем саму строку
end;
begin
M:=TMemoryStream.Create;
try
MyWriteStr(DescFile.Section);
MyWriteStr(DescFile.Name);
i:=DescFile.Desc.Count; //приводим кол-во к интежеру
M.Write(i,SizeOf(i)); //пишем кол-во в файл
for j:=0 to i-1 do
MyWriteStr(DescFile.Desc.Strings[i]); //все строчки пишем в файл
M.Seek(0,0); //смещаемся вначало, а то данные пропадут
M.SaveToFile("C:\blabla.txt") //сбрасываем на диск
finally
M.Free
end
end;
// а тут все в обратном порядке
procedure MyDescFileReadProc(var DescFile : TDescFile);
var
i,j : integer;
M : TMemoryStream;
s : string;
b : byte;
procedure MyReadStr(var aStr : string);
begin
M.Read(b,SizeOf(b));
Setlength(aStr,b);
if b>0 then
M.Read(aStr[1],b)
end;
begin
M:=TMemoryStream.Create;
try
M.LoadFromFile( "C:\blabla.txt");
M.Seek(0,0);
MyReadStr(DescFile.Section);
MyReadStr(DescFile.Name);
M.Read(i,SizeOf(i));
DescFile.Desc:=TStringList.Create;
for j:=0 to i-1 do begin
MyReadStr(s);
DescFile.Desc.Add(s)
end
finally
M.Free
end
end;
← →
Net_Prosto (2004-04-14 23:07) [6]Большое спасибо за ответ, Aleksandr! Но, у меня не компилируется дальше строки
MyReadStr(DescFile.Section);
пишет: Types of actual and formal var parameters must die identical
как быть?
жду ответа!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.039 c