gpt4 book ai didi

delphi - 我可以使用泛型对类似类型的控件执行相同的操作吗?

转载 作者:行者123 更新时间:2023-12-03 14:51:56 25 4
gpt4 key购买 nike

我正在使用 Delphi 2010,并且我有一个单元,多年来我在其中添加了自己的过程和函数,这些过程和函数可以用于我所做的任何项目,例如:

function ListBoxIsSelected(ListBox: TListBox): Boolean;
begin
Result:= ListBox.ItemIndex <> -1;
end;

上面使用 TListBox 作为参数,因此每当使用上述函数时,我必须提供一个 TListBox 类的 listbox

现在假设我有一些其他组件库可以使用相同的功能,例如 Jedi 组件类。

当 Jedi listboxTJvListBox 类并且我的函数正在寻找 TListBox 类时,我如何使用上述函数?尽管两个组件实际上相同,但类名不同。如果我专门为 TJvListBox 提供相同的函数,它可能会起作用,因为它们都是“列表框”:

function ListBoxIsSelected(ListBox: TJvListBox): Boolean;
begin
Result:= ListBox.ItemIndex <> -1;
end;

现在,我已经以相同的方式编写了全部过程和函数,我需要将组件作为参数传递。仅仅为了使用不同的组件类而必须再次重写它们是不可行的!

我如何用泛型来编写这个?

最佳答案

你不能用泛型来编写它,除非你的目标类都来自同一个基类。 (但是这样你就不需要泛型了。)

如果您确实想要检查任何对象<> -1上的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;

不过要小心。这里没有编译时类型检查,并且此过程比原始例程慢得多。您可能不会注意到它,但如果您在紧密循环中调用类似的东西,它会减慢速度。

关于delphi - 我可以使用泛型对类似类型的控件执行相同的操作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5889599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com