如何用动态数据结构定义TVirtualStringTree

我想动态加载并显示到一个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 (例如AsStringAsInteger )。 将节点初始化时,也将其他字段分配为内存? 另外我不喜欢DataType被分配给每个节点的事实。 必须有一个简单的方法来优化此记录。

请一些建议。


当我需要做这样的事情时,我在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。 在Format语句中实现'const of'变量数组时,Delphi使用开放数组TVarRec。

您可能只需要VirtualStringTree中的两列。 一个用于类型和其他值(表示为一个字符串)

链接地址: http://www.djcxy.com/p/35031.html

上一篇: How to define a TVirtualStringTree with dynamic data structure

下一篇: VirtualStringTree lock column 0