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

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

Не могу понять, в чем ошибка. [D7, ClientDataSet]


Страницы:   1 2

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???
Возможно это куда-нибудь продвинет тебя


Страницы:   1 2

Наверх

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