2012-04-04 24 views
0

您好我需要一些幫助來創建模板函數(因爲它們在C++中是已知的,如果我是正確的)。我正在使用Delphi XE2,並且正在使用MS Access數據庫編寫數據庫應用程序。如何在Delphi中創建泛型/模板函數

問題是,我寫了很多函數在不同的表上做同樣的事情。所以我認爲我可以創建模板函數,然後爲不同的表使用不同的參數。

例如,有一個Locate函數用於查找表或查詢中的特定記錄。現在我想爲此創建一個模板函數,但我不知道如何執行此操作。

我想提出的功能在我的數據模塊的公共部分,所以我想在這個

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; 

但這不希望編譯...

有沒有什麼辦法使某種模板函數,我可以傳遞任何表作爲參數,或者它會創建一個類爲每個單獨的表的getter一個d setter函數?

+1

這裏沒什麼通用的。你的意思是'函數TDataModule.find(tableName:TADOTable; fieldName:String; fieldValue:String):Boolean;'?注意分號而不是逗號。 – 2012-04-04 12:30:14

+0

爲什麼使用分號而不是逗號?這是我想要的,謝謝 – Japster 2012-04-04 12:42:56

+1

是的,它不是「泛型」。但只需將'find:= DataModule.tableName.Locate'更改爲'TableName.Locate'。不得不說,你應該把'tableName'參數重命名爲'table',因爲它不是它的名字,而是'TADOTable'對象。也可以使用'result:='而不是'find:=' – teran 2012-04-04 12:44:52

回答

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 2012-04-04 18:51:54

+0

換句話說,當多態性足夠時,您不需要泛型!爲什麼不把'ADOTable:TADOTable'作爲參數? – 2012-04-04 22:39:48

+0

是的,你可以使用TADOTable,但這只是一個例子。爲什麼使用LocateData。如果我設置 .Locate( 'MyField的', 'myvalue的',[])或TDataModule2.LocateData(, 'MyField的', 'myvalue的',[])的形式對我更喜歡使用設置 .Locate – Ravaut123 2012-04-05 06:49:59