Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.16;
Скачать: CL | DM;

Вниз

Быстрое заполнение 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.032 c
1-1083140558
GIL
2004-04-28 12:22
2004.05.16
MDI-окна исчезновение управляющих кнопок при развертывании


3-1082543669
avgur
2004-04-21 14:34
2004.05.16
Вопрос о истории значеий


14-1083081391
RealRascal
2004-04-27 19:56
2004.05.16
Тараканы вымерли?


4-1079731294
SeregaT
2004-03-20 00:21
2004.05.16
Пошаговый отладчик


6-1080031119
dnsokol
2004-03-23 11:38
2004.05.16
Подключение Telnet клиентов к серверу и как это разрулить?