2012-03-15 38 views
4

AFAIK前記レコードが一般的な構造になっている場合、レコードメンバーに値を直接割り当てることはできません。持っ例えばDelphi XEでジェネリックスのレコードメンバーを効率的に変更

、:

var 
    ... 
    temp: TMyRec; 
    ... 

begin 
    ... 
    temp:=myList[999]; 
    temp.Width:=1000; 
    myList[999]:=temp; 
    ... 
end; 

醜い、ゆっくりと、しかし作品:

type 

TMyRec = record 
    Width: integer; 
    Height: integer; 
end; 

var 
    myList: TList<TMyRec>; 


... 
    myList[888].Width:=1000; //ERROR here: Left side cannot be assigned. 
... 

は今まで、私はこれを克服するために、一時的な変数を使用していました。しかし、今、私はTMyRecに動的配列を追加したい:

type 
    TMyRec = record 
    Width: integer; 
    Height: integer; 
    Points: array or TPoint; 
    end; 

を...または一時変数に前後にコピーそれほど大きくなったことができ、他のデータ構造は、実現可能な選択肢ではありません。

質問:このレコードが一時的なvarにコピーする必要のない一般的な構造になっている場合、レコードのメンバーを変更するにはどうすればよいですか?

フィードバック対象製品

+0

は、あなたが '' PMyRec'がTMyRec' 'へのポインタである' TListの 'としてmyList'を宣言することができます書くことができますか?この方法では、コピーせずに直接データを使用できます。 – teran

+2

@teranこれは、リストとは別のストレージを管理する必要があるため、不便です。私はTList <>のように動作する自分のクラスを作成しましたが、i番目の要素へのポインタを返すプロパティを持っています。それは確かに動作しますが、明らかに組み込まれていません。 –

答えて

6

ダイナミックアレイ変数は、アレイへの単なる参考情報です。レコードには単一のポインタとして格納されます。したがって、過剰なコピーをせずに現在の方法を続けることができます。要素を一時変数にコピーすると、配列への参照のみがコピーされ、配列の内容はコピーされません。さらに、配列の項目に代入する場合は、コピーを一切必要としません。

myList[666].Points[0] := ... 

本当に大きなレコードがある場合は、レコードではなくクラスを使用する方がよいでしょう。クラスのインスタンスは参照であるため、上記と同じ引数が適用されます。このアプローチでは、TObjectList <>〜TList <>を好むかもしれません。 TObjectList <>の利点は、OwnsObjectsプロパティをTrueに設定して、そのメンバーがメンバーを破棄するようにすることができることです。

その後、

var 
    myList: TObjectList<TMyClass> 
.... 
myList[666].SomeProp := NewValue; 
+0

..しかし、もし彼が外部のDLLにデータを渡したければ、インターフェースを持たないクラスを使うのは受け入れられません。 – teran

+4

@teran Whoa、DLLはどこに入ってきますか?また、この新しい新しい制約は、レコード内のTList <>と動的配列を排除します。 –

+3

+1しかし、あなたが使用した配列インデックスは、私が常に疑っているものをクリアします...