|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
13.07.2015, 19:03 | #1 |
Форумчанин
Регистрация: 11.06.2010
Сообщений: 525
|
При выводе картинок в цикле, TDrawGrid очищается
Доброе время суток, форумчане.
Есть такой код: Код:
Все отлично выводит, если в каждой из итераций, я вывожу какое-нибудь сообщение. А вот если «showmessage('1');» закомментировано, то TDrawGrid очищается. :-(. «В чем зарыта собака»? Заранее спасибо. |
13.07.2015, 19:35 | #2 | ||
Старожил
Регистрация: 20.04.2008
Сообщений: 5,526
|
а где (в какой процедуре) этот код имеет место быть?
Цитата:
Рисовать на Canvas надо не там и не тогда где это удобно тебе, а там где и КОГДА это потребуется компоненту, для этого существуют разнообразные события(events) OnDraw.... Цитата:
программа — запись алгоритма на языке понятном транслятору
Последний раз редактировалось evg_m; 13.07.2015 в 19:40. |
||
13.07.2015, 21:38 | #3 |
Форумчанин
Регистрация: 11.06.2010
Сообщений: 525
|
|
13.07.2015, 21:51 | #4 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Открой теперь справочку и сфокусируйся на событии OnDrawCell
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
13.07.2015, 22:44 | #5 |
Форумчанин
Регистрация: 11.06.2010
Сообщений: 525
|
Да, спасибо за совет. и OnDrawCell по справке для этого подходит как нельзя лучше.
Но ситуация следующая: есть БД, в которой, в одной таблице хранятся наименования авто, а в другой таблице их фото (для одного авто, может быть несколько фото). мне посоветовали не в beforeScroll тянуть фото, а в DataChange "написать запуск таймера с некоторой задержкой, много большей чем автоповтор клавиатуры. А уже по срабатыванию этого таймера - загружать картинки" Тогда нужно как-то переделать код, т.е. поставить его в другое место? |
14.07.2015, 01:22 | #6 |
Форумчанин
Регистрация: 30.06.2015
Сообщений: 353
|
Мне кажется тут ещё и вытаскивание картинок не там где нужно...
Не работал с БД под Делфи, конкретно назвать момент не могу, но в общем когда выполнен запрос - тогда и создаются картинки LPNG и не удаляются пока не станут совсем не нужны. Вроде как-то к ячейке можно прикрепить. Последний раз редактировалось ResourceSpace; 14.07.2015 в 01:25. |
14.07.2015, 09:40 | #7 |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,526
|
Есть DataSet с картинками
и есть Grid в котором ЭТИ картинки надо показывать. в общем думаю надо так. Имеем заполненный DataSet и пустой (в смысле без картинок пока) Grid. В процедуре рисования (OnDraw...) узнаем (достаем из DataSet) нужную картинку (как TPNGObjet) Код:
Код:
Код:
Код:
При изменении DataSet (например AfterClose !!) честно и без затей ЧИСТИМ кеш (удаляем ВСЕ картинки для КАЖДОЙ делаем FreeandNil(Objects[i,j]) !!!). И начинаем все сначала. При большом желании ПРИДУМЫВАЕМ (и ПРОДУМЫВАЕМ!!) алгоритм частичной очистки "кеша" картинок.
программа — запись алгоритма на языке понятном транслятору
|
14.07.2015, 12:33 | #8 |
Форумчанин
Регистрация: 11.06.2010
Сообщений: 525
|
Не совсем так,
Есть DataSet с автомобилями, когда я хожу по строкам этих автомобилей, на каждой строке, у меня срабатывает Query, который вытягивает картинки данного авто из другой таблицы, и вставляет его в DrawGrid. Но чтобы этот запрос на картинки не срабатывал сразу, при сплошном переборе всех строк авто, мне посоветовали сделать некоторую задержку на срабатывание запроса. |
14.07.2015, 13:47 | #9 |
Форумчанин
Регистрация: 11.06.2010
Сообщений: 525
|
Чтобы "DrawGrid" не вытерался (как я описывал выше), после того как я его заполнил с "Query", нужно было выставить свойство "DefaultDrawing" (у "DrawGrid") в "FALSE"
Нужно еще сделать массив картинок, чтоб вочтанавливать их после перерисовки "DrawGrid" и не дергать БД лишний раз Последний раз редактировалось KBO; 14.07.2015 в 13:56. |
14.07.2015, 14:08 | #10 | |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,526
|
Цитата:
OnPaint будет вызвана только после того как будет обработана ВСЯ очередь сообщений. (куда включаются и события от нажатий кнопок листания!!) Если все же использовать таймер как индикацию активности пользователя, то ... В таком таймере надо не рисовать, а ставить (:=true) флаг МОЖНО_РИСОВАТЬ_КАРТИНКИ И использовать(проверять) его в OnDrawCell Код:
А также по таймеру вместе с установкой флага запрашивать(требовать) НОВУЮ прорисовку. Grid.Repaint; Grid.Invalidate; ???? В качестве такого флага можно использовать сам таймер Код:
сразуже(!!) его отключать Код:
И возможно здесь (перемещения по набору данных) имеет смысл заполнять(пополнять) тот "кеш" которым будет пользоваться DrawCell
программа — запись алгоритма на языке понятном транслятору
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Ошибка при выводе | Pasha_Sh | Общие вопросы Delphi | 7 | 27.03.2015 19:52 |
Вывод картинок в цикле БД MySQL | sevalery | PHP | 2 | 09.07.2011 23:02 |
Очищается форма :( | kerbeross | JavaScript, Ajax | 1 | 23.03.2011 22:12 |
Кракозябры при выводе | Syltan | HTML и CSS | 4 | 11.12.2010 19:59 |