![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно сделать ?
Ламерок © (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 работает без ошибок?