2017-08-13 14 views
10

エキスパートデルファイの本を読む私は理解できない何かを発見しました。これまでのところは良いデルファイのインターフェイスが参照カウントされていません

type 
    TDMToDo = class(TDataModule, IToDoData) 
    // ... other code ... 
    public 
    // IToDoData 
    function ToDoCreate(aValue: TToDo): integer; 
    function ToDoRead(id: integer; out aValue: TToDo): boolean; 
    function ToDoUpdate(aValue: TToDo): boolean; 
    function ToDoDelete(id: integer): boolean; 
    procedure ToDoList(aList: TToDos); 
    end; 

が、彼はのdidnをことに注意してください。そして、彼はDataModuleを使用して、このように上記のインターフェイスを実装することを決定した

IToDoData = interface //CRUD 
    function ToDoCreate(aValue: TToDo): integer; 
    function ToDoRead(id: integer; out aValue: TToDo): boolean; 
    function ToDoUpdate(aValue: TToDo): boolean; 
    function ToDoDelete(id: integer): boolean; 
    procedure ToDoList(aList: TToDos); 
    end; 

:著者はこのコードのユニットを作成しました'tを入力してください。TInterfacedObjectここではAddRefなどのメソッドはありません。私の推測では、上記のコードは問題ありませんが、try ... finallyブロックの中に組み込む必要があります。

メインフォーム(データモジュールユニットは、コースの使用句である)このような機能がある場合:

function TFormToDo.GetToDoData: IToDoData; 
begin 
    if DMToDo = nil then 
    DMToDo := TDMToDo.Create(Application); 
    Result := DMToDo; 
end; 

上記のコードは、このようなコードを書くことを可能にする:

begin 
    GetToDoData.ToDoList(FToDos); 

    ListView1.BeginUpdate; 
    try 
    //populate the list 
    finally 
    ListView1.EndUpdate; 
    end; 
end; 

これはメモリリークを引き起こしませんか?少なくとも窓に。私はデルファイの新人だから失敗するかもしれないが、AndroidとIOにはARCがあるのでオンラインで読んでいるので、心配する必要はありません。

WindowsにはARCがありませんので、TInterfacedObject(ここにはありません)などの実装がない限り、try ...を使用する必要があります。それは間違いですか?


このアプリは、あなたのメモを書き込む/読む/保存するToDoアプリに関するものです。データモジュールにはFireDACアクセスコンポーネントがあり、インターフェイスメソッドはdbにアクセスするために使用されます。これは、UIとDBの内容を分離するためです。

+0

です。何か言いたいことは、それはマドリッドの恐ろしい天気です:) – Victoria

+0

@Victoria same here slad;) –

答えて

15

TDataModuleしかし、TComponent基準は無効とコンポーネントは、手動または非ARCコンパイラの所有権モデルを介して管理されているカウントたTComponent子孫され、そしてTComponentIInterfaceと関連する参照カウント方法

TComponent = class(TPersistent, IInterface, IInterfaceComponentReference) 

を実現します。

具体的には、TComponentは、Windows COMオブジェクトのラッパーとして機能しない限り、参照カウントを無効にしています。ここではそうではありません。

TComponent子孫の所有権を管理することができない場合は、DisposeOfでリリースする必要があるため、ARCコンパイラでは手動管理(実際は自動管理)には少し複雑です。

TComponent従来のコンパイラの参照カウントに関する動作がTInterfacedObjectとは異なります。

上記のケースでは、Applicationがそのデータモジュールを所有し、すべてのコンパイラでデータモジュールの有効期間を適切に管理するため、リークはありません。


try... finallyブロックは、メモリ管理のためにそこにはありませんが、あなたはすべてのコンパイラでtry...finallyを残しているBeginUpdate... EndUpdateを保護するために。

+0

TInterfacedObjectを追加するのは間違いか、何か特別なことでしょうか? –

+0

'TInterfacedObject'はどこに置くのですか?あなたは1つのクラスから継承することができ、それはここでは 'TDataModule'です。 –

+0

ありがとう:)ありがとうございます:)データモジュールはすでに私にそれが確かめる必要があることを私に与えています –

関連する問題