Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
4-1077893106
alxx
2004-02-27 17:45
2004.05.02
Создаю Static... Получаю иероглифы вместо кириллицы.


4-1079030059
BaDeVlad
2004-03-11 21:34
2004.05.02
Как сделать многоуровневую отмену в Richedit?


11-1065696703
Aser
2003-10-09 14:51
2004.05.02
Кириллица в sqlitecc


7-1079255336
threeve
2004-03-14 12:08
2004.05.02
Shut down


1-1081861663
_новый_
2004-04-13 17:07
2004.05.02
как убрать пробелы по краям в строке?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский