【问题标题】:How to define a TVirtualStringTree with dynamic data structure如何定义具有动态数据结构的 TVirtualStringTree
【发布时间】: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(例如AsStringAsInteger)。初始化 Node 时,其他字段也会分配为内存吗?我也不喜欢DataType 分配给每个节点的事实。必须有一种简单的方法来优化此记录。

请给点建议。

【问题讨论】:

标签: delphi memory virtualtreeview tvirtualstringtree


【解决方案1】:

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

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

【讨论】:

  • @Arioch 您的编辑,在变体部分之前添加DataType: TDataType 作为单独的字段不正确。它不是必需的,当然不能与 tag: ordinalType 部分相同。我会删除它。
  • @Greme 关于记录变体部分的数据类型:类型不能是长字符串、动态数组、变体(即Variant类型)、接口,也不能是包含长字符串、动态数组、变体或接口的结构化类型;但它们可以是指向这些类型的指针。 Ref.文档。 IOW,AsString: string 无效。
  • @TomBrunberg 如果你删除了变量Datatype,那么你就没有它,最好不要在case 中使用它,以保持代码干净case TDataType of...。但更重要的是,topicstarter 的结构是“标记记录”——就像 DFM 或 EMBL 记录一样,它以类型标记开始,而尾部取决于类型。您的结构是“随机记录”,它没有类型标记。当 topicstarter 解析他的数据流时,他会读取TDataType 标签,然后分支到记录的其余部分。当您解析时,您必须调用 random(High(TDatatype) 来解析流。
  • @Arioch'The 来自文档:标签(如果有的话)在记录的非变体部分充当额外字段(类型为 ordinalType)。 这就是您添加相同字段会产生错误的原因。具体来说,再次注意tag 变量是可选的并且经常被省略,但如果它在您编辑之前就已经存在,那么它与您添加的目的相同。所以没有“随机记录”,DataType 字段存在并告诉记录代表什么类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-09
  • 2021-01-26
  • 2018-05-04
  • 1970-01-01
  • 1970-01-01
  • 2019-04-20
  • 1970-01-01
相关资源
最近更新 更多