Вниз
Скачать: CL | DM;

Удаление данных из потока TMemoryStream   Найти похожие ветки 

← →
beglec   (2008-03-24 08:47) [0]

Подскажите пожалуйста как лучше вырезать несколько байт из потока TMemoryStream;

У меня есть несколько потоков в которых хранится разная типизированная информация, но в одном потоке один тип.
я сделал процедуру.

// ------------------------------------------------------------------------------ удаление данных из любого потока
// stream - поток данных
// _id - номер записи в потоке
// _size_record - размер одной записи
procedure EraseRecordInStream(var _stream: TMemoryStream; _id,_size_record: Integer); // _id - это порядковый номер записи в самом потоке а не в базе данных, это сделано в связи с тем, что IDRec неизвестно где определен у записи. Бывает по разному
var stream2: TMemoryStream;
   buf: array of byte; // размер 1 записи
begin
  if _stream.Size=0 then Exit;                                                  // если в потоке нет данных то и удалять нечего
  Stream2  :=TMemoryStream.Create;                                              // создаем поток для копирования данных
  SetLength(buf,_size_record);                                                  // размер одной записи
  _stream.Seek(0,soFromBeginning);                                              // переходи в начало потока
  while _stream.Position<_stream.Size do                                        // пройтись по всему потоку
  begin
     _stream.Read(buf,_size_record);                                            // читаем запись/данные
     // после это строки _size_record получает бешенное значене отличное от входящего, а buf все равно 0 хотя данные в потоке есть, проверял SaveToFile

     if (_stream.Position div _size_record)=_id then Continue;                  // если запись, которая требует удаления то не записываем в новый поток
     Stream2.Write(buf,_size_record);                                           // записываем запись в новый поток
  end;
  _stream.Clear;                                                                // очищаем входящий поток от данных
  _stream.LoadFromStream(Stream2);                                              // загружаем в нужный поток и зановго сформированного потока данных
  Stream2.Free;                                                                 // убиваем временный поток
end;

в чем дело не подскажите ?
Заранее благодарен


← →
TUser ©   (2008-03-24 08:53) [1]


> я сделал процедуру.
>
> в чем дело не подскажите ?

:9) дело в том, что тебе понадобилась процедура, наверное.

Из возможных подводных камней - надо внимательно вычислять size_record, учитывая, что записи могут быть объявлены со словом packed или без него. Ну, а вообще, я бы не создавал дополнительного потока.


← →
beglec   (2008-03-24 08:59) [2]

дык предложите решение.
я не утверждаю что мое решение идеально.

>> надо внимательно вычислять _size_record
дык я его не вычисляю!
оно просто в Read меняется - вопрос почему?


← →
MBo ©   (2008-03-24 09:16) [3]

ошибка в работе с дин. массивом

_stream.Read(buf[0],_size_record);    

c write аналогично


← →
beglec   (2008-03-24 09:27) [4]


> MBo

спасибки все сработало



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.014 c
3-1196237600
pavel_guzhanov
2007-11-28 11:13
2008.04.20
UDF для Firebird


3-1195535563
Skyle
2007-11-20 08:12
2008.04.20
Midas(D5)->DataSnap(BDS 2006/2007)


15-1204502666
Поп Гапон
2008-03-03 03:04
2008.04.20
А как китайцы набирают текст


15-1204520510
ryden
2008-03-03 08:01
2008.04.20
Помогите найти иконки для прграммы


15-1204730152
dmitry_12_08_74
2008-03-05 18:15
2008.04.20
Требования к курсорам для совместимости с разными версиями Window




   Наверх