如何设置在修改 属性 时触发的断点?

How can I set a breakpoint that triggers when a property is modified?

我有一个 public 属性 具有对私有字段的读写方法。我尝试为字段或 属性 添加数据断点,但收到 "Invalid address" 错误消息。我用类型名限定了变量名。同样的错误。 我还尝试在 write 方法上放置一个常规断点,该行变为绿色。

在 Delphi XE 中,当变量值发生变化时如何中断?

更新

这是示例代码:

Type
 TCustromer

private
 customerName: string;
public 
  property CustomerName: string  read customerName   write customerName;
end;

如何在 CustomerName 或 customerName 值发生变化时中断?

您来自 .Net,其中编译器将直接字段 属性 setter 替换为存根方法。通过该设置,我可以理解为什么 IDE 可能会让您在 属性 声明上放置断点并将其解释为那些隐藏的存根方法中的断点。

但是,

Delphi 不是那样工作的。当 属性 声明说它写入一个字段时,然后对 属性 的赋值 直接 分配给该字段。没有 setter 的闯入方法。

要检测程序中对 属性 的写入,您可以 尝试设置数据断点。但是,您必须为 class 的 每个 实例执行此操作,因为每个实例的字段显然位于不同的地址。此外,您必须在每次 每次 重新启动程序时重新执行此操作,因为实例的地址不一定与下一个 运行 保持相同。

实现目标的更简单方法就是为您的 属性 写一个 setter。然后在执行那个setter.

设置断点
type
  TCustomer = class
  private
    FCustomerName: string;
    procedure SetCustomerName(const Value: string);
  public 
    property CustomerName: string read FCustomerName write SetCustomerName;
  end;

procedure TCustomer.SetCustomerName(const Value: string);
begin // Set breakpoint here.
  FCustomerName := Value;
end;

我知道这是一个老问题,但 Delphi 曾经允许为此目的设置数据断点。我不知道 XE 是否有,但我猜它有。