Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение/Запись Image в БД, Обязательно динамически. 
:(
    Опции темы
Zero
Дата 30.3.2005, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



САБЖ.
Вообщем как загружать в БД MS-Access, содержимо TImage, и обратно. Работаю с компонентами вкладки ADO.
Хотя конечно могу и сам разобратся, но нету времени, если кто имеет какие-нибудь полезные ссылки на методички или любая информация, то скиньте пожалуйста.
Заранее благодарен!!!
PM MAIL ICQ   Вверх
Vit
Дата 30.3.2005, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



DRKB


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Zero
Дата 30.3.2005, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



Vit я уже смотрел там. Вчасности ту ссылку которую ты мне тот раз скидывал там показано как считывать уже имеющиеся файлы, а как записывать не написано. А то FAQ, которое у меня тут там вроде нету. А то которое ты на 10 Mb сделал, у меня при скачивании какие-то глюки выводятся, какие-то цифры по всему экрану начинают бегать. Вообщем я его скачать не могу. smile
PM MAIL ICQ   Вверх
k2s
Дата 31.3.2005, 01:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 23.2.2005

Репутация: нет
Всего: нет



Запись файла в BLOB поле через ADOQuery. Из DRKB:
Цитата
Код
ADOquery1.sql.text:='Insert into myTable (a) Values (:b)'; 
ADOQuery1.parameters.parseSQL(ADOquery1.sql.text, true); 
ADOQuery1.parameters.parambyname('b').LoadFromFile('MyFile'); 
ADOQuery1.execsql;

PM MAIL   Вверх
DDX
  Дата 1.4.2005, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 31.1.2005
Где: Москва

Репутация: 5
Всего: 5



на форуме совсем недавно было несколько таких же тем, поиск ещё никому не повредил ;)
почитай тут:
http://forum.vingrad.ru/index.php?showtopic=46995
http://forum.sources.ru/index.php?showtopic=89054
DRKB forever

Это сообщение отредактировал(а) DDX - 1.4.2005, 10:06
--------------------
Учиться, учитьcя и ещё раз учиться  
PM MAIL WWW   Вверх
Zero
Дата 2.4.2005, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



Цитата(k2s @ 31.3.2005, 01:29)
Запись файла в BLOB поле через ADOQuery. Из DRKB:

Интересно, а автор ответа из DRKB его проверял хотябы, у меня лично после 3-ей строки выдаётся ошибка. smile
Цитата(DDX @ 1.4.2005, 10:00)
на форуме совсем недавно было несколько таких же тем

Да только в этих темах нету ни одного нормального ответа.
Если кто-нибудь знает как записывать из делфи (исп. компоненент TImage) в аксес и обратно, то напишите простой пример пожалуйстя, а то я что-то ни как не найду ни где нормальных ответов, где расписано как это делается с нуля.
Почему-то все кто знают как это делается ─ думают что вес это знают и пишут типа
Цитата
DRKB
или "пользуйся поиском", но конкретного ничего не отвемают. О существование поиска и FAQ, я и сам прекрасно знаю, и не стал бы для этого задовать вопрос.
Те кто не знают соответственно тоже ничего не пишут.
В ИТОГЕ: ни кто ничего не пишет и ни чем толковым не хочет помочь.
PM MAIL ICQ   Вверх
Zero
Дата 2.4.2005, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



Поднимаю тему.
PM MAIL ICQ   Вверх
Zero
Дата 2.4.2005, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



Ну короче я нашёл один из примеров в и-нете, он вроде записывает в Access, данные, ну там становится написано типо "двоичные данные" ну и какуюто хрень об ошибке пишет.
А может кто-нибудь знает как тут можно переправить чтобы он записывал именно bmp, и было бы всё без глюков. smile
Код

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  if openpicturedialog1.Execute then
    edit1.Text:=openpicturedialog1.FileName;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  adotable1.Append;
  TBLOBField(ADOtable1.FieldByName('qqq')).LoadFromFile(edit1.Text);
  adotable1.Post;
end;

PM MAIL ICQ   Вверх
offline
Дата 2.4.2005, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 474
Регистрация: 7.2.2005

Репутация: 7
Всего: 7



Что-то я нифига не понял, что тебе конкретно надо, может это подойдет. Код конечно можно упростить, но это по ситуации смотреть надо

Код

//-------------------------------------------------------------------------
// процедура определения типа картинки по расширению файла
// конечно лучше анализировать содержимое картинки, но это более трудоемко
//-------------------------------------------------------------------------
function GetGraphicClassByExt(Ext: String) : TGraphicClass;
begin
 if (Ext = '.wmf') or (Ext = '.emf') then
   Result := TMetafile
 else if (Ext = '.gif') then
   Result := TGifImage
 else if (Ext = '.bmp') or (Ext = '.dib') then
   Result := TBitmap
 else if (Ext = '.jpeg') or (Ext = '.jpg') then
   Result := TJPEGImage
 else
   Result := nil;
end;

//------------------------------------------------------------------------------
// процедура загрузки картинки в базу
//------------------------------------------------------------------------------
function Tdtmdl_Main.SetPicture(PictureFieldName, PictureFieldFile: String): Boolean;
var
  Field: TBLOBField;
  DataSet: TDataSet;
  FileName: String;
  FS: TFileStream;
begin
  Result := false;
  DataSet := ds_Elements.DataSet;
  if DataSet.IsEmpty then Exit;
  LogMessage('Установка картинки');
  Result := OpenPictureDialog.Execute;
  if Result then
    begin
      if not DataSetInModifyMode(DataSet) then DataSet.Edit();
      try
        try
          FileName := OpenPictureDialog.FileName;
          DataSet.FieldByName(PictureFieldFile).Value := ExtractFileName(FileName);
          Field := TBLOBField(DataSet.FieldByName(PictureFieldName));
          FS := TFileStream.Create(FileName, fmOpenRead + fmShareDenyNone);
          FS.Position := 0;
          Field.LoadFromStream(FS);
          FS.Free();
        except
          on E: Exception do
            LogErrorMessage('Ошибка при установке картинки ' + E.Message);
        end;
      finally
        DataSet.CheckBrowseMode();
      end;
    end;
end;

//------------------------------------------------------------------------------
// процедура записи ккартинки из базы в TImage
//------------------------------------------------------------------------------
procedure Tdtmdl_Main.SetPictureToImage(DataSet: TDataSet; Image: TImage; PictureFieldName, PictureFieldFile: String; ImageDraw: TImage = nil);
var
  Stream: TStream;
  Field: TBLOBField;
  FileExt: String;
  MF: TGraphic;
  GClass: TGraphicClass;
begin
  if not Assigned(Image) then Exit;
  LogMessage('Прорисовка картинки');
  Image.Picture.Assign(nil);
  Image.Width := 1;
  Image.Height := 1;
  if Assigned(ImageDraw) then ImageDraw.Picture.Assign(nil);
  if DataSet.IsEmpty then Exit;
  Field := TBLOBField(DataSet.FieldByName(PictureFieldName));
  if not Field.IsNull then
    begin
      Stream := TMemoryStream.Create;
      try
        Field.SaveToStream(Stream);
        Stream.Position := 0;
        FileExt := LowerCase(ExtractFileExt(DataSet.FieldByName(PictureFieldFile).Value));
        GClass := GetGraphicClassByExt(FileExt);
        if Assigned(GClass) then
          begin
            MF := GClass.Create;
            try
              MF.LoadFromStream(Stream);
              Image.Visible := false;
              Image.AutoSize := true;
              Image.Picture.Assign(MF);
              Image.AutoSize := false;
              Image.Stretch := true;
              Image.Visible := true;
            finally
              MF.Free();
            end;
          end;
      finally
        Stream.Free;
      end;
    end;
end;



PM MAIL   Вверх
Zero
Дата 3.4.2005, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



kirilllius что-то я не могу его связать, ты не мог бы прикрепить файл у уже установлеными компонентами? Что-то не получается его сделать. smile Или что у меня не правильно (пока пытаюсь загрузить в БД картинку)
Код

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
if openpicturedialog1.Execute then
  s:=openpicturedialog1.FileName;
end;

function TForm1.SetPicture(PictureFieldName, PictureFieldFile: String): Boolean;
var
  Field: TBLOBField;
  DataSet: TDataSet;
  FS: TFileStream;
begin
  DataSet.FieldByName(PictureFieldFile).Value := ExtractFileName(s);
  Field := TBLOBField(DataSet.FieldByName(PictureFieldName));
  FS := TFileStream.Create(s, fmOpenRead + fmShareDenyNone);
  FS.Position := 0;
  Field.LoadFromStream(FS);
  FS.Free();
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  q:boolean;
begin
  q:=SetPicture('qqq',s) //qqq ─ это имя столбца например
end; 

Замечание: Ни каких проверок на ошибки и ничего лишнего делать не нужно, я хочу разобратся как загружать картинки в БД(и обратно), а всё остальное потом.
PM MAIL ICQ   Вверх
offline
Дата 3.4.2005, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 474
Регистрация: 7.2.2005

Репутация: 7
Всего: 7



Вот упрощенный пример работы с Jpeg. Если не пойдет, тогда вышлю пример рабочей версии.
Код

//загрузка картинки в базу
procedure LoadImgToBD;
 var
  FileName: Stream;
  Stream: TMemoryStream;
  ImgJPEG : TJpegImage;
begin
  if not DlgOpenImg.Execute
    then Exit; 
  FileName := DlgOpenImg.FileNam;
  try
   ImgJPEG := TJpegImage.Create;//создаем класс изобразения
   ImgJPEG.LoadFromFile(FileName);//загрузаем в него картинку
   Stream:= TMemoryStream.Create;//создать поток
   ImgJPEG.SaveToStream(Stream);//сохранить данные в поток
   Stream.Position:=0;//прерчитать поток
   DataSet.Edit;//открываем набор данных для редактирования
   TBLOBField(DataSet.FieldByName(PictureFieldName)).LoadFromStream(Stream);//сохранить поток
   DataSet.Post;
   TImage.Picture.Assign(ImgJPEG);//считать поток в поле изображения
  finally
   ImgJPEG.Free;//удалить класс изображения
   Stream.Free;//удалить поток
  end;
end;

//загрузка картинки из базы
procedure LoadImgFromBD;
var
  Stream: TStream;
  ImgJPEG: TJpegImage;
 begin
  try
   Stream:= TMemoryStream.Create;//создание потока в памяти
   TBLOBField(DataSet.FieldByName(PictureFieldName)).SaveToStream(Stream);//сохранение  в поток из BLOB поля
   Stream.Position:=0;//установить поток на начало
   ImgJPEG := TJpegImage.Create;
   ImgJPEG.LoadFromStream(Stream);
   TImage.Picture.Assign(ImgJPEG);//считать поток в поле изображения
  finally
   ImgJPEG.Free;
   Stream.Free;//удалить поток из памяти
  end;
 end;


Это сообщение отредактировал(а) kirilllius - 3.4.2005, 10:51
PM MAIL   Вверх
Zero
Дата 3.4.2005, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



kirilllius а ты можеш прикрепить проверенный пример к своему посту, а то во всех твоих примерах есть ошибки, а когда я их переделываю, видимо в них меняется смысл и не работает.
И что это за тип TDataSet, я нихрена не понял что нужно вводить на его место. smile
И это у меня должны быть именно bmp, возможно из-за этого когда я переделываю под TBitMap, тоже что-нить глюкает.
PM MAIL ICQ   Вверх
offline
Дата 3.4.2005, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 474
Регистрация: 7.2.2005

Репутация: 7
Всего: 7



Ок, сейчас найду его и пришлю smile
PM MAIL   Вверх
Zero
Дата 3.4.2005, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



smile smile
PM MAIL ICQ   Вверх
offline
Дата 3.4.2005, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 474
Регистрация: 7.2.2005

Репутация: 7
Всего: 7



Вот 100% рабочий пример, только что сам пробовал. Если ты работаешь с BMP и стандартным TImage, то можешь на поле с изображением поставить DBImage1 он сам будет выводить в него графику. Но ты писал, что хочешь разобраться с принципом загрузки и выгрузки, поэтому смотри оба примера.

PoleImages – это поле типа OLE в базе Access
Считывается изображение из базы на событии - AfterScroll

Код

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
 var
  FileName: String;
  Stream: TMemoryStream;
  ImgBMP : TBitmap;
begin
  if not OpenPictureDialog1.Execute
    then Exit;
  FileName := OpenPictureDialog1.FileName;
  try
   ImgBMP := TBitmap.Create;
   ImgBMP.LoadFromFile(FileName);
   Stream:= TMemoryStream.Create;
   ImgBMP.SaveToStream(Stream);
   Stream.Position:=0;
   ADOTable1.Append;
   // ADOTable1.Edit;
   TBLOBField(ADOTable1.FieldByName('PoleImages')).LoadFromStream(Stream);
   ADOTable1.Post;
   DBImage1.Picture.Assign(ImgBMP);
  finally
   ImgBMP.Free;
   Stream.Free;
  end;
end;

procedure TForm1.ADOTable1AfterScroll(DataSet: TDataSet);
var
  Stream: TMemoryStream;
  ImgBMP: TBitmap;
 begin
  try
   Stream:= TMemoryStream.Create;
   TBLOBField(ADOTable1.FieldByName('PoleImages')).SaveToStream(Stream);
   Stream.Position:=0;
   ImgBMP := TBitmap.Create;
   ImgBMP.LoadFromStream(Stream);
   Image1.Picture.Assign(ImgBMP);
  finally
   ImgBMP.Free;
   Stream.Free;
  end;
end;



PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0902 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.