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

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

Как правильно сделать ?


Ламерок ©   (2007-02-07 21:24:00) 

создаю таблицу :

begin
 with Table1 do
 begin
   Active := False;
   DatabaseName := 'MyBase';
   TableName := 'JPG.db';
   TableType := ttDefault;
   with FieldDefs do
   begin
     Clear;
     Add('Num', ftInteger, 0, False);
     Add('Text', ftMemo, 0, False);
     Add('Pic', ftBlob, 0, False);
   end;
with IndexDefs do
   begin
     Clear;
     Add('', 'Num', [ixPrimary, ixUnique]);
   end;
   CreateTable;
   Free;
 end;
end;


Пытаюсь записать в блоб поле картинку вот так :

Stream := TFileStream.Create('d:\1.jpg', fmOpenRead or fmShareDenyWrite);
Table1.Edit;
TBLOBField(Table1.FieldByName('Pic')).LoadFromStream(stream);
Table1.Post;
Stream.Free;


Вылезает ошибка : "Bitmap Image is not valid"

Почему так?
Скажите пожалйста как правильно сделать?


RASkov   (2007-02-08 21:00:00) [1]

> BLOBField(Table1.FieldByName('Pic')).SaveToFile('C:\Pic.jpg')
> ;

Зачем же картинку каждый раз при просмотре в файл-то сохранять? Тогда попробуй вариант из [9]
т.е. создай папку (например Picture) в каталоге с базой, и при добавлении новой записи, копируй картинку в папку 'Picture' под новым уникальном именем сгенерированном программно, а в запись в поле 'Pic' заноси это имя. При просмотре что нибудь так:
Image1.Picture.LoadFromFile(BaseDir+'Picture\'+Table1.FieldByName('Pic').AsString);
BaseDir - Каталог с базой или тот, где папка с картинками.


Ламерок   (2007-02-08 13:06:00) [2]

Спасибо большое :)


Плохиш   (2007-02-08 11:50:00) [3]


> Ламерок   (08.02.07 11:40) [15]
> >Существуют поля типа AUTOINCREMENT.
> Не могли бы показать на примерчике как пользоваться AUTOINCREMENTOM
>  а то ничего не получается


CREATE TABLE "employee.db"
(
 ID AUTOINC, Last_Name CHAR(20),
 First_Name CHAR(15),
 Salary NUMERIC(10,2),
 Dept_No SMALLINT,
)


Ламерок   (2007-02-08 11:40:00) [4]

>У записей нет номеров.
Нету, у меня все время возникает ошибка при добавлении новой строки...

>Существуют поля типа AUTOINCREMENT.
Не могли бы показать на примерчике как пользоваться AUTOINCREMENTOM  а то ничего не получается(


Плохиш   (2007-02-08 11:08:00) [5]


> Как сделать чтобы таблица сама вписывала в добавляемую строку
> номер этой строки?

Существуют поля типа AUTOINCREMENT.


ЮЮ   (2007-02-08 11:06:00) [6]

У записей нет номеров. А строка это что?


Ламерок   (2007-02-08 10:59:00) [7]

Всем спасибо, все понял. Я нашел решение, хоть оно и кривое... Зато
работает) Убрал с формы DBImage1 и поставил заместо него обычный Image1..

Запись в таблицу :
Stream := TFileStream.Create('d:\1.jpg', fmOpenRead or fmShareDenyWrite);
Table1.Edit;
TBLOBField(Table1.FieldByName('Pic')).LoadFromStream(stream);
Table1.Post;
Stream.Free;
end;


Просмотр изображения :
BLOBField(Table1.FieldByName('Pic')).SaveToFile('C:\Pic.jpg');
Image1.Picture.LoadFromFile('C:\Pic.jpg');


У меня еще вопрос.. Как сделать чтобы таблица сама вписывала в добавляемую строку номер этой строки?


RASkov   (2007-02-08 10:25:00) [8]

> [10] ЮЮ ©   (08.02.07 10:09)
> Стандартному TDBImage это не поможет

Так TDBImage в таком варианте уже и не нужен...
При таком подходе есть свои плюсы и минусы


ЮЮ   (2007-02-08 10:09:00) [9]


> Можно в таблице в поле 'Pic'(строкового типа) хранить имя
> файла картинки из определенного каталога..


Стандартному TDBImage это не поможет.  И придется вручную делать то, что уже умеет TImage.


RASkov   (2007-02-08 09:59:00) [10]

Незнаю, подойдет ли такой вариант, но всеж..
Можно в таблице в поле 'Pic'(строкового типа) хранить имя файла картинки из определенного каталога..

> или храни в БД BitMap не зависимо от того, в каком формате
> изображение хранилось на диске
> [цитата]

Здесь проще воспользоваться полем Graphic - Paradox сам преобразует его к BitMap'у, имхо.


ЮЮ   (2007-02-08 09:31:00) [11]

Поищи компонет, который использует сигнатуру данных для определения типа формата или храни в БД BitMap не зависимо от того, в каком формате изображение хранилось на диске


ЮЮ   (2007-02-08 09:27:00) [12]

(DBImage1.Picture.LoadFromFile('d:\1 .jpg')),

При загрузке из файла анализируется расширение файла и создается ( в случае с '.jpg'  и JPEG в uses модуль) TJPEGImage, который уже и заглужается из файла. При загрузке из потока имеем только тело файла, не имея расширения. И DBImage создает элементарный TBitmap, для которого эти данные и дают 'Bitmap Image is not valid'.


Elen   (2007-02-08 09:25:00) [13]


> Мне интересно почему запись jpg не происходит....

Что значит не происходит? Что не пишется в базу или не открывается на просмотр из базы. А во-вторых где операция открытия этого чпега из базы?
Через стрим должно писаться, и ему всеравно чпег это или mp3.


MsGuns   (2007-02-08 09:23:00) [14]

Еще забыл тапочки, пижаму и зубную щетку


Ламерок   (2007-02-08 09:19:00) [15]

>ЮЮ ©
>А с .bmp работает без ошибок?
Да, с БМП работает без ошибок.

>который показывает картинку из этого поля ожидает там 'Bitmap Image', а не что-то в формате jpg.
ТDBImageтот же самый ТImage, только работает с картинками из базы. И замечательно грузит jpgкартинки ( DBImage1.Picture.LoadFromFile('d:\1.jpg')), как и обычный TImage, стоит только добавить в usesмодуль JPEG. Так что ошибка не думаю что из за компонента возникает....

>Что-то я в коде никакого отображения не вижу. Только запись... Может автор код не привел...
>И я о том же :)  Ни Paradox, ни BDE такими понятиями как  'Bitmap Image'  не оперируют.

Вот полный код программы....

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, DB, DBTables, Grids, DBGrids, DBCtrls, ExtCtrls, Mask, JPEG;

type
 TForm1 = class(TForm)
   DataSource1: TDataSource;
   DBGrid1: TDBGrid;
   Table1: TTable;
   DBNavigator1: TDBNavigator;
   DBMemo1: TDBMemo;
   DBEdit1: TDBEdit;
   Button2: TButton;
   Button3: TButton;
   Button1: TButton;
   Memo1: TMemo;
   Button5: TButton;
   ScrollBox1: TScrollBox;
   DBImage1: TDBImage;
   Query1: TQuery;
   procedure Button2Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 SList: TStringList;

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
 with Table1 do
 begin
   Active := False;
   DatabaseName := 'MyBase';
   TableName := 'JPG.db';
   TableType := ttDefault;
   with FieldDefs do
   begin
     Clear;
     Add('Num', ftInteger, 0, False);
     Add('Text', ftMemo, 0, False);
     Add('Pic', ftBlob, 0, False);
   end;
with IndexDefs do
   begin
     Clear;
     Add('', 'Num', [ixPrimary, ixUnique]);
   end;
   CreateTable;
   Free;
 end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
Stream : TStream;
begin
Stream := TFileStream.Create('d:\1.jpg', fmOpenRead or fmShareDenyWrite);
Table1.Edit;
TBLOBField(Table1.FieldByName('Pic')).LoadFromStream(stream);
Table1.Post;
Stream.Free;

///  DBImage1.Picture.LoadFromFile('d:\1.jpg');  - îòëè÷íî ðàáîòàåò ñàìà ïî ñåáå..
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
SList := TStringList.create;
end;

end.


Мне интересно почему запись jpg не происходит....
Я просто искал по поиску по форуму ответ на свой вопрос. наткнулся на :
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1170253847&n=1

Там у автора получилось запись\чтение jpg картинок, но как именно он это делал - код приведен небыл, по всей видимости решение было на примере совета Ega23 :

Edit;
TBLOBField(FieldByName(...)).LoadFromStream(...);
Post;

Я решил попробовать, ничего не получается... Но только я не с помошью ClientDataSet создаю базу...

Скажите пожалуйста как правильно сделать?
Мне надо научиться хранить каритнки в формате jpg в базе...
Я конечно понимаю что я полный чайник, но ведь все такими были...
:(


ЮЮ   (2007-02-08 08:49:00) [16]


Elen ©   (08.02.07 08:17) [2]
> Что-то я в коде никакого отображения не вижу.

И я о том же :)  Ни Paradox, ни BDE такими понятиями как  'Bitmap Image'  не оперируют.

На каком операторе?.
при отключенном 'use debug DCUs' реалный оператор скрыт в недрах VCL.


Elen   (2007-02-08 08:17:00) [17]


> ЮЮ ©   (08.02.07 05:35) [1]

Что-то я в коде никакого отображения не вижу. Только запись... Может автор код не привел...


> Вылезает ошибка : "Bitmap Image is not valid"

На каком операторе?.


ЮЮ   (2007-02-08 05:35:00) [18]

Базе данных абсолютно фиолетово, что хранится  в блоб поле, а вот компонент, который показывает картинку из этого поля ожидает там 'Bitmap Image', а не что-то в формате jpg. А с .bmp работает без ошибок?


Наверх

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