-
procedure TObjBase.SetSelectedColor(ColorName: string);
var
vBlob: TStream;
begin
if UniFindRecord('ClientDataSet1', 'Name', 'Colors') then
if UniFindRecord('DataSet1Properties', 'PropertyName', 'SelectedColor') then
begin
end
else
InsertRecordDataSet1Properties('SelectedColor', 'ColorList', '',
'True', 'False');
DataSet1Properties.Edit;
vBlob := DataSet1Properties.CreateBlobStream
(DataSet1Properties.FieldByName('AnyValue'), bmWrite);
try
vBlob.Seek(0, soFromBeginning);
vBlob.WriteBuffer(ColorName, SizeOf(ColorName));
finally
vBlob.free;
end;
DataSet1Properties.Post;
end; есть вот такой код. Если закоментировать кусок про запись в блоб, и раскомментировать закоментированный кусок, то все работает замечательно. А если вызывать эту процедуру как она написана, то через некоторое количество вызовов (или если ее вызовы спамить, то очень быстро) выскакивает ошибка дальше по коду. Чаще всего Invalid Pointer, или что нибудь типа out of memory или вообще какой нибудь невообразимый кошмар. Из чего я сделал вывод, что запись в блоб неким образом затирает данные программы в памяти. А вот чего я не понял, так это как это победить. З.Ы. Строку надо писать в блоб потому что в поле она не влазит, а программу скачали уже 400 раз и переделывать поле мне совсем не хочется.
-
вопрос снимается vBlob.WriteBuffer(ColorName, Length(ColorName) * sizeOf(ColorName[1])); нужно писать так )
-
не это я поторопился, так тоже самое ( аксес виолейшены и прочее прочее
-
в общем теперь глюк при чтении. Срисовал все со своего же кода который работает. Но почему то он в данном случае не работает. vBlob := DataSet1Properties.CreateBlobStream
(DataSet1Properties.FieldByName('AnyValue'), bmRead);
SetLength(result, vBlob.Size div sizeOf(char));
try
vBlob.Seek(0, soFromBeginning); vBlob.ReadBuffer(result[1], vBlob.Size);
finally
vBlob.free;
end; если читаю так, а пишу как выше, то при чтении в result записывается какая то белеберда. Если vBlob.ReadBuffer(result, vBlob.Size); читать так, то записывается в резалт правильное слово. только вот дальше программа вылетает с аксес виалейшн, что видимо связано с тем, что в string строка начинается со второй позиции. Но что не так то в таком случае в первом варианте?
-
списал у самого себя более внимательно, [1] нужно писать так vBlob.WriteBuffer(ColorName[1], Length(ColorName) * sizeOf(ColorName[1])); приятно иногда поговорить с умным человеком
-
Учитывай, что индексация пустой строки выдаст AV.
|