Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.12.24;
Скачать: [xml.tar.bz2];

Вниз

Проблема с 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.093 c
11-1141660550
BenGun
2006-03-06 18:55
2006.12.24
Недомолвка в FAQ насчет AncestorOfObject


15-1164802852
Чапаев
2006-11-29 15:20
2006.12.24
security descriptor -> access control list


3-1160578319
DelphiLexx
2006-10-11 18:51
2006.12.24
Директива FireBird - USE_EMBEDDED_FB


11-1142320949
Barloggg
2006-03-14 10:22
2006.12.24
А запись Pcx есть?


15-1165102323
SkySpeed
2006-12-03 02:32
2006.12.24
В чём ошибка в проекте С++?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский