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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.11.2014, 13:34   #1
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию Как ускорить прорисовку таблицы? (затяжная проверка условий)

Этот код очень сильно тормозит прорисовку. Тормозит не сама работа с канвой, а то, что до неё. Вынес вообще за процедуру определение булевой переменной, которая связывалась с чекбоксом; вынес присвоения значений DatStrtSel и DatFinSel. Вроде стало чуть-чуть побыстрее. Но всё равно оочень медленно. Как ещё можно "убыстрить" проверку условия и ускорить прорисовку?
Код:
  if ((ACol=1) or (ACol=2)) and (GetSel) and (ARow>0) then
  begin
    If StringGrid1.Cells[3,ARow]<>'' then DatStr:=StrToInt(SongDates.Values[StringGrid1.Cells[3,ARow]]) 
    else DatStr:=StrToInt(SongDates.Values[StringGrid1.Cells[4,ARow]]);
    if (DatStr>=DatStrtSel) and (DatStr<=DatFinSel) then
    begin
      StringGrid1.Canvas.Font.Color:=clRed;
      StringGrid1.Canvas.TextOut(Rect.Left+2,Rect.Top+2,StringGrid1.Cells[ACol,ARow]);
    End;
  End;

Последний раз редактировалось Stilet; 17.11.2014 в 13:54.
Ship_1 вне форума Ответить с цитированием
Старый 17.11.2014, 13:56   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну можно DatStr влить в StringGrid1.Objects[3,ARow] и уже его тут проверять.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.11.2014, 14:08   #3
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Влить - что-то типа
Код:
StringGrid1.Objects[3,ARow]=StringGrid1.Objects[3,ARow]+DatStr
?
Недопонял, как тогда упростится проверка и плюс тогда при прорисовке таблицы появляется новая процедура по выделению и отрисовке нужного значения в ячейку.
Или недопонял фразу целиком
Ship_1 вне форума Ответить с цитированием
Старый 17.11.2014, 14:21   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Влить - что-то типа
Да. Проверка на Integer всетки быстрее чем на строку плюс поиск в списке SongDates.
Кстати, а что вообще это за программа такая? Зачем в отрисовке понадобилась такая динамическая проверка?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.11.2014, 14:31   #5
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Есть база данных, я значения из неё переношу в таблицу.
В базу добавляются ежемесячно данные.
Мне нужно в таблице выделить то, что добавлялось с такого-то по такое-то время.
============
Цитата:
> Проверка на Integer всетки быстрее чем на строку плюс поиск в списке SongDates.
Но тогда при самой отрисовке добавляется процедура выделения параметра и выведения его на канву. Да и принцип работы с таблицей меняется (в значении ячейки уже начинает содержаться не то, что должно отрисовываться). У меня есть в планах переход к этому типу работы с таблицей, но до этого нужно разобраться с другими вещами. Так что за информацию спасибо, возьму на заметку.
Только не совсем понял про проверку на Integer в этих условиях.

Последний раз редактировалось Stilet; 17.11.2014 в 15:04.
Ship_1 вне форума Ответить с цитированием
Старый 17.11.2014, 14:49   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

SongDates - TStringList? Если так, то Values тупо перебором ищет и все это медленно для достаточно большого набора строк
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.11.2014, 15:07   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Но тогда при самой отрисовке добавляется процедура выделения параметра и выведения его на канву
Всмысле?
Цитата:
Мне нужно в таблице выделить то, что добавлялось с такого-то по такое-то время.
А зачем тогда тут нужен SongDates?
Цитата:
Только не совсем понял про проверку на Integer в этих условиях.
Код:
var i:integer;

  if ((ACol=1) or (ACol=2)) and (GetSel) and (ARow>0) then
  begin
    i:=integer(StringGrid1.Objects[3,ARow]); 
    if (i>=DatStrtSel) and (i<=DatFinSel) then
    begin
      StringGrid1.Canvas.Font.Color:=clRed;
      StringGrid1.Canvas.TextOut(Rect.Left+2,Rect.Top+2,StringGrid1.Cells[ACol,ARow]);
    End;
  End;
Так понятнее?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.11.2014, 16:37   #8
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Да, так понятнее. Думал, что-то более мудрёное...

Цитата:
Сообщение от Stilet Посмотреть сообщение
А зачем тогда тут нужен SongDates?
Это и есть список дат записей. "Ключ" - заголовок записи, значение - дата записи.

Цитата:
Сообщение от Аватар Посмотреть сообщение
SongDates - TStringList? Если так, то Values тупо перебором ищет и все это медленно для достаточно большого набора строк
Перебором??? Т.е. значение не определяется как значение строки с индексом ключа? Или IndexOf('N') - тоже перебором?
А тогда как быстрее найти значение, соответствующее параметру?..
Ship_1 вне форума Ответить с цитированием
Старый 17.11.2014, 17:23   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
А тогда как быстрее найти значение, соответствующее параметру?..
Ну быстрее будет наверное если сделать этот СтрингЛист отсортированным. Есть у него такое свойство.
Все равно мне кажется что ты слона нагородил...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.11.2014, 18:26   #10
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Все равно мне кажется что ты слона нагородил...
)) Очень даже возможно.
Если не сложно - можно пояснить: как это "отрисованный СтрингЛист"?
В результате я заметно повысил отрисовку, формируя в SongDates не изначально весь список по принципу "параметр=значение" и просматривая при отрисовке значение, в котором параметр - это ячейка, а при выборе границ формируя список из параметров, значение которых входит в нужный диапазон.
Другими словами, теперь это
Код:
  if ((ACol=1) or (ACol=2)) and (GetSel) and (ARow>0) then
  begin
    If ((StringGrid1.Cells[3,ARow]<>'') and (SongDates.IndexOf(StringGrid1.Cells[3,ARow])>0)) or
	   ((StringGrid1.Cells[4,ARow]<>'') and (SongDates.IndexOf(StringGrid1.Cells[4,ARow])>0)) then
    begin
      StringGrid1.Canvas.Font.Color:=clRed;
      StringGrid1.Canvas.TextOut(Rect.Left+2,Rect.Top+2,StringGrid1.Cells[ACol,ARow]);
    End;
  End;
Если границы соответствуют всему диапазону, то разницы, конечно, никакой. Но в случае если диапазон короче, то список меньше и прорисовка быстрее Особенно если это последние пара месяцев из четырёх лет - вообще почти незаметно.
Ship_1 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как ускорить AlexVI Общие вопросы C/C++ 10 15.07.2014 23:42
Как обойти прорисовку формы? beringoff Общие вопросы Delphi 20 15.05.2014 14:37
Flash Волк, коза, капуста. Проверка условий. Екатерина_92 Общие вопросы Web 3 17.02.2013 01:12
Как в Canvas сделать прорисовку задаваемого пользователем количества линий? CallMeJammer Общие вопросы Delphi 3 18.05.2011 22:51
Проверка условий advanced PHP 3 23.01.2011 12:10