0

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;

実際には、レコードの 2 つのフィールドのみにデータが含まれます: DataType(常に) および 2 番目のフィールドは、DataType定義によって異なります (例: AsString) AsInteger。ノードが初期化されるときにメモリとして割り当てられる他のフィールドもですか? DataTypeまた、各ノードに割り当てられているという事実も好きではありません。このレコードを最適化する簡単な方法が必要です。

いくつかの提案をしてください。

4

1 に答える 1

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 をご覧ください。Delphi は、Format ステートメントで「const の配列」変数 ans を実装するときに、オープン配列 TVarRec を使用します。

おそらく、VirtualStringTree に必要な列は 2 つだけです。1 つは型用で、もう 1 つは値 (文字列として表される) 用です。

于 2016-04-17T05:08:10.510 に答える