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

Вниз

Проблема с RemoveAllNodes в AdvStringGrid при повторном вызове   Найти похожие ветки 

 
jiny   (2006-10-10 12:56) [0]

Возможно вопрос офф-топик, но вроде и базы данных как-то участвуют, да и в "Основной" никто на него не ответил, поэтому, да простит меня Админ, цитирую вопрос :
Желание клиента было выгружать данные из таблицы в AdvStringGrid, c тем чтобы в итоге получалось дерево.
Представьте : список клиентов, щелкнув по одному из них раскрывается дерево, где находится вся основная информация о клиенте (РНН, адрес, мыло и проч.), щелкнув по другому клиенту, выйдет информация о другом клиенте также в виде дерева. С этой задачей я успешно справился. Все получается так как хотел клиент, но ПОЛУЧАЛОСЬ только на малом объеме данных (9 клиентов х 5 (4 строки информации о нем)=45 всего строк ). Подвязал прогресбар и все работало. Но перед тем как сдавать обновление я решил попробовать увеличить объем данных до 650 клиентов х 5 = 3250 строк, а их (клиентов) может быть до 10000 х 5 = 50000 строк. Первый раз формируя список из 650 клиентов - программа формирует нормально, даже более чем, но стоит запустить запрос повторно, обработчик тормозит на строке RemoveAllNodes. Понимаю что делаю что-то не так, и понимаю что дело в RemoveAllNodes но как решить вопрос по другому не представляю. Пробовал вставлять данные 1100 клиентов без Addnode, повторный запрос не тормозит и выдает все очень быстро. Как мне быть ?
Заранее спасибо.


 
sniknik ©   (2006-10-10 13:10) [1]

> Как мне быть ?
1 не пользоваться нестандартными компонентами?

2 найти не визуальный контрол для хранения данных, а сделанный по аналогу базовых, с разделением на "для данных" и "для отображения"

3 перед ресурсоемкими изменениями отключать обновление? (DisableControls/BeginUpdates/... х.з. что там у тебя за компанент)

4 по аналогу баз сделать как они, вместо удаления позаписьно все из таблици для очистки, удалить ее всю и создать заново?

5 и может всетаки прекратить описывать симптомы последствий, и начинать обсуждать с действий/кода что к ним приводят ?????????


 
evvcom ©   (2006-10-10 15:25) [2]

> [0] jiny   (10.10.06 12:56)

Пробовал я когда-то TAdvStringGrid. Это из TMS вроде. Тоже была какая-то проблема, связанная с RemoveAllNodes. Что я сделал - не помню, но у меня есть опыт "исследования программ". Как быть тебе - не знаю. TMS - AFAIR платные компоненты при использовании в коммерческих продуктах, причем, по-моему, TAdvStringGrid не заточен под DB. Если они у тебя купленные, пиши в поддержку, если ворованные, то чего тогда плакаться?
Я в конце-концов отказался от TMS в пользу DevExpress.


 
jiny   (2006-10-11 08:01) [3]

>>sniknik ©   (10.10.06 13:10) [1]
> Как мне быть ?
>>1 не пользоваться нестандартными компонентами?
Не получится, в стандартных такой фичи нет.

3 перед ресурсоемкими изменениями отключать обновление? (DisableControls/BeginUpdates/... х.з. что там у тебя за компанент)
выключаю (BeginUpdates) и включаю (EndUpdates)

4 по аналогу баз сделать как они, вместо удаления позаписьно все из таблици для очистки, удалить ее всю и создать заново?
Там не удаляется построчно :
 AdvStringGrid1.Clear ();
 AdvStringGrid1.rowcount:=1;

 этого достаточно.

>>5 и может всетаки прекратить описывать симптомы последствий, и >>начинать обсуждать с действий/кода что к ним приводят ?????????
начинаю :
 MainGrd.BeginUpdate;
 MainGrd.RemoveAllNodes;
 MainGrd.Clear;
 MainGrd.RowCount:=1;
 MainGrd.ColCount:=2;
 I:=0;

 MainGrd.ColWidths[0]:=0;
 MainGrd.ColWidths[1]:=290;
 dm1.qrFirms.SQL.Text:="select count(id) from klient firms order by name_firm where kat_firm=...";
   dm1.qrFirms.Open;
   TmpRecCount:=dm1.qrFirms.Fields[0].AsInteger;

   dm1.qrFirms.Close;
   dm1.qrFirms.SQL.Text:="select * from klient firms order by name_firm where kat_firm=...";
   dm1.qrFirms.UniDirectional:=true;
   dm1.qrFirms.Open;

   StepY:=1;

   prgBarKateg.TotalParts:=TmpRecCount;
   prgBarKateg.ShowPercent:=true;
   For i:=0 to TmpRecCount-1 do
   begin
     MainGrd.RowCount:=StepY;
     If dm1.qrFirms.fieldbyname("isJurFace").AsInteger=0 then TmpKlImage:=15 else
       If dm1.qrFirms.fieldbyname("isJurFace").AsInteger=1 then TmpKlImage:=14 else
         If dm1.qrFirms.fieldbyname("isJurFace").AsInteger=2 then TmpKlImage:=16 else
           TmpKlImage:=-1;

     MainGrd.Cells[1,StepY-1]:="<IMG src="idx:"+Inttostr(TmpKlImage)+""><FONT color="clBlack" size=10> => ("+Inttostr(i+1)+") "+dm1.qrFirms.fieldbyname("name_firm").AsString+"</FONT>";
     MainGrd.RowHeights[stepY-1]:=20;

     TmpBeg:=stepY-1;

     StepY:=StepY+1;
     MainGrd.RowCount:=STepY;
     MainGrd.Cells[1,stepY-1]:="      РНН :     <a href="rnn="+dm1.qrFirms.fieldbyname("rnn").AsString+" type="+dm1.qrFirms.fieldbyname("isJurFace").AsString+"">"+dm1.qrFirms.fieldbyname("rnn").AsString+"</a>";
     MainGrd.RowHeights[StepY-1]:=20;
       MainGrd.Colors[1,stepY-1]:=$00C6E2FF;

     StepY:=StepY+1;
     MainGrd.RowCount:=STepY;
     MainGrd.Cells[1,stepY-1]:="      Адрес : <a href="gor="+dm1.qrFirms.fieldbyname("city").AsString+" ul="+dm1.qrFirms.fieldbyname("Street").AsString+" DOM="+dm1.qrFirms.fieldbyname("dom").AsString+""> "+dm1.qrFirms.fieldbyname("City").AsString+", "+dm1.qrFirms.fieldbyname("Street").AsString+", "+dm1.qrFirms.fieldbyname("dom").AsString+"</a>";
     MainGrd.RowHeights[StepY-1]:=20;
           MainGrd.Colors[1,stepY-1]:=$00C6E2FF;

     MainGrd.AddNode(TmpBeg,3);
     dm1.qrFirms.next;
     STepY:=StepY+1;
     prgBarKateg.PartsComplete:=i;
     Application.ProcessMessages;
   end;
   MainGrd.ContractAll;
   dm1.qrFirms.Close;
 end;
 DtMapMain.Enabled:=true;
 {Отключаем проценты}
 prgBarKateg.ShowPercent:=false;
 prgBarKateg.PartsComplete:=0;
 prgBarKateg.TotalParts:=0;
 {Начинаем рисовать данные в гриде}
 MainGrd.endupdate;
 {Выводим количество записей}
 stBarKateg.Caption:=format("Субъектов : %d",[i]);
 dm1.qrFirms.UniDirectional:=False;
 dm1.qrFirms.close;


 
Johnmen ©   (2006-10-11 09:59) [4]


> dm1.qrFirms.SQL.Text:="select count(id) from klient firms
> order by name_firm where kat_firm=...";


Зачем же определять количество записей??? Ведь до следующего запроса оно может измениться!


>   dm1.qrFirms.Close;


Зачем делать два раза? Почему dm1.qrFirms.UniDirectional:=False; перед Close???

PS
Отказаться от левого компонента. Применить обычный TTreeView.


 
sniknik ©   (2006-10-11 11:08) [5]

>>> 1 не пользоваться нестандартными компонентами?
> Не получится, в стандартных такой фичи нет.
вообще, если какойто фичи нет, то нормально, "по праграммистки" ее написать... раз нужна. а не бросатся на поиски нестандартного и убогого.

если уж нет возможности/замен и нестандартное всетаки приходится использовать то выбирай хотя бы то, что имеет исходники. чтобы иметь возможность исправить под себя.

> MainGrd.RemoveAllNodes;
> MainGrd.Clear;
Clear по идее это очистка всего, в нормально написаном, RemoveAllNodes в этом случае лишняя.

p.s. вывалить код это не совсем то что называется обсуждением... ожидал, что будут хоть какието пояснения, действия, типа "здесь делаем замер времени - xx:xx, после выполняем вот эти команды, время xx:xx, смотрим разницу она равна 2 часа... что неприемлемо на 2000 записях..."
т.е. чтобы было понятно, а из приведенного вовсе не понятно что тормоза именно на RemoveAllNodes, а не в криво сделанном переносе.

p.p.s. TTreeView явно предпочтительней. хотя бы потому что он есть у всех, и его поведение можно проверить а не полагаться на неподтвержденные утверждения.


 
jiny   (2006-10-12 08:20) [6]

>>Johnmen ©   (11.10.06 09:59) [4]
> dm1.qrFirms.SQL.Text:="select count(id) from klient firms
> order by name_firm where kat_firm=...";

>>Зачем же определять количество записей??? Ведь до следующего запроса >>оно может измениться

если ты не заметил where kat_firm=..."; оно (кол-во записей) и меняется каждый раз при смене критерия условия.

>>Зачем делать два раза? Почему dm1.qrFirms.UniDirectional:=False; перед >>Close???
ты прав, правильней наоборот.
>>PS
>>Отказаться от левого компонента. Применить обычный TTreeView.
компонент совсем не левый, просто с большим объемом данных почему то тормозит.

>> 1 не пользоваться нестандартными компонентами?
>> Не получится, в стандартных такой фичи нет.
вообще, если какойто фичи нет, то нормально, "по праграммистки" ее написать... раз нужна. а не бросатся на поиски нестандартного и убогого.

sniknik ©   (11.10.06 11:08) [5]
>>> 1 не пользоваться нестандартными компонентами?
> Не получится, в стандартных такой фичи нет.
вообще, если какойто фичи нет, то нормально, "по праграммистки" ее написать... раз нужна. а не бросатся на поиски нестандартного и убогого.

>>если уж нет возможности/замен и нестандартное всетаки приходится ?
>>использовать то выбирай хотя бы то, что имеет исходники. чтобы иметь
>>возможность исправить под себя.
здесь согласен, буду искать , но время у меня ограничено, потом ,возможно, напишу под себя, но сейчас мне нужно хоть что-то работающее отдать для презентации программы, именно от этого зависит будут вообще брать программу или нет.

>>p.s. вывалить код это не совсем то что называется обсуждением...
>>ожидал, что будут хоть какието пояснения, действия, типа "здесь делаем
>>замер времени - xx:xx, после выполняем вот эти команды, время xx:xx,
>>смотрим разницу она равна 2 часа... что неприемлемо на 2000 записях..."
в принципе, самое главное, на что я просил обратить внимание это RemoveAllNodes, все остальное работает как часы, если есть предложения как оптимизировать процедуру очистки Грида со всеми ветками,  

>> MainGrd.RemoveAllNodes;
>> MainGrd.Clear;
>>>Clear по идее это очистка всего, в нормально написаном, RemoveAllNodes >>>в этом случае лишняя.
а вот здесь, видимо, ты не знаком с этим компонентом, MainGrd.RemoveAllNodes очищает зависимые ветки от "зависимости" и делает их обычными ячейками (данные в них не исчезают), а Clear очищает все полностью.


 
evvcom ©   (2006-10-12 08:34) [7]

> [6] jiny   (12.10.06 08:20)
> но сейчас мне нужно хоть что-то работающее отдать для презентации
> программы, именно от этого зависит будут вообще брать программу
> или нет.

Для презентации программы совсем не обязательно в тестовые данные записывать мильЁн. Оставь 2-3 десятка записей, этого вполне достаточно. На 20-30 не тормозит?

> в принципе, самое главное, на что я просил обратить внимание
> это RemoveAllNodes, все остальное работает как часы, если
> есть предложения как оптимизировать процедуру очистки Грида

Оптимизировать можно, имея исходники этого RemoveAllNodes и прочих методов. Не имея исходников сделать что-то ну очень сложно, для не хакеров - просто невозможно.

> >>>Clear по идее это очистка всего, в нормально написаном,
> RemoveAllNodes >>>в этом случае лишняя.
> а вот здесь, видимо, ты не знаком с этим компонентом, MainGrd.RemoveAllNodes
> очищает зависимые ветки от "зависимости" и делает их
> обычными ячейками (данные в них не исчезают), а Clear очищает
> все полностью.

По идее sniknik прав, и Clear должен был сам заботиться о вызове RemoveAllNodes, потому как это логично, о чем он и упомянул:
> в нормально написаном


 
Johnmen ©   (2006-10-12 09:33) [8]


> jiny   (12.10.06 08:20) [6]
> ты не заметил where kat_firm=...";  оно (кол-во записей)
> и меняется каждый раз при смене критерия условия.


Я всё заметил, мой таинственный друг. И говорил я о другом.
А именно. Не кажется ли тебе, что пока твоя программа выполняет код
от
TmpRecCount:=dm1.qrFirms.Fields[0].AsInteger;

до
For i:=0 to TmpRecCount-1 do

количество записей, удовлетворяющих запросу
dm1.qrFirms.SQL.Text:="select count(id) from klient firms order by name_firm where kat_firm=...";

может измениться?


 
evvcom ©   (2006-10-12 10:12) [9]

> [8] Johnmen ©   (12.10.06 09:33)
> до
> For i:=0 to TmpRecCount-1 do

Не... До второго
dm1.qrFirms.Open; :)


 
Johnmen ©   (2006-10-12 10:30) [10]


> evvcom ©   (12.10.06 10:12) [9]


Да-да :)


 
sniknik ©   (2006-10-12 12:45) [11]

> для не хакеров - просто невозможно.
эт ты зря, хороший программист на порядки выше хакеров... а хороших хакеров вообще не бывает, есть только программисты по какимто причинам занимающиеся хакерством .

> и Clear должен был сам заботиться о вызове RemoveAllNodes
не о вызове его, а о полной очистке, типа, зачем чистить память поблочно, если сразу после этого она удаляется вся, вместе со всеми частями которые в ней содержатся...
т.е. если применительно к этому компаненту
> а вот здесь, видимо, ты не знаком с этим компонентом, MainGrd.RemoveAllNodes очищает зависимые ветки от "зависимости"
> и делает их обычными ячейками (данные в них не исчезают), а Clear очищает все полностью.
зависимости исчезнут вместе с данными... так зачем же их вообще очищать?

но это неважно т.к. до сих пор не уверен что проблема в RemoveAllNodes или вообще компаненте, больше похоже на тормоза авторской части, разделения в описании какого бы хотелось ([5]) нет, взаимодействия тоже (ну попробовал бы хоть чтото из предложеного). и ну его нафик. на нет и суда нет.


 
evvcom ©   (2006-10-12 13:01) [12]

> [11] sniknik ©   (12.10.06 12:45)
> > для не хакеров - просто невозможно.
> эт ты зря, хороший программист на порядки выше хакеров...

Ну не имея исходного кода, а подправить под себя очень нужно, что ты будешь делать? Нажмешь Ctrl+Alt+C и дальше отладчиком? Ну Browser (Shift+Ctrl+B) еще задействуешь. Имхо, это уже хакерство.

> а хороших хакеров вообще не бывает

Здесь, думаю, сколько людей, столько мнений. Спорить безсмысленно.

> программисты по какимто причинам занимающиеся хакерством

Ну это бесспорно.



Страницы: 1 вся ветка

Текущий архив: 2006.12.24;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.03 c
15-1164922671
ЭРИКА
2006-12-01 00:37
2006.12.24
С ДНЕМ РОЖДЕНИЯ!


2-1165419384
Roman_ln
2006-12-06 18:36
2006.12.24
Возможно ли отменить ввод текстовой информации в текст. поле


15-1165320757
Gero
2006-12-05 15:12
2006.12.24
Были раньше времена…


2-1165224363
Картошка
2006-12-04 12:26
2006.12.24
Как добавить поле к таблице


2-1165410960
Rtr
2006-12-06 16:16
2006.12.24
вопрос по Word