Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.054 c
3-1082365773
TransparentGhost
2004-04-19 13:09
2004.05.16
Можно ли использовать IF (..) OR/AND (..) THEN в Triggere?


14-1082909285
Knight
2004-04-25 20:08
2004.05.16
Есть ли сейчас нормальные, заморочные квесты?


3-1082112658
Dimbas
2004-04-16 14:50
2004.05.16
Проблема открытия базы с CD


6-1080234997
Ландграф Павел
2004-03-25 20:16
2004.05.16
TWebBrowser


1-1083303503
dstupin
2004-04-30 09:38
2004.05.16
Проблема с dll на дельфи, при вызове из VC++ 6





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский