(delphi11最新学习资料) Object Pascal 学习笔记---第10章第3节( 委托的概念)

10.3.2 委托的概念

​ 乍一看,委托这项技术的目标可能并不明确,但它却是Object Pascal 组件技术的基石之一。秘密就在委托这个词上。如果有人创建了一个对象,这个对象有一些方法指针,那么你只需把新的方法赋值给这些指针,就可以自由地改变这个对象的行为。听起来耳熟吗?是的,应该很熟悉。

​ 当你为一个按钮添加 OnClick 事件处理器时,开发环境也正是这样做的。按钮有一个名为 OnClick 的方法指针,你可以直接或间接地将窗体的一个方法赋值给它。当用户点击按钮时,这个方法就会被调用,即使你是在其他类(通常是窗体)中定义了这个方法。

​ 下面列出了 Delphi 库中实际用于定义按钮组件的事件处理程序和窗体的相关方法的代码:

type
TNotifyEvent = procedure(Sender: TObject) of object;TMyButton = classOnClick: TNotifyEvent;
end;TForm1 = class(TForm)procedure Button1Click(Sender: TObject);Button1: TMyButton;
end; var
Form1: TForm1;

​ 现在,在过程中,你能这么编写代码:

MyButton.OnClick := Form1.Button1Click;

​ 这段代码与库代码真正唯一的区别在于,OnClick 是一个属性名称,而它实际所引用的数据称为FOnClick。事实上,显示在对象检查器 "事件 "页面中的事件只不过是一个方法指针属性。举例来说,这意味着你可以在设计时动态修改附加到组件上的事件处理程序,甚至可以在运行时创建一个新组件并为其分配一个事件处理程序。

DynamicEvents 示例展示了这两种情况。窗体中有一个按钮,按钮关联了一个标准的 OnClick 事件处理器。不过,我在窗体中又添加了具有相同签名(相同参数)的public方法:

publicprocedure BtnTest2Click(Sender: TObject);

​ 当按钮被按下时,除了显示一个消息外,还把事件处理器切换到第二个,改变了这个点击操作以后的行为。

procedure TForm1.BtnTestClick(Sender: TObject);
beginShowMessage('Test message');BtnTest.OnClick := BtnTest2Click;
end;procedure TForm1.BtnTest2Click(Sender: TObject);
beginShowMessage('Test message, again');
end;

​ 现在,当你第一次点击按钮时,第一个(默认)事件处理程序就会被执行,而接下来的所有点击都会触发第二个事件处理程序。

注意 当您键入代码将方法赋值给事件时,IDE的"代码自动完成 "会向您推荐可用的事件名称,并将其转化为实际的函数调用,在末尾加上括号。这是不正确的。您必须将方法本身赋值给事件,而不是调用它。否则,编译器会尝试赋值方法调用的结果(作为一个过程,它并不存在),从而导致错误。

​ 项目的第二部分演示了一个完全的动态事件关联。当您点击窗体的表面时,会动态创建一个新按钮,该按钮的事件处理程序会显示关联按钮的标题(Sender 对象将指向调用事件处理程序动态创建的按钮):

procedure TForm1.BtnNewClick(Sender: TObject);
beginShowMessage('You selected ' + (Sender as TButton).Text);
end;procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Single);
varAButton: TButton;
beginAButton := TButton.Create(Self);AButton.Parent := Self;AButton.SetBounds(X, Y, 100, 40);Inc(FCounter);AButton.Text := 'Button' + IntToStr(FCounter);AButton.OnClick := BtnNewClick;
end;

​ 由于使用了事件的Sender参数,即使只使用一个事件处理程序,每个动态创建的按钮也会对鼠标点击做出反应,显示与按钮相关的信息。输出示例见图 10.1。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/4296.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[移动端] “viewport“ content=“width=device-width, initial-scale=1.0“ 什么意思

布局视口, 代码如下 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>Document</title><style>body,html {margin: 0;padding: 0;}.box {width: 200px;height: 200px;background-color: pi…

数据库基础:理解与应用索引与视图

文章目录 前言 索引视图 前言 数据库管理涉及索引、视图。本基础篇不涵盖索引和视图的高级应用和核心概念。 索引 MySQL索引是提高查询性能的数据结构&#xff0c;类似于书籍目录&#xff0c;帮助数据库快速找到数据行&#xff0c;避免全表扫描。索引可应用于单列或多列&a…

vue 项目关于不同分辨率的电脑网页适配方案

流式布局&#xff1a;这是一种相对灵活的布局方式&#xff0c;页面的元素宽度使用相对宽度&#xff08;例如百分比&#xff09;来定义&#xff0c;而不是使用绝对宽度&#xff08;例如像素&#xff09;。这样&#xff0c;当浏览器窗口大小变化时&#xff0c;元素会自动调整大小…

CocoaPods使用详解

CocoaPods使用详解 引言 在iOS开发过程中&#xff0c;第三方库的集成是一个常见的需求。CocoaPods作为一个流行的依赖管理工具&#xff0c;能够大大简化这一过程。它允许开发者通过一个名为Podfile的配置文件来管理项目中的第三方库。本文将详细介绍CocoaPods的安装、基本使用…

Linux学习_09-Linux的用户管理

账号和用户组 系统管理员的主要工作就是管理账号。我们先来了解一下linux系统是如何识别每个用户的。 用户标识符&#xff1a;UID和GID linux的用户至少有2个ID&#xff0c;也就是UID用户ID和GID用户组ID。虽然登录的时候输入的是用户名&#xff0c;但其实系统识别的是这个两…

机器学习理论基础—集成学习(1)

机器学习理论基础—集成学习 个体与集成 集成学习通过构建并结合多个学习器来完成学习任务&#xff0c;有时也称为多分类系统等。 分类&#xff1a; 根据集成学习中的个体学习器的不同可以分为同质集成&#xff08;集成的学习器相同例如全部是决策树&#xff09;&#xff0c…

视频通话实时换脸:支持训练面部模型 | 开源日报 No.235

iperov/DeepFaceLive Stars: 19.7k License: GPL-3.0 DeepFaceLive 是一个用于 PC 实时流媒体或视频通话的人脸换装工具。 可以使用训练好的人脸模型从网络摄像头或视频中交换面部。提供多个公共面部模型&#xff0c;包括 Keanu Reeves、Mr. Bean 等。支持自己训练面部模型以…

字符串类型漏洞之updatexml函数盲注

UPDATEXML 是 MySQL 数据库中的一个函数&#xff0c;它用于对 XML 文档数据进行修改和查询。然而&#xff0c;当它被不当地使用或与恶意输入结合时&#xff0c;它可能成为 SQL 注入攻击的一部分&#xff0c;从而暴露敏感信息或导致其他安全漏洞。 在 SQL 注入攻击中&#xff0…

【数值模型后处理系列】通风系数计算及垂直层插值

一、通风系数 1.1 通风系数简介 通风系数&#xff08;Ventilation Coefficient&#xff0c;VC&#xff09;可以用来表征扩散条件&#xff0c;其计算公式如下&#xff08;参考U S Iyer and P Ernest Raj的文章&#xff09;&#xff1a; 其中mixing depth选用WRF输出的边界层高…

如何我现在是本地的文件路径不是http,用html如何打开

--别给我BB 如何我现在是本地的文件架路径不是http&#xff0c;用html如何打开? 答&#xff1a; 如果你想在HTML中打开本地文件路径的视频&#xff0c;可以使用file://协议。假设你的视频文件在本地的路径为/path/to/your/video.mp4&#xff0c;那么你可以将src属性设置为file…

【Django】初识Django快速上手

Django简介 Django是一个高级的、开源的Python Web框架&#xff0c;旨在快速、高效地开发高质量的Web应用程序 https://developer.mozilla.org/zh-CN/docs/Learn/Server-side/Django/Introduction 安装Django pip install Django如果要知道安装的Django的版本&#xff0c;可…

锂电池SOH预测 | 基于CNN-GRU的锂电池SOH预测(matlab)

锂电池SOH预测 锂电池SOH预测完整代码锂电池SOH预测 锂电池的SOH(状态健康度)预测是一项重要的任务,它可以帮助确定电池的健康状况和剩余寿命,从而优化电池的使用和维护策略。 SOH预测可以通过多种方法实现,其中一些常用的方法包括: 容量衰减法:通过监测电池的容量衰减…

Qt/C++ 波形绘制双缓冲下改善PaintEvent连续绘制卡顿问题(完整代码解析)

音频波形可视化&#xff1a;该控件用于将音频样本数据可视化为波形&#xff0c;常用于音频处理软件中以展示音频信号的时间域特性。 动态数据绘制&#xff1a;控件能够响应外部数据的变化并重新绘制波形&#xff0c;适用于实时或动态的音频数据流。 自定义绘制逻辑&#xff1…

Android Studio gradle 默认sourceSets配置

一. AS默认的sourceSets配置 sourceSets在Android插件中如何使用的&#xff1a;android {sourceSets {main {manifest.srcFile AndroidManifest.xmljava.srcDirs [src]resources.srcDirs [src]aidl.srcDirs [src]renderscript.srcDirs [src]res.srcDirs [res]assets.srcD…

Web开发基础概念

Python的Web开发是指使用Python语言来开发Web应用程序&#xff0c;如网站、网络应用程序等。在Python的Web开发中&#xff0c;有一些核心概念和技术栈需要了解。本文将介绍Python的Web开发框架和技术栈&#xff0c;并提供一些相关的资源供参考。一、Python的Web开发框架Python的…

Pycharm新建工程时使用Python自带解释器的方法

Pycharm新建工程时使用Python自带解释器的方法 新建Project时最好不要新建Python解释器&#xff0c;实践证明&#xff0c;自己新建的Python解释器容易出现各种意想不到的问题。 那么怎样使用Python安装时自带的解释器呢&#xff1f; 看下面的三张截图大家就清楚了。 我的Pyth…

机器视觉系统-工业光源什么是同轴光

光路描述&#xff1a;反射光线与镜头平行&#xff0c;称为同轴光。 效果分析&#xff1a;光线经过平面反射后&#xff0c;与光轴平行地进入镜头。此时被测物相当于一面镜子&#xff0c;图像体现的是光源的信息&#xff0c;当“镜子“出现凹凸不平时&#xff0c;将格外地明显。 …

数据结构与算法-图论-DFS/BFS

图搜索算法在数据结构与算法领域中非常关键&#xff0c;用于在图形数据结构中搜索节点或路径。图是由节点&#xff08;也称为顶点&#xff09;以及连接这些节点的边组成的。在本文中&#xff0c;我们将详细探讨两种基础的图搜索算法&#xff1a;深度优先搜索&#xff08;DFS&am…

Linux异步io机制 io_uring

io_uring作为2019年的后起之秀&#xff0c;为linux异步网络编程新增一把倚天大剑&#xff0c;让我们简单学习一下&#xff01; 数据结构&#xff1a; a. sq (submition queue)&#xff1a;提交队列&#xff0c;一个存放待执行事件的环形队列 b. cq (completion queue): 完成…

Node.js -- 包管理工具

文章目录 1. 概念介绍2. npm2.1 npm 下载2.2 npm 初始化包2.3 npm 包(1) npm 搜索包(2) npm 下载安装包(3) require 导入npm 包的基本流程 2.4 开发依赖和生产依赖2.5 npm 全局安装(1) 修改windows 执行策略(2) 环境变量Path 2.6 安装包依赖2.7 安装指定版本的包2.8 删除依赖2.…