Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.25;
Скачать: CL | DM;

Вниз

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

 
Ламерок   (2007-02-07 21:24) [0]

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

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"

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


 
ЮЮ ©   (2007-02-08 05:35) [1]

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


 
Elen ©   (2007-02-08 08:17) [2]


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

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


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

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


 
ЮЮ ©   (2007-02-08 08:49) [3]


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

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

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


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

>ЮЮ ©
>А с .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://delphimaster.net/view/3-1170253847/

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

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

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

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


 
MsGuns ©   (2007-02-08 09:23) [5]

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


 
Elen ©   (2007-02-08 09:25) [6]


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

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


 
ЮЮ ©   (2007-02-08 09:27) [7]

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

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


 
ЮЮ ©   (2007-02-08 09:31) [8]

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


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

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

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

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


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


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


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


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

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

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


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

Всем спасибо, все понял. Я нашел решение, хоть оно и кривое... Зато
работает) Убрал с формы 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");


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


 
ЮЮ ©   (2007-02-08 11:06) [13]

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


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


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

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


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

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

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


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


> Ламерок   (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 13:06) [17]

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


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

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

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



Страницы: 1 вся ветка

Текущий архив: 2007.02.25;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.04 c
15-1170498917
beginner90
2007-02-03 13:35
2007.02.25
установка ZEOSDBO-6.6.0-beta


15-1170135796
DeadMeat
2007-01-30 08:43
2007.02.25
Пиратов наказали


15-1170225138
vitv
2007-01-31 09:32
2007.02.25
В чём преимущества MSSQL2000 над IB6X(FB1.5.X)?


15-1170200828
hmmm
2007-01-31 02:47
2007.02.25
google


15-1170402887
Сатир
2007-02-02 10:54
2007.02.25
Солнце вот-вот взорвется