delphi – 如何将方法类型作为参数传递?
发布时间:2020-12-15 09:15:27 所属栏目:大数据 来源:网络整理
导读:我想传递事件类型,如TNotifyEvent或TKeyPressEvent. 如何声明方法参数来接受这些类型? procedure RegisterEventType(AEventType: ???) 这样编译: RegisterEventType(TNotifyEvent)RegisterEventType(TKeyPressEvent) 指出TKeyPressEvent和TNotifyEvent明显
我想传递事件类型,如TNotifyEvent或TKeyPressEvent.
如何声明方法参数来接受这些类型? procedure RegisterEventType(AEventType: ???) 这样编译: RegisterEventType(TNotifyEvent) RegisterEventType(TKeyPressEvent) 指出TKeyPressEvent和TNotifyEvent明显不同: TNotifyEvent = procedure(Sender: TObject) of object; TKeyPressEvent = procedure(Sender: TObject; var Key: Char) of object; 所以它不是我要传递的事件实例,它是类型. 为了给出一些上下文,这是实现: procedure RegisterEventType(AEventType: ???; AFactory: TRedirectFactory) var vTypeInfo: PTypeInfo; begin vTypeInfo := TypeInfo(AEventType); Assert(vTypeInfo.Kind = tkMethod); vTypeInfo.Name <------ contains string 'TNotifyEvent' SetLength(fFactories,Length(fFactories)+1); fFactories[High(fFactories)].EventType := vTypeInfo.Name; fFactories[High(fFactories)].Factory := AFactory; end; context:TRedirectFactory创建一个实现TNotifyEvent的IEventRedirect实例,用于重定向表单上的事件处理程序.每种支持的事件类型都有一个实现(TNotifyEvent,TKeyPressEvent …). 因此,目的是不传递字符串’TNotifyEvent’,而是实际类型TNotifyEvent. 解决方法
像hvd建议的那样,如果您的Delphi版本支持,可以使用Generics,例如:
type TEventTypeRegistrar<T> = class public class procedure Register(AFactory: TRedirectFactory); end; class procedure TEventTypeRegistrar<T>.Register(AFactory: TRedirectFactory); var vTypeInfo: PTypeInfo; begin vTypeInfo := TypeInfo(T); Assert(vTypeInfo.Kind = tkMethod); SetLength(fFactories,Length(fFactories)+1); fFactories[High(fFactories)].EventType := vTypeInfo.Name; fFactories[High(fFactories)].Factory := AFactory; end; TEventTypeRegistrar<TNotifyEvent>.Register(...); TEventTypeRegistrar<TKeyPressEvent>.Register(...); 或者: type TEventTypeRegistrar = class public class procedure Register<T>(AFactory: TRedirectFactory); end; class procedure TEventTypeRegistrar.Register<T>(AFactory: TRedirectFactory); var vTypeInfo: PTypeInfo; begin vTypeInfo := TypeInfo(T); Assert(vTypeInfo.Kind = tkMethod); SetLength(fFactories,Length(fFactories)+1); fFactories[High(fFactories)].EventType := vTypeInfo.Name; fFactories[High(fFactories)].Factory := AFactory; end; TEventTypeRegistrar.Register<TNotifyEvent>(...); TEventTypeRegistrar.Register<TKeyPressEvent>(...); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Groovy轻松入门-通过与Java的比较,迅速掌握Groovy
- java – Spring中的内部bean是什么?
- delphi – 将数据库中的RTF文本加载到TRichEdit中
- [bigdata-022] hive和impala的对hbase的精细order by操作
- LUA中调用C
- Introducing the Knowledge Graph: things, not strings【阅
- DRF 版本和认证
- delphi – 为什么我应该使用TCollections.CreateList而不是
- delphi – 如何获取导致TDBGridInplaceEdit错误的值?
- perl – 使用Plack处理多个文件上传