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

Вниз

Непонятка с 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.023 c
1-1081686827
uuuh
2004-04-11 16:33
2004.05.02
Уважаемые Мастера, подскажите как сделать экспишны ProgressBar


14-1081451242
УНЯ
2004-04-08 23:07
2004.05.02
Ж


7-1078836911
ChcngerMan
2004-03-09 15:55
2004.05.02
Сканирование


4-1078608348
GanibalLector
2004-03-07 00:25
2004.05.02
какой uses для RasCreatePhoneBookEntry?


3-1081403294
Vilux
2004-04-08 09:48
2004.05.02
Не могу понять. почему не работает BETWEEN