2、3、4などのパラメータで一連のオーバーロードされたバージョンを作成できます。例:
procedure CreateStringLists(var L1, L2: TStringList); overload;
procedure CreateStringLists(var L1, L2, L3: TStringList); overload;
procedure CreateStringLists(var L1, L2, L3, L4: TStringList); overload;
procedure CreateStringLists(var L1, L2: TStringList);
begin
L1 := nil;
L2 := nil;
Try
L1 := TStringList.Create;
L2 := TStringList.Create;
Except
FreeAndNil(L2);
FreeAndNil(L1);
raise;
End;
end;
// etc.
私がこれを行っていた場合、コードを生成するスクリプトを作成します。
私自身のコードでは、その機能の開始時にInitialiseNil(L1, L2)
、例外ハンドラではFreeAndNil(L2, L1)
と書いています。 InitialiseNil
とFreeAndNil
は非常に単純なPythonスクリプトによって生成された関数であり、再実行できるようにコメントとしてコードベースに含まれています。上で定義したCreareStringLists
のようなルーチンは、一度にすべてのルーチンを解放するルーチンがあれば役に立ちます。これは次のように記述することができます:
CreateStringLists(L1, L2);
Try
// do stuff with L1, L2
Finally
FreeAndNil(L2, L1);
End;
は最後に、私は必ずしもこれを行うだろうと言っていないんだけど、これは質問へのナイーブとの直接の答えとして意味しています。 @ T.E.D.これを行う必要性は、コードベースの深刻な問題を示唆しています。
+1私はこれをやるために自分自身を持ち込むことはできないだろうと思っていますが、タイプセーフでかなり卑劣です。 –
+1あなたは私を打つ!私は今、単純なポインタに基づいて独自の実装を持って、私はあなたの答えに気づいたときにTStringListへのポインタを使用するようにアップグレードしていた。 :) – jachguate
もちろん、例外をCreateStringListsプロシージャで認識させる必要があるので、それらのすべてが正常に作成されるか、作成されたすべてが解放されて例外的な方法でルーチンを終了します。 – jachguate