![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ускорить построение TreeView, как??? [D6, Win2k]
Relaxxx © (2004-07-07 14:37:00)Здраствуйте мастера!
Вот нашол компонент, вернее просто THETreeView, он не визуальный, а просто пас файл. Так вот я незнаю как его использовать.
Я например леплю на форму TTreeView с именем MainTree и после думал сделать так
var
My_tree: THETreeView;
...
My_Tree:=FastTree.THETreeView.Create(MainTree);
и уже через My_Tree работать с компонентом, но мне выдает ошибку, что-то типа: class EInvalidOperation with message 'Control' has no parent window
что я делаю так???
Amoeba (2004-07-08 12:02:00) [1]Есть готовые компоненты, как отдельно, так и в составе бесплатных библиотек, например:
JVCL - http://jvcl.sourceforge.net/
VGLib - http://www.vglib.com/
Polaris - http://polesoft.narod.ru/download.html
TUser (2004-07-07 19:49:00) [2]хорошо. жди вечера.
Relaxxx (2004-07-07 19:17:00) [3]
> TUser ©
БУДУ ОЧЕНЬ ПРИЗНАТЕЛЕН!!!
вот адресс - programer@armtec.com.ua
TUser (2004-07-07 18:11:00) [4]Могу выслать свой юнит, в котором сторится дерево из БД. Только вечером - он у меня дома.
ЗЫ. Оффтоп, конечно, но все-таки
> http://www.delphikingdom.com/asp/viewitem.asp?catalogid=488
Я тоже туда сходил, никак не пойму, зачем там в SQL запросах пишут WHERE 0=0
Amoeba (2004-07-07 16:39:00) [5]Посмотри вот эту статью:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=488
Sandman25 (2004-07-07 16:33:00) [6]Например так,
MyField := FieldByName('myfield');
while not DataSet.Eof do
begin
MyField.AsXXX
...
Relaxxx (2004-07-07 16:32:00) [7]Нащет выделения памяти понял, но не понял что плохого в DataSet'е в цикле, если он тормозит, как мне его обойти, вообще кто-то занимался построением с базы данных бооольших деревьев с учетом того что программы будут работать на не очень сильных машинах и нужно оптимизировать как можно лучше
Sandman25 (2004-07-07 16:23:00) [8]>а как именно,
Неоптимально используется DataSet. Все эти FieldByName в цикле, TreeDS.DataSet...
>или я не прав?
В данном случае нужно выделять память через New(P), где P: PMyRecord. Иначе получается ссылка на локальную строку, которая тут же очищается (память, выделенная под нее, освобождается).
Reindeer Moss Eater (2004-07-07 16:15:00) [9]"главным образом"
Relaxxx (2004-07-07 16:13:00) [10]
> Нужно оптимизировать. И довольно много.
а как именно, я сейчас пытаюсь, чтобы дерево пробегать только один раз и уникальный номер хранить в этом свойстве Data итемса, но что-то не получается.
Я сделал, так как Вы описали чтение, но мне пишет что ошибка чтения памяти?
А заношу я идентификатор итемса когда строю дерево так
Tree.Items[i].Data:=Pointer(TreeDS.DataSet.FieldByName('OWNCAT').AsString);
или я не прав?
> Собственно тормозит у тебя г.о. не treeview
что такое г.о.
TUser (2004-07-07 16:08:00) [11]Собственно тормозит у тебя г.о. не treeview, а бд. А то что этот компонент нфига не разгоняет - я писал. Сам однажды пытался "ускорить".
Sandman25 (2004-07-07 15:58:00) [12]Нужно оптимизировать. И довольно много.
>а вот как прочитать то что я записал я не знаю
type
PMyRecord = ^TMyRecord;
TMyRecord = record
xxx
end;
PMyRecord(MainTree.Items[1].Data)^.xxx
Relaxxx (2004-07-07 15:54:00) [13]Вот так
procedure TMainForm.BuildMainTree(Tree: TTreeView;Sender: TObject; Tord:integer);
var
i, CountTree:integer;
t:Ttime;
begin
t:=time;
TreeBuild:=0;
Tree.Items.BeginUpdate;
Tree.Items.Clear;
TreeQ.Close;
TreeQ.SQL.Clear;
TreeQ.SQL.Add('SELECT * FROM '+AliasName+'.dbcattree WHERE dbid=55 ORDER BY tord');
TreeQ.Open;
TreeQ.First;
Tree.Items.Add(nil, TreeDS.DataSet.FieldByName('OWNCAT').AsString);
TreeQ.Next;
while not TreeDS.DataSet.Eof do
begin
i:=0;
while Tree.Items[i].Text<>TreeDS.DataSet.FieldByName('CATID').AsString do i:=i+1;
Tree.Items.AddChild(Tree.Items[i], TreeDS.DataSet.FieldByName('OWNCAT').AsString);
TreeQ.Next;
end;
TreeQ.First;
for i:=0 to Tree.Items.Count-1 do
begin
Tree.Items[i].Text:=TreeDS.DataSet.FieldByName('DESCR').AsString;
TreeQ.Next;
end;
Tree.FullCollapse;
Tree.Selected:=Tree.Items[Tord];
Tree.Items.EndUpdate;
TreeBuild:=1;
t:=t-time;
ShowMessage(FormatDateTime('ss.zzz', t));
end;
Да и еще одно, я знаю что к каждому итемсу можно прикрепить идентификатор MainTree.Items[1].Data, а вот как прочитать то что я записал я не знаю, так как там хранится ссылка на мое число, я так понял
Sandman25 (2004-07-07 15:23:00) [14]Как дерево строите? Может замедление не в нем? может Вы данные из БД читаете?
Relaxxx (2004-07-07 15:18:00) [15]Заработал у меня этот компонент, но что-то увеличения скорости нет вообще, вообще возможно как-то ускорить построение дерева(строить по открытию ветки не катит, нужно вначале все дерево построить)???
Reindeer Moss Eater (2004-07-07 15:13:00) [16]Parent'oм.
Оунером может вообще никто не быть.
Sandman25 (2004-07-07 15:12:00) [17][4] TUser © (07.07.04 15:09)
ИМХО Owner'ом должна быть именно форма. Если, конечно, один экземпляр не используется на нескольких формах.
TUser (2004-07-07 15:09:00) [18]
> Вот нашол компонент, вернее просто THETreeView, он не визуальный,
> а просто пас файл
Возможно я ошибаюсь, но кажется он все-таки визуальный. А ошибку выдает потому, что в Create надо написать Application (там ведь наверняка параметр Owner стоит), а потом написать Parent:=YourForm.
Это такой вроде компонент, который обещается работает быстрее обычного? Если да, то не верь - я особого ускорения не заметил.
ЗЫ. Закройте вторую ветку.
Reindeer Moss Eater (2004-07-07 14:52:00) [19]...
My_Tree:=FastTree.THETreeView.Create(MainTree);
My_Tree.Parent := Something;
Семен Сорокин (2004-07-07 14:51:00) [20]
> Ускорить построение TreeView, как???
TreeView1.Items.BeginUpdate;
try
// построение
finally
TreeView1.Items.EndUpdate
end;