Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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)
((


Наверх

Титульная страница Поиск, карта сайта Написать письмо