Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > В DBGrid'е не отображаются


Автор: MistMan 9.4.2004, 15:11
Есть БД Paradox с картинками в BLOB'ах, я хочу чтоб они отображались в DBGrid'е, а то в ячейках пишется Graphiks.

Автор: Maverick 9.4.2004, 15:27
Предлагаю использовать сторонний компонент dxDBGrid, обычный таких вещей не позволяет.... Поищи по форуму, где скачать - ссылки есть....
Если не хочешь сторонних, то, по-моему, единственный вариант - расположить рядом с DBGrid компонент DBImage, в котором отображать эти самые картинки....

Автор: x77 9.4.2004, 15:59
ну, не совсем. можно перехватывать OnDrawCell. конечно, рисовать в ячейке в 17 пикселов высотой никому не интересно, но это тоже решается через взлом класса:

type
TFake = class (TCustomGrid);

...

TFake (DbGrid1).DefaultRowHeight := 64;

типа того. короче, можно. если протрезвею к вечеру, то скину код smile.gif

Автор: MistMan 11.4.2004, 09:38
Maverick
А где его можно скачать, подскажи пожалуйста

Автор: MistMan 11.4.2004, 11:46
x77
скинь плизз, очень нужно, если не затруднит с пояснениями, т.к. я не являюсь монстром программирования. а мне еще придется защищать работу

Автор: Unregistered 13.4.2004, 07:58
Да все рисуется в обычном дбгриде. Обрабатывай OnDrawCell. Blob-ы содержат обычные бмп-шки (хотя может и что угодно cool.gif ). Ну скорее всего именно bmp, Создавай Tbitmap. Загружай в него содержимое поля и рисуй на канве grida в rect ячейки. Примеров полно, по-новой писать - ломает уж извини.

Автор: x77 13.4.2004, 14:49
MistMan, сорри за задержку, работа.

я тебе полный текст модуля приведу:
Код

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 Grids, DBGrids, Db, DBTables;

type
 TFake = class (TCustomGrid);

 TForm1 = class(TForm)
   DataSource1: TDataSource;
   Table1: TTable;
   DBGrid1: TDBGrid;
   procedure FormCreate(Sender: TObject);
   procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
     DataCol: Integer; Column: TColumn; State: TGridDrawState);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
 TFake (DbGrid1).DefaultRowHeight := 64;
end;

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
 DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
 bmp: TBitmap;
begin
 if Column.FieldName = 'Graphic' then begin
   bmp := TBitmap.Create;
   try
     bmp.Assign (Table1.FieldByName ('Graphic'));
     DbGrid1.Canvas.StretchDraw (Rect, bmp);
   finally
     bmp.Free;
   end;
 end;
end;

end.


обработчиков всего два, комментарии, я думаю, излишни smile.gif ну а если не излишни, то спрашивай.
Добавлено @ 14:57
пояснять, наверное, стоит только момент с TFake = class (TCustomGrid). детальное описание сего действа можно найти у Марко Кэнту, по-моему, в Delphi Developer's Handbook. смысл в том, что в DbGrid'е, например, скрыты поля типа DefaultColWidth, DefaultRowHeight и пр., объявленные в TCustomGrid. но концепция ООП не позволяет понизить видимость поля в наследниках. для этого их объявляют в protected - разделе. в наследниках те, которые должны быть видимы, переобъявляются в public или в published, а все остальные оказываются как бы скрытыми. но на самом деле они по прежнему видны, и до них можно добраться вышеприведённым способом. с лёгкой руки Марко Кэнту этот способ называется "взломом класса", и суть его в том, что он позволяет в компонентах-наследниках добраться до свойств, которые в их предках были объявлены, как protected.

Автор: Maverick 13.4.2004, 15:00
Ссылки на форуме действительно не работают.... У меня есть версия - 9 мегабайт занимает.... Как перекинуть? на мыло? Он все это делает сам - и высоту, и картинку....

Тож извини за тормоза - после правильного замечания x77 немного потерял интерес к топику....


Автор: x77 13.4.2004, 15:13

ещё, наверное, немного странно выглядит bmp.Assign (Table1.FieldByName ('...')); в форумах обычно приводятся многоэтажные примеры с чтением в потоки, хорошо ещё, если без создания оных.

здесь дело в том, что для каждого поля его значение возвращается по умолчанию. т.е. объявление Table1.FieldByName ('asd').Value, в общем-то, эквивалентно Table1 ['asd']. на практике это использовать не рекомендуется, т.к. никто не гарантирует, что вариант будет правильно преобразован. поле, содержащее графику, при инициализации получает DataType = ftGraphic. Соответственно, при вызове Assign (а реально - TPersistent.Assign) будет осуществляться копирование в зависимости от типа данных. а эти данные у нас равны Table1.FieldByName ('Graphic').Value, т.е., битмапу.

решительно не знаю, что ещё тут можно пояснять smile.gif

Автор: Unregistered 14.4.2004, 01:48
Порылся у себы в исходниках и хочу немного добавить. Следующий код:
НЕ РАБОТАЕТ:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var bmp:TBitmap;
str:Tstream;
begin
if Column.Index=7 then
begin
With TDBGrid(Sender) do
begin
bmp:=Tbitmap.Create;
str:=DataSource.DataSet.CreateBlobStream(Column.Field,bmRead);
bmp.LoadFromStream(str) ;
Canvas.StretchDraw(Rect,bmp);
bmp.Free;
str.Free;
end;
end;
end;

получаю "BitMap image is not valid"
таблица animals из DBDEMOS
Через Assign - вопросов нет. (кстати, у меня код тоже взят у Марко Кэнту "Дельфи 4 для профессионалов") Ну а через TStream? Что не так? Преобразование?
У меня есть парадокс-база в которой картинки храняться в формате JPG
и там этот код работает, если, конечно, вместо TBitMap указать TJpegImage

Поясните


Автор: MistMan 14.4.2004, 10:01
Спасибо x77 , в принципе все понятно.


Maverick мое мыло [email protected] пришли пожалуйста.


Если будете в Майкопе заходите в гост, в долгу не останусь biggrin.gif

Автор: x77 14.4.2004, 12:02
MistMan, ух ты, я 10 лет в Армавире жил, там до сих пор родители и дочка. где-то через полгода поеду в ваши края.

сбрось координаты на мыло, [email protected], чем чёрт не шутит smile.gif

Автор: MistMan 15.4.2004, 13:54
x77
Какого фига появляется ошибка:
Incopatibles types 'TDrawGridState' and 'Enumeration' (типа того)

можт я чего не то делаю?

Автор: Maverick 15.4.2004, 14:16
MistMan
Я вчера полдня пытался закачать это дело хоть куда-нибудь в нете.... Не получилось... Компонент называется DevExpress Quantum Grid,
Производитель - Developer Express Inc.... Кто-нибудь подскажет как передать zip-файл в 8 мб на форум?

Автор: MistMan 16.4.2004, 10:52
Кто-нибудь может подсказать где даунлоад на этой странице
http://www.delphixjs.com/Soft_Show.asp?SoftID=518 mad.gif

Автор: Maverick 16.4.2004, 11:21
Хе... Круто.... Так как же закачать? У меня ICQ блокирован админами, даже FTP-протокол тоже.... что еще есть такое, через что перегнать можно?

Автор: MistMan 16.4.2004, 11:36
Maverick
А почтой?..

Автор: x77 16.4.2004, 13:14
MistMan, сорри, не был вчера на работе.

покажи строчку, на которой среда этот матюг выдаёт.

Автор: Maverick 16.4.2004, 13:23
Цитата
Maverick
А почтой?..


Почтой обрывается почему-то посередине.... Я много раз мучил, наверно, слишком крупно для почтовика.... 8мб....

Автор: x77 16.4.2004, 13:50
Maverick, открой ящик на хотбоксе. объём письма - до 15 метров.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)