delphi – 我可以使用泛型对相似类型的控件执行相同的操作吗?
发布时间:2020-12-15 04:18:39 所属栏目:大数据 来源:网络整理
导读:我正在使用Delphi 2010,我有一个单元,多年来我添加了自己的程序和功能,可以用于我所做的任何项目,例如: function ListBoxIsSelected(ListBox: TListBox): Boolean;begin Result:= ListBox.ItemIndex -1;end; 以上使用TListBox作为参数,因此无论何时使用上述
我正在使用Delphi 2010,我有一个单元,多年来我添加了自己的程序和功能,可以用于我所做的任何项目,例如:
function ListBoxIsSelected(ListBox: TListBox): Boolean; begin Result:= ListBox.ItemIndex <> -1; end; 以上使用TListBox作为参数,因此无论何时使用上述函数,我都必须提供TListBox类的列表框. 现在假设我有一些其他组件库可以使用相同的函数,例如Jedi组件类. 当Jedi列表框是TJvListBox类并且我的函数正在寻找TListBox类时,我怎么能使用上面的函数?虽然两个组件实际上是相同的,但类名是不同的.如果我专门为TJvListBox提供了相同的功能,它可能会起作用,因为它们都是“列表框”: function ListBoxIsSelected(ListBox: TJvListBox): Boolean; begin Result:= ListBox.ItemIndex <> -1; end; 现在,我需要将组件作为参数传递,以相同的方式编写完整的过程和函数.只是为了使用不同的组件类而不得不重写它们是不可行的! 我怎么能用泛型写这个? 解决方法
你不能用泛型来编写它,除非你的目标类当然都来自同一个基类. (但那时你不需要泛型.)
如果你真的想要一些东西可以检查任何对象上的ItemIndex属性<>但是,您可以使用不同的Delphi 2010功能:扩展RTTI. uses SysUtils,RTTI; function IsSelected(item: TObject): boolean; var context: TRttiContext; cls: TRttiType; prop: TRttiProperty; ItemIndex: integer; begin if item = nil then raise Exception.Create('Item = nil'); context := TRttiContext.Create; cls := context.GetType(item.ClassType); prop := cls.GetProperty('ItemIndex'); if prop = nil then raise Exception.Create('Item does not contain an ItemIndex property.'); ItemIndex := prop.GetValue(item).AsInteger; result := ItemIndex <> -1; end; 但是要小心.这里没有编译时类型检查,这个过程明显慢于原始例程.你可能不会注意到它,但是如果你在紧密的循环中调用这样的东西,它会减慢速度. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |