我的treeview显示分四五级,有三千多个结点,做出来的东西,打开要几分钟,查了这么久,没有查到一个关于分级加载的例子,只要到这里来哭,实在是没办法了,求求大家了。能帮一下吗大家
解决方案 »
- 如何删除OleContainer 右键菜单的功能?
- 如何让ReportBuilder能在运行时调用预先设计好的报表文件(*.rtm)?
- 何谓瘦客户端
- 怎样写向access表里插入小数,整数的SQL语句?
- 再请教一下多个控件同时控制的简单问题
- 关于AdoQuery的疑问,大家来看看
- 各位大虾,请问在delphi中怎样读取excel文件中的数据
- access表记录的排列顺序,在access中显示和通过adoTable来显示不同?
- 请问如何做一个网格形式的,而且每个格子的颜色可以自定义?!
- 网络设置问题,恳请高手指点
- 请教如何制作带箭头的splitter,实现显示隐藏,如:DreamWeaver的各个面板的伸缩
- 在线请教WebService问题
如果你是从数据库中动态生成这个treeview,在节点数量很大的情况下,速度优化不了多少的。
treeview.loadfile(application.path+'filename.txt');
function TDirectoryWindowForm.ExpandDirectoryNode( Node : TTreeNode ): Boolean;
var
JoinID : LongInt;
dwTmp : LongWord;
CNode : TTreeNode;
begin
if (Node <> nil) and (Node.Count>0) and (Node.Item[0].StateIndex<>0) then
begin
Result := TRUE;
exit;
end; if Node = nil then JoinID := 0 else JoinID := Node.StateIndex; AQ.Close;
AQ.SQL.Text:='select [ID], [FileName], [Attributes] from WordPad'
+ ' where ([RecycledTime] = 0) and ([JoinID] = ' + IntToStr( JoinID ) + ')'
+ ' order by [FileName]';
Result := AQ.Open( EmptyStr );
if not Result then exit; if Node <> nil then Node.DeleteChildren;
while not AQ.Eof do
begin
dwTmp := AQ.FieldByName( 'Attributes' ).AsInteger;
if dwTmp and WORD_ATTRIBUTE_ARCHIVE = 0 then
begin
CNode := dirTree.Items.AddChild( Node, Trim( AQ.FieldByName('Filename').AsString));
CNode.StateIndex := AQ.FieldByName( 'ID' ).AsInteger;
if ( dwTmp and WORD_ATTRIBUTE_DIRECTORY ) = 0 then
begin
CNode.ImageIndex := Image_Diskette;
CNode.SelectedIndex:= Image_Diskette;
end
else
begin
CNode.ImageIndex := Image_Directory;
CNode.SelectedIndex:= Image_Selected;
end; with dirTree.Items.AddChild( CNode, 'Empty' ) do StateIndex:= 0;
end;
AQ.Next;
end;
AQ.Close;
end;
procedure TDirectoryWindowForm.FormActivate(Sender: TObject);
begin if dirTree.Items.Count = 0 then
begin
ExpandDirectoryNode( nil );
if dirTree.TopItem <> nil then dirTree.TopItem.Selected:= TRUE;
end;end;
Node: TTreeNode; var AllowExpansion: Boolean);
begin
AllowExpansion := ExpandDirectoryNode( Node );
end;