Главная страница
    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.47 MB
Время: 0.029 c
1-1081957227
kEY//
2004-04-14 19:40
2004.05.02
HotKeys


14-1081396385
valex1
2004-04-08 07:53
2004.05.02
Почтовый форум


8-1074610714
Laumer
2004-01-20 17:58
2004.05.02
Как выключить другие звуки и вывести свой


7-1078826887
Dimedrol
2004-03-09 13:08
2004.05.02
Как заблокировать клавишу Esc ?


1-1081873552
Fred Perry
2004-04-13 20:25
2004.05.02
Как получить из clipboard а HTML-код фрагмнета,скопир.из браузера





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский