2012-04-04 7 views
0

こんにちはテンプレートの関数を作成する際に助けが必要です(正しい場合はC++で知られています)。私はDelphi XE2を使用していますが、MS Accessデータベースを使用してデータベースアプリケーションを作成しています。Delphiでジェネリック/テンプレート関数を作成するには

問題は、別のテーブルで同じことをする多くの関数が書かれていることです。だから、私はテンプレート関数を作成して、異なるテーブルに対して異なるパラメータを使うことができると思った。

たとえば、テーブルまたはクエリ内の特定のレコードを特定する関数があります(Locate)。今私はこれのテンプレート関数を作りたいと思いますが、これを行う方法はわかりません。

私は私のDataModuleの公共のセクションで関数を置きたいので、私はこの

function find(tableName: TADOTable, fieldName: String, fieldValue: String):Boolean 

その後...

function TDataModule.find(tableName: TADOTable, fieldName: String, fieldValue:String): Boolean; 
var SearchOptions : TLocateOptions; 
begin 
    SearchOptions := [loCaseInsensitive]; 
    find := DataModule.tableName.Locate('fieldName', fieldValue, SearchOptions); 
end; 

しかし、これはしたくないのラインで考えていましたコンパイル...

それは、私はパラメータとして任意のテーブルを渡すことができる何らかの種類のテンプレート関数を作成するための方法は、それはゲッターを使用してすべての単一のテーブルのクラスを作成する方が良いdセッター機能?

+1

ここには何もありません。あなたは 'function TDataModule.find(tableName:TADOTable; fieldName:String; fieldValue:String)を意味しますか?カンマではなくセミコロンに注意してください。 –

+0

なぜカンマではなくセミコロンを使用しますか?私が欲しかったのは、 – Japster

+1

はい、それは「ジェネリック」ではありません。しかし、 'find:= DataModule.tableName.Locate'を' TableName.Locate'に変更するだけです。 'tableName'の名前を' table'に変更する必要があります。これは、その名前ではないので 'TADOTable'オブジェクトです。また、 'find:='の代わりに 'result:='を使用してください。 – teran

答えて

0
function TDataModule2.LocateData(AADOTable: String; AKeyFields: String; 
    AKeyValues: Variant; Options: TLocateOptions): Boolean; 
var 
    oComp: TComponent; 
begin 
    Result := False; 
    oComp := FindComponent(AADOTable); 
    if (oComp is TADOTable) and (oComp as TADOTable).Active then 
    Result := (oComp as TADOTable).Locate(AKeyFields, AKeyValues, Options); 
end; 
+0

私はあなたのコードを簡素化しなければならなかった:-) – TLama

+0

言い換えれば、多相性が十分であるときにジェネリックスは必要ありません!なぜ単にパラメータとして 'ADOTable:TADOTable'を持たないのでしょうか? –

+0

はい、TADOTableを使用できますが、これは単なる例です。 LocateDataを使用する理由私がを設定するのが好きな書式で .Locate( 'MyField'、 'MyValue'、[])またはTDataModule2.LocateData(、 'MyField'、 'MyValue'、[])を設定した場合.Locate – Ravaut123

関連する問題