Форум: "Основная";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
ВнизБыстрое заполнение AdvStringGrid Найти похожие ветки
← →
Schummi (2004-04-25 09:22) [0]Доброго времени суток!
Мастера, многие из вас, наверное, пользовались компонентом TadvStringGrid. У меня возникла такая проблема: когда заполняешь большую таблицу(~1000 строк и ~25 столбцов), она заполняется медленно(~6 сек.), а для меня это многовато. Есть ли какая-нибудь возможность заполнять таблицу бстрее? Спасибо!
← →
Schummi (2004-04-25 15:06) [1]плиз, не молчите. Очень надо
← →
evvcom © (2004-04-25 15:24) [2]А BeginUpdate/EndUpdate пользуешь?
← →
Schummi (2004-04-25 20:32) [3]ну, подробнее. Неа, не использую. А как?
← →
evvcom © (2004-04-26 01:57) [4]Что значит как?
AdvStringGrid.BeginUpdate;
// Здесь заполняем много ячеек
AdvStringGrid.EndUpdate;
Сложно было F1 нажать?
← →
Германн © (2004-04-26 02:07) [5]Более того!
Про BeginUpdate и EndUpdate стоит знать не только при использовании AdvStringGrid, но и еще во многих других случаях заполнения данными визуальных компонент! А еще стоит знать DisableControls и EnableControls.
← →
Schummi (2004-04-26 18:58) [6]А оно реально скорость увеличивает?
← →
Schummi (2004-04-26 19:00) [7]2evvcom
Вообще, я помнил, что там были какие-то процы, но не мог вспомнить их названия!
← →
Schummi (2004-04-26 22:35) [8]Ну, попробовал и ... мне от этих BeginUpdate/EndUpdate ни холодно, ни жарко!!! т.е. что я применяю, что нет, все равно время заполнения одно и тоже!!!
← →
Германн © (2004-04-27 00:32) [9]Ну если не помогло, то приведи кусок кода от BeginUpdate до EndUpdate включительно. Иначе никак не помочь. :-(
← →
evvcom © (2004-04-27 08:02) [10]
> Ну если не помогло, то приведи кусок кода от BeginUpdate
> до EndUpdate включительно. Иначе никак не помочь.
Это мы с тобой понимаем, что BeginUpdate и EndUpdate должны быть вне цикла заполнения, а вопрошающий? Кто его знает, понимает ли он это? А то может запихнул их внутрь цикла, вот и проблемы.
2Schummi: Поэтому покажи также и цикл (for, while или repeat)
← →
Schummi (2004-04-27 14:50) [11]
Grid.BeginUpdate;
for i:=1 to 1001 do
for j:=0 to 26 do
a[j,i]:=inttostr(Random(500));
Grid.RowCount:=1001;
for i:=1 to 1001 do
for j:=0 to 26 do
begin
Grid.Cells[j,i]:=a[j,i];
if odd(strtoint(a[j,i])) then
Grid.Colors[j,i]:=clRed
else Grid.Colors[j,i]:=clYellow;
end;
Grid.EndUpdate;
← →
Erik © (2004-04-27 15:33) [12]Вобщето очень много времени уходит на Random. Непользовался TadvStringGrid, но если нужна скорость то стоит подумать о изменении логики. Например используй TVirtualTreeString для нее и 1000000 не проблема. Хотя здесь дело не в компоненте.
← →
evvcom © (2004-04-27 15:50) [13]Чтобы выяснить причину можно провести несколько тестов:
1. Попробовать стандартный TStringGrid
2. Не использовать Random, а использовать хотя бы простейший счетчик.
3. Избавиться от двойного преобразования IntToStr -> StrToInt
И смотреть, что получится.
← →
Schummi (2004-04-28 09:08) [14]понимаешь, в данный момент проблема не в том, что грид медленно заполняется, а в том, что BeginUpdate/EndUpdate не работает.
max=2500;
...
Grid.BeginUpdate;
Grid.RowCount:=max;
for i:=1 to max do
for j:=0 to 26 do
begin
Grid.Cells[j,i]:=inttostr(j*i);
if odd(j*i) then
Grid.Colors[j,i]:=clRed
else Grid.Colors[j,i]:=clYellow;
end;
Grid.EndUpdate;
Вот, немного переписал, но обратил внимение, что много времени добавляет назначение цвета определенной ячейке, например, в этом коде если цвета присваивать получается 9-ть секунд, а если не присваивать - 1 сек. Вот. А эти цвета мне жизненно необходимы. Может все дело в перерисовке, может её как-нибудь отключить?
← →
evvcom © (2004-04-28 09:10) [15]Так вот перерисовка и отключается BeginUpdate/EndUpdate.
А вообще я уже находил некоторые глюки и фичи в TAdvStringGrid. Похоже сыроват он еще...
← →
begin...end © (2004-04-28 09:30) [16]> Schummi
А в чём причина использования TAdvStringGrid вместо TStringGrid? Только из-за разноцветных ячеек, что ли?
← →
pasha_golub © (2004-04-28 09:35) [17]begin...end © (28.04.04 09:30) [16]
Солидарен. Стандартный TStringGrid, даже более того, TDrawGrid отлично подойдет. У автора сначала заполняется массив, так пусть данные и будут в этом массиве, зачем их дублировать. А вывод осуществлять в обработчике TDrawGrid.OnDrawCell
← →
Schummi (2004-04-28 18:23) [18]to begin...end
ага. Да и функций там больше, типа CellClick и других, которые лень реализовывать на базе TStringGrid
to pasha_golub
а это хорошая идея, попробую.
Но все-таки вопрос остается открытым. Почему не работает BeginUpdate/EndUpdate? (время заполнения при использовании и при не использовании одно и тоже)
← →
WebErr © (2004-04-28 18:28) [19]Да всё работает, только вероятно, что в данном компоненте вызываются они автоматически, а значит Вы просто ещё два раза их вызвали... 8)
← →
Schummi (2004-04-29 08:25) [20]To pasha_golub ОТЛИЧНАЯ ИДЕЯ!!! ПРОСТО СУПЕР!!! ДАЖЕ И НЕ ЗНАЮ, КАК ВАС БЛАГОДАРИТЬ!!! ТЕПЕРЬ НЕ ПРИХОДИТСЯ ЖДАТЬ. А все же, может есть у этого метода минусы?
← →
Doctor Deejay © (2004-05-04 16:30) [21]Попробуй свойство Visible у компонента сделать false, а потом true. У меня при больших объемах помогало!
← →
pasha_golub © (2004-05-04 16:46) [22]Schummi (29.04.04 08:25) [20]
У этого. Ну, как... Наверное есть. Например, вы не сможете использовать методы TStrings, которые предоставляют вам колонки и строки. Но для вашей задачи это, имхо, отличный компромисс.
И вообще чтобы судить о минусах и плюсах, нужно знать чуток поболее о задаче. Быть может вообще не нужно грузить такое кол-во строк. Может можно обойтись mapped файлами, а работать только со страницами в памяти.
Если все-таки такой метод подошел, загляните в исходный код TDBGRID - там много полезного, может натолкнет на кой какие мысли.
Удачи.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.034 c