Текущий архив: 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.5 MB
Время: 0.041 c