Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.04.20;
Скачать: 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 вся ветка

Текущий архив: 2008.04.20;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.021 c
4-1187433709
Inject
2007-08-18 14:41
2008.04.20
Инжект DLL в чужой процесс


3-1195294675
Neket
2007-11-17 13:17
2008.04.20
Расчет среднего значения.


2-1206474840
delphinub
2008-03-25 22:54
2008.04.20
Transaction приводит в исключению


2-1206708622
asdf2
2008-03-28 15:50
2008.04.20
DataSet


15-1204541719
Kerk
2008-03-03 13:55
2008.04.20
Придумайте чего можно сделать на домене urlz.ru