procedure of object; 有什么功能?(新手)

L3nnon 2010-08-26 05:23:19
TMyEvent = procedure of object; <---它。

它是不是和以下有链接?
FOnHundred: TMyEvent;

procedure SetOnHundred1;
procedure SetOnHundred2;
property OnHundred: TMyEvent read FOnHundred write FOnHundred;
...全文
385 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
L3nnon 2010-09-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 goodhj 的回复:]

最简单的解释:根据英文意思你就知道了啊,procedure of object(一个对象的过程)。5楼和7楼的解释好好看看
[/Quote]

茅塞顿开。。 谢啦。。
goodhj 2010-09-14
  • 打赏
  • 举报
回复
最简单的解释:根据英文意思你就知道了啊,procedure of object(一个对象的过程)。5楼和7楼的解释好好看看
L3nnon 2010-09-14
  • 打赏
  • 举报
回复
唔唔。。
但还是很模糊。。
关于

type
TMyEvent = procedure of object;


>.<;; 希望有更简单的解释。。
谢谢。。
wxieyang 2010-09-01
  • 打赏
  • 举报
回复
type
TMyEvent = procedure of object;
这是一种数据类型的定义,他定义了一个可以在类中使用的函数类型
区别于
type
TMyProc = procedure;

TMyEvent 和 TMyProc 都定义了一个函数类型,他们的差别是,TMyProc 不可以用在类中定义事件,TMyEvent 却可以。

如果你想知道问什么,那就需要深入了解事件类型以及函数类型到底是个什么?

procedure a();
begin
ShowMessage()
end;

var
Func1: TMyProc;
Func2: TMyEvent;

func1 := A;

func1 := A;

这句到底发生了什么事情呢?

在32位的windows操作系统中,任何一个进程被执行,操作系统要完成的工作基本上包括:为这个进程开辟一个线性的虚拟地址表(从$00000000到$FFFFFFFF),然后把exe程序加载到这个地址表对应的内存中,然后跳入到exe程序的入口点,剩下的事情,就是exe自己从入口点开始一步一步干自己的事情了。
程序中,所有的函数都被编译到固定的位置,也就是每个函数都有一个地址与之对应,对函数的调用,实际上就是在寄存器或者堆栈中准备好参数,然后跳入到函数对应的地址继续执行。
func1 := A;
这个动作,完成的就是把函数A的地址赋值给func1这个变量。


那么,为Func2: TMyEvent 赋值又是完成了什么呢?

类中的函数也是有地址的,编译后,类中的函数也会被编译到一个固定的地址上。
但是,func2不是表示一个函数地址,他是一个记录类型的变量
这个可以通过 SizeOf(TMyEvent) 看到 SizeOf(TMyEvent) 返回值是8,而SizeOf(TMyProc)返回的是4
实际上,TMyEvent类型是包含两个域的一个记录,其中一个域是Code,也就是和TMyProc一样的,另一个域是Data,他保存着一个对象。

Button2.OnClick := Button1Click;
这样的赋值,实际上是将窗体类的对象form1给data域,将Button1Click这个函数的地址给Code域
SeaSon_Lang 2010-08-30
  • 打赏
  • 举报
回复
1.
TMyEvent = procedure of object; TMyEvent 是方法类型 就等于 String 是一种数据类型

如在一个Txxx类中定义了一个过程
procedure Txxx.test;
begin
showmessage('1');
end;

那么就可以把 Txxx.test 赋给 TMyEvent 了 (TMyEvent := Txxx.test);
因为 TMyEvent 的定义中有 of object 所以赋值给它的只能是类中的过程,而不能是普通过程。

2.
FOnHundred: TMyEvent; --> FOnHundred 是一个变量 它的类型是 TMyEvent,
就等于 icount : integer 这么简单

3.
property OnHundred: TMyEvent read FOnHundred write FOnHundred

OnHundred 是一个属性 它的类型也是 TMyEvent 通过 FOnHundred 变量来存取 这个属性的值。

当属性不用过程去存取的时候 (如上例)调用 OnHundred 和 FOnHundred 是相同的
L3nnon 2010-08-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 season_lang 的回复:]

1.
TMyEvent = procedure of object; TMyEvent 是方法类型 就等于 String 是一种数据类型

如在一个Txxx类中定义了一个过程
procedure Txxx.test;
begin
showmessage('1');
end;

那么就可以把 Txxx.test 赋给 TMyEvent 了 (TMyEvent := Txxx……
[/Quote]

谢谢,你的详细的解释。。
万分感激。。
L3nnon 2010-08-29
  • 打赏
  • 举报
回复
经过我研究了三天三夜,已经明白了很多。。
谢谢大家的用心,万分感激大家的无私。
L3nnon 2010-08-26
  • 打赏
  • 举报
回复
我就觉得奇怪,为什么属性里有隐藏式Boolean 值。。
kye_jufei 2010-08-26
  • 打赏
  • 举报
回复
1.SetOnHundred1 和 SetOnHundred2估計是自定議的過程名,類型是TMyEvent;
2.OnHundred是一個處理函數的屬性;
3.FOnHundred是OnHundred對應的成員......
亮剑_ 2010-08-26
  • 打赏
  • 举报
回复
当然有联系。
OnHundred 就是事件处理函数,实际是一个属性
FOnHundred 是该属性对应的成员
类型是 TMyEvent,实际是一个过程/函数,没有参数

SetOnHundred1 和 SetOnHundred2 过程从命名上看一般就是用作 FOnHundred 的写方法,但由于没有相应代码且并没有指明 OnHundred 属性的 read write 方法,不好判定
本门课程是带大家进入微服务领域入门的课程,很适合新手小白学习的课程。1: 什么是rpc?RPC(Remote Procedure Call)是函数对函数的远程调用,传输协议tcp,http,主要是基于xml,json序列化协议(这里的序列化协议是对数据编解码的方式),项目中我们真正用到的是grpc,grpc是一个框架,基于http2.0的长链接,性能有所改进,重要的是grpc用的是Google开源的protobuf序列化协议,它比json,xml性能更快,在压缩数据方面也更小。总之我们选择grpc最主要的有两点:1:支持跨语言开发(如python,golang,java)2:  grpc首先是一个框架,封装rpc,让程序员只关注代码逻辑即可 2: 为什么用grpc,而不用flask,django,tornado,即http协议?1:http的调用是根据url的(即restful),它跟rpc的调用最大的区别就是这里,rpc的调用,你就像调用一个本地函数一样简单,而且微服务,分布式也是从rpc开始的,学好rpc对以后做好分布式会更有帮助,其实go语言和python语言里都有rpc(如xmlrpc,jsonrpc,zerorpc),我们之所以学习go语言里的rpc是因为go语言的rpc相对更加灵活,go语言本身也支持高并发,这一点对于分布式来说更好。2:其次http协议,用过flask框架的人都知道,请求一次数据后就断开,而grpc基于http2.0,它不但可以保持长链接,传输效率也更高,使用方面,因为http2.0相当于tcp一样使用,现在很多大厂也都开始用http2.0了。http2.0相比http的优势很明显,头部压缩,分流,针对tcp的多路复用。所以基于http2.0的grpc无论从生态和性能方面都更好。 这张图是一个gRPC相关的架构图,同学们可以通过这张图了解gRPC在项目中的使用。

5,515

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧