Delphi 7: как загрузить картинку jpg в базу данных Paradox
рассказывай как пытался, на каком месте затык.
Я подключил модуль jpeg. Здесь я загружаю jpg из файла в TImage и поле Graphic таблицы
procedure Tterminal.N11Click(Sender: TObject);
begin
if terminal.Open_base.Execute then
begin
card_edit.rphoto.Picture.LoadFromFile(terminal.Open_base.FileName);
stream:=nil;
terminal.base.Edit;
stream:=terminal.base.CreateBlobStream(terminal.base.FieldByName('photo'bmwrite);
card_edit.rphoto.Picture.Graphic.SaveToStream(Stream);
base.FieldByName('isphoto').AsBoolean:=true;
stream.free;
terminal.base.Post;
card_edit.rphoto.Visible:=true;
end;
end;
Здесь Stream - переменная типа TStream. Этот код не выдает ошибки. Картинка правильно отображается в rphoto (TImage кроме того, судя по изменению размера файла .MB картинка в него загрузилась.
А здесь jpg загружается из базы в TImage:
if terminal.base.FieldByName('isphoto').AsBoolean=true then
begin
fcard_edit.rphoto.Visible:=true;
stream:=nil;
Stream:=terminal.base.CreateBlobStream(terminal.base.FieldByName('photo'bmRead);
card_edit.rphoto.Picture.Graphic.LoadFromStream(stream); <------------------ Здесь возникает ошибка
stream.Free;
fcard_edit.Refresh;
end;
Выдается ошибка "Access Violation"
Не понимаю, почему.
зы
[телепатия] загрузчик картинки скорее всего хочет делать seek у стрима, а стрим базы такое не умеет
вообще в JediLibrary/DevExpress есть аналоги TDBImage (а также гриды) умеющие сами грузить картинки из базы. Я бы советовал не изобретать пылесос/велосипед, если не уверен в своих силах.
Stream:=terminal.base.CreateBlobStream(terminal.base.FieldByName('photo'bmRead);
вроде бы именно что грузит blob в память, а
card_edit.rphoto.Picture.Graphic.LoadFromStream(stream);
грузит картинку из памяти. Или я чего-то не понимаю?
в названии функции написано, что она создает стрим, ни о какой загрузке в названии речь не идет
А как тогда загрузить blob в память?
Stream:=terminal.base.CreateBlobStream(terminal.base.FieldByName('photo'bmRead);
LocalStream := TMemoryStream.Create;
LocalStream.CopyFrom(Stream, Stream.Size);
card_edit.rphoto.Picture.Graphic.LoadFromStream(LocalStream)
Stream.Seek(0, soFromBeginning);
Мда.. Картинка загрузилась в базу, потом выгрузилась, причем произошел сбой - часть картинки есть, часть - зеленые квадратики разных оттенков. К тому же, теперь начал сбоить модуль jpeg... Но все равно, спасибо за советы.
начинаться должно обязательно на FFD8 а заканчиваться на FFD9 и проверь сколько ты выставил макс. размер блоба в бд.
procedure Tcard.change_card(CardDataSource:TDataSource;BaseFields:Tfields);
begin
if BaseFields.FieldByName('isphoto').AsBoolean=true then
begin
card.rphoto.DataSource:=CardDataSource;
card.rphoto.DataField:='photo';
card.rphoto.LoadPicture;
end;
card.Refresh;
end;
Я передаю TDataSource как параметр процедуры CardDataSource и присваиваю его card.rphoto.DataSource (TDBImage). Так вот, картинка - не грузится. Хотя такой же код, в котором card.rphoto.DataSource грузится из глобальной переменной - работает. Не подскажете, в чем дело?
ты бы ещё сказал бы, каких типов у тебя объекты, а то тут не все телепаты.
а датасет у тебя открыт-то?
ты бы ещё сказал бы, каких типов у тебя объекты, а то тут не все телепаты.
card.rphoto:TDBImage
CardDataSource:TDataSource
BaseFields:Tfields
procedure TSearch.allcardsCellClick(Column: TColumn);
begin
card:=Tcard.Create(Application);
card.change_card(SearchQuery.DataSource,SearchQuery.Fields);
end;;
Создается новая форма, в ней правильно отображаются все данные из базы, кроме картинки.
б) AutoDisplay у дбимаджа твоего чему равен?
AutoDisplay=True, это есть.
А не подскажет ли кто-нибудь, как форме-родителю (MDIParent) проверить, что его MDIChild закрыт?
Оставить комментарий
5065584
Имею вопрос: как загружать картинку JPG в поле типа BLOB (Graphic или Binary) базы данных Paradox и как её выгружать? Посоветуйте, пожалуйста, источники по этому вопросу, примеры рабочего кода или объясните, как это сделать. Как ни пытался сам - ничего не получается.