Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.11;
Скачать: [xml.tar.bz2];




Вниз

Подгрузка картинок в DBGrid на лету по имени файла 


ivans   (2002-02-11 16:26) [0]

Ситуация следующая:
Грид компонента от DevExpress : TdxDBGrid
Всё дело в том, что мне не нужно хранить в базе само изображение,
и хранится только абсолютный путь к нему.
Но при этом при открытии грида нужно чтобы показывались изображение в каждой строчке и его параметры. Всё, кроме самого изображения хранится в БД. Вот я и хочу брать значение пути и подгружать картинку на лету. Проблема с полем, в которое её надо грузить. Может кто сталкивался уже?



Анонимщик   (2002-02-11 21:26) [1]

Реализуется это просто. Создаешь вычислимое поле - и то только для того, чтобы было куда рисунок выводить. А на событие OnCalculte (кажется, не помню точно, но что-то такое), берешь Canvas грида и рисуешь. Не получится OnCalculate - используй OnDrawDataCell - там уж точно все нужные параметры есть. За эффективность реализации не буду ручаться, скорее всего, эти рисунки будут перерисовываться хренову тучу раз, если тебя это выполнует, то позаботься о каком-нибудь кэшировании; обычно, если, картинки не чрезмерно большие и компьютер не очень старый - все нормально. Есть довольно много свободных DBGrid"ов, которые все это умеют делать, но я немножко посмотрел на них и решил не связываться, а то на torry столько глючного барахла, что дороже будет. Если есть вопросы, давай.



ivans   (2002-02-12 11:44) [2]

Я по такому пути уже ходил. Столкнулся с тем, что поле типа TBlobField не может иметь FieldKind = fkCalculated или fkInternalCalc или fkLookup. Оно вообще по-моему может быть только fkData - то есть должно присутствовать в самой БД.
Картинки - джипеги хорошего качества - где-то от 200 до 1000 кб.
Прилично вообще-то. При технологии на-лету тормозить наверно будет. Кол-во одновременно открытых записей 200-500 может быть. Я вот уже думаю, сделать в БД image поле, где будет храниться только превьюшка (20-30 кб), и с записями она же будет выводиться. А большое изображение будет выводиться только по запросу пользователя не из базы а из файловой системы, а из базы соответственно путь к нему будет браться.
Ну что скажешь?



Анонимщик   (2002-02-12 13:52) [3]

А не нужно делать это поле блобом. Сделай его просто, скажем, текстовым или числовым. Но никакого числа, естественно, вычислять не нужно, зато на событие DBGridDrawDataCell пишешь процедуру:
...
// здесь - находишь строку, в которой в данный момент
// рисуются данные и рисуешь прям по канвасу в
// своем вычислимом поле, точнее, колонке, так что и поля,
// видать, не нужно, просто добавь Column в DBGrid
...
// а в конце -
DBGrid1->DefaultDrawDataCell(Rect, Field, State);

Сейчас всего не вспомню, возможно, что-то придется написать на событие TDataSet OndataChange, хотя не уверен. Будут проблемы какие - говори, посмотрю у себя.



Анонимщик   (2002-02-12 16:55) [4]

Еще вариант - не выводи все картинки, а только для текущей записи. Места-то все равно на экране мало, но смотри.




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.11;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.026 c
1-32439           Light Elf             2002-02-22 13:52  2002.03.11  
Жирный текст в Popup меню.


6-32521           Malder                2001-12-22 17:19  2002.03.11  
Определение IP локального компьютера


1-32501           greenrul              2002-02-24 14:55  2002.03.11  
Как сделать форму всегда


4-32608           Max_VM                2002-01-11 16:05  2002.03.11  
Как записать в меню пункт с integer переменной?


4-32605           mr.Morra              2002-01-12 19:44  2002.03.11  
Вывести сообщения поверх других окон.