Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.02.25;
Скачать: [xml.tar.bz2];

Вниз

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

 
Ламерок   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.038 c
2-1170762053
Lera
2007-02-06 14:40
2007.02.25
Отключение от сети


2-1170859294
Light-blr
2007-02-07 17:41
2007.02.25
При изменении размеров формы пропадает панель


4-1150218782
Igor Stepanov
2006-06-13 21:13
2007.02.25
Программирование работы с USB-портом


1-1167637323
tio
2007-01-01 10:42
2007.02.25
Полигоны


2-1170638798
Новичек
2007-02-05 04:26
2007.02.25
Динамический массив объектов.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский