4

私はテキスト操作に Delphi の TStringList を使用する傾向があるため、次のような多くのプロシージャ/関数を記述します。

var
  TempList: TStringList;
begin
  TempList:= TStringList.Create;
  try
    // blah blah blah do stuff with TempList   


  finally
    TempList.Free;
  end;
end;

このような一般的なユーティリティ クラスの作成と解放を切り取るとよいでしょう。

メソッドを含むレコードができたので、 TStringList のようなクラスをレコードにラップして、次のようにすることはできますか?

var
  TempList: TRecordStringList;
begin
  // blah blah blah do stuff with TempList   


end;
4

3 に答える 3

15

それが可能だ。必要なメソッド/オブジェクトを公開するインターフェースを作成します。

type
  IStringList = interface
    procedure Add(const s: string); // etc.
    property StringList: TStringList read GetStringList; // etc.
  end;

インターフェイスを実装し、実際にラップさせますTStringList

type
  TStringListImpl = class(TInterfacedObject, IStringList)
  private
    FStringList: TStringList; // create in constructor, destroy in destructor
    // implementation etc.
  end;

次に、レコードを実装します。

type
  TStringListRecord = record
  private
    FImpl: IStringList;
    function GetImpl: IStringList; // creates TStringListImpl if FImpl is nil
                                   // returns value of FImpl otherwise
  public
    procedure Add(const s: string); // forward to GetImpl.Add
    property StringList: TStringList read GetStringList; // forward to
                                                         // GetImpl.StringList
    // etc.
  end;

レコード内にインターフェイスがあるという事実は、コンパイラが参照カウントを自動的に処理し、コピーが作成および破棄されるときに_AddRefと_Releaseを呼び出すことを意味するため、ライフタイム管理は自動的に行われます。これは、それ自体への参照が含まれない(サイクルを作成する)オブジェクトに対して機能します。参照カウントには、参照グラフのサイクルを乗り越えるためのさまざまなトリックが必要です。

于 2009-08-01T15:44:47.520 に答える
4

幸運にも Delphi 2009 にアップグレードした場合は、スマート ポインタに関する Barry の作業を確認してください。

TSmartPointer<T: class> = record
strict private
  FValue: T;
  FLifetime: IInterface;
public
  constructor Create(const AValue: T); overload;
  class operator Implicit(const AValue: T): TSmartPointer<T>;
  property Value: T read FValue;
end;

これらは非常に優れていますが、ジェネリック メソッドと匿名メソッドが必要です。Delphi 2009にアップグレードしていない場合は、今すぐアップグレードしてください。特に彼らがBOGOスペシャルを提供している間。また、トライアル版をダウンロードするだけで、Marco のDelphi Developer Handbookを 無料で入手できます。私もすでにそのコピーを購入しました。

于 2009-08-01T19:37:43.433 に答える
2

CC ですでに実装されている別の例があります。

StringList は、値型であることを除いて、TStringList と同じです。作成、破棄、または try/finally 内に配置する必要はありません。これは、コンパイラによって行われます。これらが機能するための特別なパフォーマンスのペナルティは事実上ありません。

var 
  strings: StringList;
  astr: string;
begin
  strings.Add('test1');
  strings.Add('test2');
  aStr := string(strings);
  RichEdit.Lines.AddStrings(strings);
end;

このコードをテンプレートとして使用して、任意の TObject を値クラス タイプとしてラップできます。

公開されている TStringList のすべてがすでに含まれています。

于 2009-08-01T19:33:26.170 に答える