Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.03.2010, 17:30
Аватар для Sk@zk@
Sk@zk@ Sk@zk@ вне форума
Прохожий
 
Регистрация: 18.12.2009
Сообщения: 12
Репутация: 10
По умолчанию Вопрос по поводу DBImage

Здравствуйте все)
Вопрос возник такой.
Есть база данных в Access. Она подключена к программе через ADO. На форме стоит DBLookupComboBox и он связан с таблицей. Так же стоит DBMemo который связан с той же таблицей. Когда я выбираю в комбобоксе (1 столбец в таблице) значение, то автоматически в дбмемо появляется то что написано во втором столбце этой же строки (у них один и тот же DataSourse, только поля разные). А теперь хочу поставить на форму DBImage и связать его с третьим столбцом в тойже таблице. По задумке, выбираешь в DBLookupComboBox строчку, рядом появляется описание и картинка. Но когда связываю то выскакивает ошибка: bitmap image is not valid. Изображение точно bitmap и 24 бита (вроде такое должно быть). Поле в таблице в Ацессе - ОLE. Помогите пожалуста.
Ответить с цитированием
  #2  
Старый 04.03.2010, 18:17
Аватар для TOJluK
TOJluK TOJluK вне форума
Местный
 
Регистрация: 25.02.2009
Адрес: Минск
Сообщения: 551
Версия Delphi: 2007
Репутация: 110
По умолчанию

Так надо:
Код:
var
 Bmp: TBitmap;
 BS: TADOBlobStream;
begin
 BS:= TADOBlobStream.Create(FIELВ_NAME, bmRead);
 Bmp:= TBitmap.Create;
 Bmp.LoadFromStream(BS);
 DBImage1.Picture.Graphic:= Bmp;
 Bmp.Free; 
 BS.Free;
Ответить с цитированием
  #3  
Старый 04.03.2010, 19:15
Аватар для Sk@zk@
Sk@zk@ Sk@zk@ вне форума
Прохожий
 
Регистрация: 18.12.2009
Сообщения: 12
Репутация: 10
По умолчанию

Цитата:
Сообщение от TOJluK
Так надо:
Код:
var
 Bmp: TBitmap;
 BS: TADOBlobStream;
begin
 BS:= TADOBlobStream.Create(FIELВ_NAME, bmRead);
 Bmp:= TBitmap.Create;
 Bmp.LoadFromStream(BS);
 DBImage1.Picture.Graphic:= Bmp;
 Bmp.Free; 
 BS.Free;

А в какую процедуру вставлять этот код? у меня ведь нет отдельной процедуры для DBImage Вот весь код моей программы.
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ComCtrls, TabNotBk, Grids, DBGrids, DB, ADODB, DBCtrls,
  StdCtrls, ExtCtrls, Buttons, Mask;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    File1: TMenuItem;
    File2: TMenuItem;
    N1: TMenuItem;
    Exit1: TMenuItem;
    ADOConnection1: TADOConnection;
    ADOTable1: TADOTable;
    DataSource1: TDataSource;
    DataSource2: TDataSource;
    ADOTable2: TADOTable;
    ADOTable3: TADOTable;
    DataSource3: TDataSource;
    ADOTable4: TADOTable;
    DataSource4: TDataSource;
    ADOTable5: TADOTable;
    DataSource5: TDataSource;
    ADOQuery1: TADOQuery;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    DBLookupComboBox1: TDBLookupComboBox;
    DBMemo1: TDBMemo;
    DBLookupComboBox2: TDBLookupComboBox;
    DBLookupComboBox3: TDBLookupComboBox;
    DBLookupComboBox4: TDBLookupComboBox;
    BitBtn1: TBitBtn;
    Edit1: TEdit;
    Panel1: TPanel;
    Edit2: TEdit;
    TabSheet2: TTabSheet;
    DBGrid1: TDBGrid;
    DBNavigator1: TDBNavigator;
    TabSheet3: TTabSheet;
    TabSheet4: TTabSheet;
    DBLookupComboBox5: TDBLookupComboBox;
    DBLookupComboBox6: TDBLookupComboBox;
    ADOTable6: TADOTable;
    ADOTable7: TADOTable;
    DataSource6: TDataSource;
    DataSource7: TDataSource;
    Label8: TLabel;
    Label9: TLabel;
    ComboBox1: TComboBox;
    Label10: TLabel;
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    Label11: TLabel;
    DBLookupComboBox7: TDBLookupComboBox;
    Label12: TLabel;
    Button1: TButton;
    Button2: TButton;
    Edit3: TEdit;
    ADOTable8: TADOTable;
    DataSource8: TDataSource;
    DBGrid2: TDBGrid;
    DBNavigator2: TDBNavigator;
    GroupBox3: TGroupBox;
    Edit4: TEdit;
    Label13: TLabel;
    Button3: TButton;
    Label14: TLabel;
    Edit5: TEdit;
    Button4: TButton;
    ComboBox2: TComboBox;
    Label15: TLabel;
    DBGrid3: TDBGrid;
    DBGrid4: TDBGrid;
    ComboBox3: TComboBox;
    ComboBox4: TComboBox;
    DBImage1: TDBImage;
    procedure Exit1Click(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure ComboBox2Select(Sender: TObject);
    procedure ComboBox3Select(Sender: TObject);
    procedure ComboBox4Select(Sender: TObject);
   private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Exit1Click(Sender: TObject);
begin
Close
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var
str:string;
begin
 ADOQuery1.SQL.Clear;
str:='insert into [Таблица заказов] ([Код],[Платформа],[Процессор],[Память],[Жесткий диск],[Контроллеры],[ОС],[ФИО],[Дополнительная гарантия]) values('''+Edit1.Text+''','''+
  DBLookupComboBox1.Text+''', '''+
  DBLookupComboBox2.Text+''','''+
  DBLookupComboBox3.Text+''','''+
  DBLookupComboBox4.Text+''','''+
  DBLookupComboBox5.Text+''','''+
  DBLookupComboBox6.Text+''','''+
  Edit2.Text+''','''+
  ComboBox1.Text+''')';
  ADOQuery1.SQL.Add(str);
  ADOQuery1.ExecSQL;

  ADOTable5.close;
  ADOTable5.open;
  application.MessageBox('Заказ внесен в базу данных','Заказ',MB_OK);

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  with ADOQuery1 do
    begin
    ADOQuery1.Close;
    SQL.Clear;
    ADOQuery1.SQL.Add('SELECT *');
    ADOQuery1.SQL.Add('FROM [Таблица заказов]');
    ADOQuery1.SQL.Add('WHERE [Код]='+Edit3.Text);
    ADOQuery1.Open;
    end;

end;

procedure TForm1.Button2Click(Sender: TObject);
var
str:string;
begin
ADOQuery1.SQL.Clear;
  str:='delete from [Таблица заказов] Where Код='''+DBLookupComboBox7.Text+'''';
  ADOQuery1.SQL.Add(str);
  ADOQuery1.ExecSQL;

  ADOTable5.close;
  ADOTable5.open;
end;
end.
Ответить с цитированием
  #4  
Старый 05.03.2010, 11:59
Аватар для TOJluK
TOJluK TOJluK вне форума
Местный
 
Регистрация: 25.02.2009
Адрес: Минск
Сообщения: 551
Версия Delphi: 2007
Репутация: 110
По умолчанию

Предлагаю вам все- таки создать отдельную процедуру. OnDataChnge от DataSource, думаю, подойдет.
Ответить с цитированием
  #5  
Старый 05.03.2010, 21:00
Аватар для Sk@zk@
Sk@zk@ Sk@zk@ вне форума
Прохожий
 
Регистрация: 18.12.2009
Сообщения: 12
Репутация: 10
По умолчанию

Цитата:
Сообщение от TOJluK
Предлагаю вам все- таки создать отдельную процедуру. OnDataChnge от DataSource, думаю, подойдет.

Получилось вот так:
Код:
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
var
 Bmp: TBitmap;
 BS: TADOBlobStream;
begin
 BS:= TADOBlobStream.Create(ADOTable1.FieldByName('Картинка'), bmRead);
 Bmp:= TBitmap.Create;
 Bmp.LoadFromStream(BS);
 DBImage1.Picture.Graphic:= Bmp;
 Bmp.Free;
 BS.Free;
 end;
Выкидывает ошибку: Incompatible types: 'TblobField' and 'TField'

Поискала ещё варианты нашла похожий на тот, который Вы прделожили. Попробовала так:
Код:
var
Bmp: TBitmap;
BS: TADOBlobStream;
begin
try
     BS:= TADOBlobStream.Create(TBlobField(ADOTable1.FieldByName('Картинка')), bmRead);
     BS.Seek(82, soFromBeginning);
  Bmp:= TBitmap.Create;
  Bmp.LoadFromStream(BS);
  DBImage1.Picture.Graphic:= Bmp;
finally
Bmp.Free;
BS.Free;
end;
end;
А на это ругается: 'BMP' might not have initialized
'BS' might not have initialized
Ответить с цитированием
  #6  
Старый 06.03.2010, 01:55
Аватар для movnet
movnet movnet вне форума
Начинающий
 
Регистрация: 24.07.2008
Сообщения: 127
Версия Delphi: Delphi 7
Репутация: 23
Сообщение

Попробуй етот компонент : http://ifolder.ru/16712736
Ответить с цитированием
  #7  
Старый 06.03.2010, 19:36
Аватар для Sk@zk@
Sk@zk@ Sk@zk@ вне форума
Прохожий
 
Регистрация: 18.12.2009
Сообщения: 12
Репутация: 10
По умолчанию

Этот компонент устанавливается как-то криво. Я попробовала с MyDBImage - тоже самое.
Кстати, если код выглядит так:
Код:
var
Bitmap: TBitmap;
BS: TADOBlobStream;
begin
BS := nil;
Bitmap:= nil;
try
   BS:= TADOBlobStream.Create(TBlobField(ADOTable1.FieldByName('Картинка')), bmRead);
     BS.Seek(82, soFromBeginning);
  Bitmap:= TBitmap.Create;
  Bitmap.LoadFromStream(BS);
  MyDBImage1.Picture.Graphic:= Bitmap;
finally
Bitmap.Free;
BS.Free;
end;
end;
То снова выкидывает ошибку bitmap image is not valid. Такое ощущение что в базе в поле ОЛЕ вообще не картинка хранится а гадость какая-то
Ответить с цитированием
  #8  
Старый 09.03.2010, 10:15
Аватар для TOJluK
TOJluK TOJluK вне форума
Местный
 
Регистрация: 25.02.2009
Адрес: Минск
Сообщения: 551
Версия Delphi: 2007
Репутация: 110
По умолчанию

Ага, точно про TBlobField забыл.
Цитата:
Сообщение от Sk@zk@
То снова выкидывает ошибку bitmap image is not valid. Такое ощущение что в базе в поле ОЛЕ вообще не картинка хранится а гадость какая-то
Проверьте точно ли там BMP (попробуйте загрузить какую- нибудь свою и отобразить ее).
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:50.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter