【发布时间】:2016-04-16 19:42:21
【问题描述】:
我想动态加载并显示到TVirtualStringTree,来自一些不同的SQL 表的数据。这意味着每列的标题和内容每次都会包含不同类型的数据。
我的问题是如何优化内存使用、记录的定义和这种情况下的指针。
我的想法是这样做:
type
TDataType = (dtUnknown, dtString, dtInteger, dtText, dtFloat, dtDateTime, dtDate, dtTime, dtBoolean);
TData = record
DataType: TDataType;
AsString: String;
AsInteger: Integer;
AsText: TStrings;
AsWord: Word;
AsDateTime: TDateTime;
AsDate: TDate;
AsTime: TTime;
AsBoolean: Boolean;
end;
TTreeData = array of TData;
PTreeData= ^TTreeData;
实际上,记录中只有两个字段包含数据:DataType(一直)和第二个字段,取决于定义的DataType(例如AsString、AsInteger)。初始化 Node 时,其他字段也会分配为内存吗?我也不喜欢DataType 分配给每个节点的事实。必须有一种简单的方法来优化此记录。
请给点建议。
【问题讨论】:
-
我很确定该组件已经有了数据感知后代。你有没有找过那个?它可能比尝试自己重新发明该功能更有效。
-
这是 VTV 的数据感知版本:github.com/TurboPack/VirtualTreeView
-
它是数据感知的吗?我在这里只能看到通常的 TVirtualStringTree/TVirtualDrawTree,没有新组件,也没有新属性。
-
很久以前有人做出了贡献 - 但我记得它从来没有维护过
-
您可以使用 TValue 数据类型 - docwiki.embarcadero.com/Libraries/XE2/en/System.Rtti.TValue(也有许多优化的 3rd 方实现,例如
TOmniValue)。同样对于较旧的 Delphi,您可以使用Variant数据类型 docwiki.embarcadero.com/RADStudio/Seattle/en/Variant_Types
标签: delphi memory virtualtreeview tvirtualstringtree