You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi 12中如何为自定义带事件的类创建跨单元事件监听器

在其他单元监听TPathList的ListChangedEvent事件

要在其他单元监听自定义类的事件,只需按以下步骤实现:

1. 引用PathList单元

在需要监听事件的单元(比如主窗体单元)的uses列表中添加PathList,确保能访问TPathList类和事件类型。

2. 声明事件处理方法

在目标类(比如窗体类)中声明一个与TListChangedEvent签名完全匹配的方法,必须包含of object关键字(表示这是类成员方法)。

3. 绑定事件到处理方法

创建TPathList实例后,将事件处理方法赋值给ListChangedEvent属性;销毁实例前建议解绑事件,避免潜在的悬挂引用。

完整示例代码

主窗体单元(MainForm.pas)

unit MainForm;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, PathList; // 引用自定义类单元

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FPathListA: TPathList;
    FPathListB: TPathList;
    // 事件处理方法,签名与TListChangedEvent完全一致
    procedure HandleListChanged(Sender: TObject);
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  // 创建两组数据对应的TPathList实例
  FPathListA := TPathList.Create('图片路径');
  FPathListB := TPathList.Create('文档路径');
  
  // 绑定事件处理方法
  FPathListA.ListChangedEvent := HandleListChanged;
  FPathListB.ListChangedEvent := HandleListChanged;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  // 销毁前解绑事件(可选但推荐)
  FPathListA.ListChangedEvent := nil;
  FPathListB.ListChangedEvent := nil;
  
  // 释放实例
  FPathListA.Free;
  FPathListB.Free;
end;

procedure TForm1.HandleListChanged(Sender: TObject);
var
  TargetList: TPathList;
begin
  // 将Sender转换为TPathList类型,获取触发事件的实例信息
  if Sender is TPathList then
  begin
    TargetList := TPathList(Sender);
    ShowMessage(Format('[%s]列表已更新,当前条目数:%d', [TargetList.PathType, TargetList.Size]));
    // 这里添加你的业务逻辑,比如刷新UI、同步数据等
  end;
end;

end.

补充:触发事件的时机

要让事件真正生效,需要在TPathList类的数据发生变更时调用DoListChangedEvent方法。比如给TPathList添加修改Size的方法:

// 在PathList单元的TPathList类public部分添加
procedure SetNewSize(NewSize: Integer);

// 实现部分
procedure TPathList.SetNewSize(NewSize: Integer);
begin
  if FSize <> NewSize then
  begin
    FSize := NewSize;
    // 数据变更时触发事件
    DoListChangedEvent(Self);
  end;
end;

当你在其他单元调用FPathListA.SetNewSize(5)时,就会自动触发HandleListChanged方法。

内容的提问来源于stack exchange,提问作者johnwargo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 18:45:23