Форум: "Базы";
Текущий архив: 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]Еще вариант - не выводи все картинки, а только для текущей записи. Места-то все равно на экране мало, но смотри.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.03.11;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.004 c