Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с нетипизированным файлом [D5, WinXP]


Gamer ©   (2006-04-08 00:20:00) 

Программа - что-то похожее на адрессную книгу.
Несколько текстовых полей, неопределенной заранее длинны. Это на одного человека.
Если делать запись одна за одной - программа работает нормально. Но если я хочу изменить не последнюю

запись, то делаю вот так:

все записи хранятся в MS:TMemoryStream;
адресса всех записей хранятся в конце файла, в другом TMemoryStream. Я их загружаю в adreslb:TListBox
создаю временное хранилище tempMS:TMemoryStream для дальнейшей работы с записями
создаю временное хранилище res:TMemoryStream для каждого текстового поля

res:=tmemorystream.Create;
TempMS:=tmemorystream.Create;
ms.Seek(0,sofrombeginning);

if pos>1 then begin //если запись первая - копирую предыдущие в TempMS
TempMS.CopyFrom(ms,ishowpos(pos)); //ishowpos(pos) возвращает позицию конца предыдущей записи
end;

дописываю информацию со всех полей в  TempMS

if pos<lastrecord then begin //если запись не последняя - копирую все записи полсе текущей в TempMS

 ms.Seek(ishowpos(pos+1)+1,sofrombeginning); //ishowpos(pos+1)+1 возвращает адресс начала следующей записи

 delta:=TempMS.Position-ishowpos(pos+1); //определяю смещение всех записей

 for i:=pos to Adreslb.Items.count-1 do begin
   Adreslb.Items[i]:=inttostr(strtoint(Adreslb.Items[i])+delta); //изменяю адреса записей в adreslb
 end;
 TempMS.CopyFrom(ms,ms.size-(ishowpos(pos+1)+1)); //дописываю следующие (после текущей) записи
end;

Так вот, если я добавлю информацию в каком-нибуть из полей не последней записи (цже сохраненной), то,

после сохранения, файл не загружается.
А если я удалю информацию, то выводит ошибку 'Stream Read Error'.
Подскажите, пожалуйста, как решыть эту проблемму.
Заранее благодарен.


Gamer   (2006-04-08 13:56:00) [1]


> 1. Для таких целей целесообразнее использовать TFileStream.

Я находил где-то, что TMemoryStream - быстрее. Напишите, почему именно TFileStream?
Заранее благодарен.


Eraser   (2006-04-08 00:39:00) [2]


> Gamer   (08.04.06 00:20)

1. Для таких целей целесообразнее использовать TFileStream.
2. Получше изучи свойства наследников класса TStream, в частности Position и Size и как на них влияют методы Read, Write и CopyFrom.


Наверх

Титульная страница Поиск, карта сайта Написать письмо