Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.07.2015, 19:03   #1
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию При выводе картинок в цикле, TDrawGrid очищается

Доброе время суток, форумчане.
Есть такой код:
Код:
var
  LImageStream: TMemoryStream;
  LPNG: TPNGObject;
  LNumString: integer;
…
while not (ibqEmpty1.Eof) do
    begin
      try
//showmessage('1');
        LImageStream := TMemoryStream.Create;
        LPNG := TPNGObject.Create;
        TBlobField(ibqEmpty1.FieldByName('IMAGE')).SaveToStream(LImageStream);
        LImageStream.Seek(0, soFromBeginning);
        LPNG.LoadFromStream(LImageStream);
        LPNG.Draw(dbViewImage.Canvas, dbViewImage.CellRect(0, LNumString));
      finally
        LImageStream.Free;
        LPNG.Free;
      end;
      inc(LNumString);
      ibqEmpty1.Next;
    end;
…
для вывода картинок в TDrawGrid из Query.
Все отлично выводит, если в каждой из итераций, я вывожу какое-нибудь сообщение. А вот если «showmessage('1');» закомментировано, то TDrawGrid очищается. :-(.
«В чем зарыта собака»?

Заранее спасибо.
KBO вне форума Ответить с цитированием
Старый 13.07.2015, 19:35   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

а где (в какой процедуре) этот код имеет место быть?

Цитата:
«В чем зарыта собака»?
В том что по выходе из процедуры содержащий данный код, рисование на Canvas производится снова и уже БЕЗ учета этих данных.
Рисовать на Canvas надо не там и не тогда где это удобно тебе, а там где и КОГДА это потребуется компоненту, для этого существуют разнообразные события(events) OnDraw....

Цитата:
если в каждой из итераций, я вывожу какое-нибудь сообщение.
В качестве эксперимента, попробуй окно с сообщением сначала перетащить на вновь нарисованную картинку, потом стащить ее оттуда и все это НЕ ЗАКРЫВАЯ это самое окошко.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 13.07.2015 в 19:40.
evg_m вне форума Ответить с цитированием
Старый 13.07.2015, 21:38   #3
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
а где (в какой процедуре) этот код имеет место быть?
Этот код стоит в обработчике срабатывания таймера
KBO вне форума Ответить с цитированием
Старый 13.07.2015, 21:51   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Открой теперь справочку и сфокусируйся на событии OnDrawCell
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.07.2015, 22:44   #5
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Открой теперь справочку и сфокусируйся на событии OnDrawCell
Да, спасибо за совет. и OnDrawCell по справке для этого подходит как нельзя лучше.
Но ситуация следующая:
есть БД, в которой, в одной таблице хранятся наименования авто, а в другой таблице их фото (для одного авто, может быть несколько фото). мне посоветовали не в beforeScroll тянуть фото, а в DataChange "написать
запуск таймера с некоторой задержкой, много большей чем автоповтор клавиатуры. А уже по срабатыванию этого таймера - загружать картинки"

Тогда нужно как-то переделать код, т.е. поставить его в другое место?
KBO вне форума Ответить с цитированием
Старый 14.07.2015, 01:22   #6
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
По умолчанию

Мне кажется тут ещё и вытаскивание картинок не там где нужно...
Не работал с БД под Делфи, конкретно назвать момент не могу, но в общем когда выполнен запрос - тогда и создаются картинки LPNG и не удаляются пока не станут совсем не нужны. Вроде как-то к ячейке можно прикрепить.

Последний раз редактировалось ResourceSpace; 14.07.2015 в 01:25.
ResourceSpace вне форума Ответить с цитированием
Старый 14.07.2015, 09:40   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Есть DataSet с картинками
и есть Grid в котором ЭТИ картинки надо показывать.

в общем думаю надо так.

Имеем заполненный DataSet и пустой (в смысле без картинок пока) Grid.

В процедуре рисования (OnDraw...) узнаем (достаем из DataSet) нужную картинку (как TPNGObjet)
Код:
png:=TPNGObject.Create;
... LoadBlob;
и ПОМЕЩАЕМ её в некий "кеш" (хранилище). Это может быть массив, а можно и в специально отведенное поле данных
Код:
Grid.Objects[x,y]:=png;
При следующем (а также и ПЕРВОМ!) проверяем данный кеш на наличие НУЖНОЙ картинки
Код:
if Object[x,y]=nil then
и если нет грузим картинку из DataSet в кеш. А потом честно рисуем из кеша.
Код:
Canvas.Draw(  Object[x,y] as TPNGObject ...
DataSet в течении жизни программы может меняться (а как он собственно планирует меняться close+open|refresh ?), соответственно должен меняться и Grid.

При изменении DataSet (например AfterClose !!) честно и без затей ЧИСТИМ кеш (удаляем ВСЕ картинки для КАЖДОЙ делаем FreeandNil(Objects[i,j]) !!!). И начинаем все сначала.

При большом желании ПРИДУМЫВАЕМ (и ПРОДУМЫВАЕМ!!) алгоритм частичной очистки "кеша" картинок.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 14.07.2015, 12:33   #8
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
evg_m.
Не совсем так,
Есть DataSet с автомобилями, когда я хожу по строкам этих автомобилей, на каждой строке, у меня срабатывает Query, который вытягивает картинки данного авто из другой таблицы, и вставляет его в DrawGrid.
Но чтобы этот запрос на картинки не срабатывал сразу, при сплошном переборе всех строк авто, мне посоветовали сделать некоторую задержку на срабатывание запроса.
KBO вне форума Ответить с цитированием
Старый 14.07.2015, 13:47   #9
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Чтобы "DrawGrid" не вытерался (как я описывал выше), после того как я его заполнил с "Query", нужно было выставить свойство "DefaultDrawing" (у "DrawGrid") в "FALSE"
Нужно еще сделать массив картинок, чтоб вочтанавливать их после перерисовки "DrawGrid" и не дергать БД лишний раз

Последний раз редактировалось KBO; 14.07.2015 в 13:56.
KBO вне форума Ответить с цитированием
Старый 14.07.2015, 14:08   #10
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Но чтобы этот запрос на картинки не срабатывал сразу, при сплошном переборе всех строк авто,
OnPaint внутри которого и будет вызываться OnDrawCell сам по себе уже "тот таймер" который будет вызваться ТОЛЬКО КОГДА пользователь остановит СВОЙ "бег" по таблице.
OnPaint будет вызвана только после того как будет обработана ВСЯ очередь сообщений. (куда включаются и события от нажатий кнопок листания!!)

Если все же использовать таймер как индикацию активности пользователя, то ...
В таком таймере надо не рисовать, а ставить (:=true) флаг МОЖНО_РИСОВАТЬ_КАРТИНКИ
И использовать(проверять) его в OnDrawCell
Код:
if MOЖНО_РИСОВАТЬ then
  Canvas.DrawPNG.....
А в остальных местах снимать (:=false) его. Где?!!

А также по таймеру вместе с установкой флага запрашивать(требовать) НОВУЮ прорисовку.
Grid.Repaint; Grid.Invalidate; ????

В качестве такого флага можно использовать сам таймер
Код:
if not timer.enabled then // мы уже выключили таймер ???
  DrawPng
А при каждом срабатывании (OnTimer)
сразуже(!!) его отключать
Код:
 TimerX.enabled:=false;
и требовать перерисовки
  Grid.Repaint;
И в местах активности пользователя (можно местах перемещения по набору данных) запускать ЕГО.
И возможно здесь (перемещения по набору данных) имеет смысл заполнять(пополнять) тот "кеш" которым будет пользоваться DrawCell
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при выводе 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