Форум: "Базы";
Текущий архив: 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.04 c