【问题标题】:How to make a generic/template function in Delphi如何在 Delphi 中制作通用/模板函数
【发布时间】:2012-04-04 12:25:46
【问题描述】:

您好,我在创建模板函数时需要一些帮助(如果我是正确的,它们在 c++ 中是已知的)。我正在使用 Delphi XE2,并且正在使用 MS Access 数据库编写数据库应用程序。

问题是我写的很多函数在不同的表上做同样的事情。所以我认为我可以创建模板函数,然后为不同的表使用不同的参数。

例如,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 和 setter 函数为每个表创建一个类会更好吗?

【问题讨论】:

  • 这里没有通用的。你的意思是function TDataModule.find(tableName: TADOTable; fieldName: String; fieldValue:String): Boolean;?注意分号而不是逗号。
  • 为什么使用分号而不是逗号?这是我想要的,谢谢
  • 是的,它不是“泛型”。但只需将find := DataModule.tableName.Locate 更改为TableName.Locate。不得不说,你应该将tableName参数重命名为table,因为它不是它的名字,它是TADOTable对象。也使用result := 而不是find :=
  • 想要使用什么标点符号是无关紧要的。您必须使用语言允许的内容。这意味着分号。
  • 感谢您解释逗号和分号的区别。我同意,我宁愿使用表而不是表名。感谢您的帮助

标签: delphi templates delphi-xe2


【解决方案1】:
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;

【讨论】:

  • 换句话说,当多态性足够时,你就不需要泛型了!为什么不只将ADOTable:TADOTable 作为参数?
  • 是的,您可以使用 TADOTable,但这只是一个示例。为什么使用 LocateData。如果我设置 .Locate('MyField','MyValue',[]) 或 TDataModule2.LocateData(, 'MyField','MyValue',[]) 在我更喜欢用来设置 .定位
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-27
  • 1970-01-01
  • 2018-06-02
  • 2022-08-16
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
相关资源
最近更新 更多