我想从一些不同的SQL表中动态加载并显示成TVirtualStringTree
数据。这意味着每个列的标题和内容将包含每次不同类型的数据。
我的问题是如何针对内存使用情况,记录的定义以及此案例的指针进行优化。
我的想法就是这样做:
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;
实际上,记录中只有2个字段包含数据:DataType
(始终)和第二个字段,取决于DataType
定义的数据(例如AsString
,{{1 }})。当Node初始化时,还会将其他字段分配为内存吗?另外,我不喜欢将AsInteger
分配给每个节点的事实。必须有一种简单的方法来优化此记录。
请一些建议。
答案 0 :(得分:0)
当我需要做这样的事情时,我在TData记录中使用了一个case语句。
像
这样的东西type
TData = record
case DataType: TDataType of
dtUnknown:
(AsUnknown: ???);
dtString:
(AsString: string); // this is incorrect, string (and some others are not allowed)
dtInteger:
(AsInteger: Integer);
... and so on
end;
end;
http://docwiki.embarcadero.com/RADStudio/Seattle/en/Structured_Types#Variant_Parts_in_Records
看看TVarRec。在实现const'数组时,Delphi使用开放式数组TVarRec。变量ans在Format语句中。
您可能只需要VirtualStringTree中的两列。一个用于类型,另一个用于值(表示为字符串)