![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ftGraphic, DBGrid,ClientDataSet,DataSource
я © (2011-09-11 15:03:00)Вообщем делаю локальную базу данных через DataSource и ClientDataSet. В таблице полей есть поле с типом ftGraphic - назовем его ImageSample. На форму соответственно положена также DBGrid в которой отображается эта таблица. Вопросы:
1) Как присвоить полю ImageSample значение в виде собственно этого изображения.
2) Как создать событие при начале редактирования ImageSample. Т.е. при начале редактирования поля должна вызываться процедура в которой прописан выбор и присвоение изображения.
По первому вопросу нашел следующее:
OpenDialog.Options := OpenDialog.Options + [ofEnableSizing];
OpenDialog.Filter := 'Все файлы (*.*)/*.*';
if OpenDialog.Execute then
begin
ADODataSet.Edit;
vBlob := TADOBlobStream.Create(TBlobField(ADODataSet.FieldByName('FileBody')), bmWrite);
vFS:=TFileStream.Create(OpenDialog.FileName, fmOpenRead or fmShareDenyWrite);
try
vBlob.Seek(0, soFromBeginning); // sереход в начало потока BLOB
vBlob.CopyFrom(vFS, vFS.Size);
finally
vFS.Free;
vBlob.Free;
end;
ADODataSet.Post;
end;
Как мне показалось это похоже на то что мне нужно, но тут речь про какой то ADO, что не понятно мне. vBlob := TADOBlobStream.Create(TBlobField(ADODataSet.FieldByName('FileBody')), bmWrite); в частности эта строка осталась для меня загадкой, в особенности то откуда берерется TADOBlobStream. И какие типы переменных используемых в процедуре. Да и вообще я не очень понял что это все значит. По идее файл записывается в буфер и видимо как то присваивается полю, но где именно присваивается непонятно. Вообщем помогите )
я (2011-09-12 15:54:00) [1]
> не знание закона не освобождает от ответственности. и "был
> пьян" не является оправданием. а как бы наоборот...
>
> "не работает справка" также. фактически это скорее призыв
> "забаньте меня", чем повод помогать.
Пришел. Нахамил. Ничем не помог. Забанил. Кросавчег.
Вообщем когда узнаю ответ на вопрос по второму пункту напишу сам. А то среди местных "экспертов" завелись троли.
sniknik (2011-09-12 12:11:00) [2]не знание закона не освобождает от ответственности. и "был пьян" не является оправданием. а как бы наоборот...
"не работает справка" также. фактически это скорее призыв "забаньте меня", чем повод помогать.
Inovet (2011-09-12 11:28:00) [3]> [7] я (12.09.11 11:24)
> не могу, у меня не работает справка
Как можно без справки что-то делать. Чини.
я (2011-09-12 11:24:00) [4]не могу, у меня не работает справка )
sniknik (2011-09-12 10:34:00) [5]> я не в чем не уверен ) никто ж ничего не рассказывает )
F1, вполне понятен и категоричен по этому поводу. черпай уверенность оттуда.
я (2011-09-12 10:06:00) [6]
> А ты уверен что RecNo обязан показывать что-то реальное?
я не в чем не уверен ) никто ж ничего не рассказывает )
Германн (2011-09-12 00:54:00) [7]
> при этом ClientDataSet3.RecNo = -1 .
А ты уверен что RecNo обязанпоказывать что-то реальное?
я (2011-09-12 00:35:00) [8]Нет, в тока что созданой и редактируемой строке тоже чего то записывает, при этом ClientDataSet3.RecNo = -1 .
я (2011-09-12 00:32:00) [9]Всегда приятно поговорить с умным человеком )
Переделал. Так ошибок не выдает, надеюсь что сохраняет, потом научусь обратно выдирать ее оттуда увижу ). Возможно строку нужно предварительно сохранить, т.к. без этого он текущую запись выдает с номером -1.
procedure TForm3.addImage();
var
vBlob:TStream;
vFS:TFileStream;
begin
Form3.OpenDialog.Options := Form3.OpenDialog.Options + [ofEnableSizing];
OpenDialog.Filter := 'Все файлы (*.bmp)/*.bmp';
if OpenDialog.Execute then
begin
ClientDataSet3.Edit;
ShowMessage('num ' +IntToStr(ClientDataSet3.RecNo) + ClientDataSet3.FieldByName('ImageSample').ClassName);
vBlob := ClientDataSet3.CreateBlobStream(ClientDataSet3.FieldByName('ImageSample'), bmWrite);
vFS:=TFileStream.Create(OpenDialog.FileName, fmOpenRead or fmShareDenyWrite);
try
vBlob.Seek(0, soFromBeginning); // sереход в начало потока BLOB
vBlob.CopyFrom(vFS, vFS.Size);
finally
vFS.Free;
vBlob.Free;
end;
ClientDataSet3.Post;
end;
end;
я (2011-09-11 23:06:00) [10]
procedure TForm3.addImage();
var
vBlob:TBlobStream;
vFS:TFileStream;
begin
Form3.OpenDialog.Options := Form3.OpenDialog.Options + [ofEnableSizing];
OpenDialog.Filter := 'Все файлы (*.bmp)/*.bmp';
if OpenDialog.Execute then
begin
ClientDataSet3.Edit;
vBlob := TBlobStream.Create(TBlobField(ClientDataSet3.FieldByName('ImageSample')), bmWrite);
vFS:=TFileStream.Create(OpenDialog.FileName, fmOpenRead or fmShareDenyWrite);
try
vBlob.Seek(0, soFromBeginning); // sереход в начало потока BLOB
vBlob.CopyFrom(vFS, vFS.Size);
finally
vFS.Free;
vBlob.Free;
end;
ClientDataSet3.Post;
end;
end;
преобразил пример в это. Вылетает по ошибке на строке
vBlob := TBlobStream.Create(TBlobField(ClientDataSet3.FieldByName('ImageSample')), bmWrite);
First chance exception at $75C49673. Exception class EInvalidCast with message 'Invalid class typecast'. (8680)
((