![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Invalid Pointer operation
вова © (2013-11-24 20:21:00)
vBlob := ClientDataSet3.CreateBlobStream
(ClientDataSet3.FieldByName('massSample'), bmRead);
SetLength(BufX, vBlob.Size div SizeOf(word));
try
vBlob.Seek(0, soFromBeginning); // sереход в начало потока BLOB
vBlob.ReadBuffer(BufX[0], vBlob.Size);
if vBlob.Size = 0 then
begin
vBlob.free;
exit;
end;
finally
vBlob.free;
end;
вот код, но если vBlob.Size = 0, то на слове exit; он вылетает с ошибкой Invalid Pointer operation. и я не понял. Ну да, блоб пустой, но я же его создавал, значит нужно и освободить, чего ему не нравится и как правильно?
Anatoly Podgoretsky (2013-11-25 13:55:00) [1]
begin
vBlob.free;
exit;
end;
А смысл в этот какой?
Убрать, начиная с if vBlob.Size = 0 then
Юрий Зотов (2013-11-25 00:19:00) [2]> вова
И есть подозрение, что при такой установке длины массива весь поток в него не влезет. Да и надо ли вообще копировать поток в массив?
Юрий Зотов (2013-11-24 23:50:00) [3]> вова
if vBlob.Size = 0 then
Наверное, эту проверку лучше делать сразу после создания vBlob?
vBlob := ClientDataSet3.CreateBlobStream(...);
try
if vBlob.Size <> 0 then
begin
...
end
finally
vBlob.free
end;
RWolf (2013-11-24 21:58:00) [4]да.
вова (2013-11-24 21:15:00) [5]т.е. если даже делаешь exit, то он все равно заходит в finally??
RWolf (2013-11-24 20:39:00) [6]vBlob.free может выполниться два раза.