![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не могу понять, в чем ошибка. [D7, ClientDataSet]
DmitryNekl © (2006-03-23 12:26:00)Буду признателен за помощь.
Хочу сохранить картинку jpeg в базу.
База - компонент ClientDataSet (name='photos').
Код создания формы:
photos.FileName:=ExtractFilePath(Application.ExeName)+'photos.cds';
if not FileExists(photos.FileName) then
begin
photos.FieldDefs.Clear;
photos.FieldDefs.Add('id', ftInteger);
photos.FieldDefs.Add('photo', ftBlob);
photos.CreateDataSet;
end;
photos.Open;
photos.SaveToFile();
Затем пытаюсь сохранить картинку:
if Image1.Picture.Graphic is TJPegImage then
begin
bs:=TBlobStream.Create(TBlobField(photos.FieldByName('photo')), bmWrite);
Image1.Picture.Graphic.SaveToStream(bs);
bs.Free;
end
На создании потока вываливается с ошибкой: "... raised exeption class EInvalidCast with massage 'Invalid class typecast'"
В чем проблема?
DmitryNekl (2006-03-23 20:15:00) [21]2 Ega23:
photos.FieldByName('photo') - точно BLOB :) (см. первый пост вопроса - там оно создается именно как Blob).
Проблема именно в том, как jpeg засунуть в базу, bmp я умею (правда, другими методами). Вообще говоря, этот пример я нашел в инете и переработал под свою ситуацию.
Похоже, vovnuke прав. Однако это не объясняет, что делать :)
Какие необходимо внести изменения, чтобы все работало в TClientDataSet? Или поставим вопрос иначе: каким образом в TClientDataSet можно засунуть jpeg-картинку?
vovnuke (2006-03-23 14:30:00) [22]TClientDataSetне является наследником TBDEDataSet, поэтому в конструкторе TBlobStreamпроисходит ошибка приведения типов
Ega23 (2006-03-23 14:23:00) [23]А photos.FieldByName('photo') - точно BLOB?
Потому как, по-идее, вроде всё верно.
Не мешало-бы добавить try-except конструкции, да и вот это
if Image1.Picture.Graphic is TBitmap then
begin
Jpg:=TJPegImage.Create;
Jpg.Assign(Image1.Picture.Graphic);
мне не совсем ясно: если BMP> то зачем JPEG? :о)
А в целом должно работать.
2 Alarm © (23.03.06 14:16) [4]
> Постараюсь подытожить, пока в коде не увижу слово "запрос"
> или SQL, думаю никаких советов не последует.
> Сорри:(
Ты неправильно думаешь. И подытоживаешь тоже.
Alarm (2006-03-23 14:16:00) [24]Постараюсь подытожить, пока в коде не увижу слово "запрос" или SQL, думаю никаких советов не последует.
Сорри:(
Alarm (2006-03-23 13:59:00) [25]photos.Insert;
Думается, что при работе с Access этот код сработал бы. Ну, а я бы еще посоветовал поэкспериментировать с Append. Не совсем разобрался куда пишем (инсёртим):(
DmitryNekl (2006-03-23 13:46:00) [26]Нет, конечно, Insert и Post есть. Я привел только те строчки, которые имеют отношение к делу.
Суть такая: на форму перетаскивается графический файл. Он загружается в Image1. А затем я вставляю новую запись с помощью вышеприведенного когда в поле "photo".
Вот полный код этой процедуры, со всеми деталями:
procedure TForm1.WMDropFiles(var Msg: TMessage);
var Filename: array[0 .. 256] of Char;
Count: integer;
JPG: TJPEGImage;
bs: TBlobStream;
begin
Count := DragQueryFile(msg.WParam, $FFFFFFFF, nil, 0);
DragQueryFile( THandle(Msg.WParam), 0, Filename,SizeOf(Filename));
photos.Insert;
Image1.Picture.LoadFromFile(LowerCase(StrPas(FileName)));
if Image1.Picture.Graphic is TJPegImage then
begin
bs:=TBlobStream.Create(TBlobField(photos.FieldByName('photo')), bmWrite);
(Image1.Picture.Graphic as TJpegImage).SaveToStream(bs);
bs.Free;
end
else
if Image1.Picture.Graphic is TBitmap then
begin
Jpg:=TJPegImage.Create;
Jpg.Assign(Image1.Picture.Graphic);
Jpg.JPEGNeeded;
bs:=TBlobStream.Create(photos.FieldByName('photo') as TBlobField, bmWrite);
Jpg.SaveToStream(bs);
bs.Free;
Jpg.Free;
end;
Photos.Post;
DragFinish(THandle(Msg.WParam));
end;
Alarm (2006-03-23 13:42:00) [27]Позволь узнать куда ты собираешься записать картинку?. В какую запись в базе? Не вижу запроса, не вижу Edit (Append), ну и соответственно Post???
Возможно это куда-нибудь продвинет тебя