【问题标题】:How can I set a breakpoint that triggers when a property is modified?如何设置修改属性时触发的断点?
【发布时间】:2015-04-10 21:34:25
【问题描述】:

我有一个公共属性,其中包含对私有字段的读写方法。我尝试为字段或属性添加数据断点,但收到“无效地址”错误消息。我用类型名称限定了变量名称。同样的错误。 我还尝试在 write 方法上放置一个常规断点,并且该行变为绿色。

Delphi XE中变量的值发生变化时如何中断?

更新

这是一个示例代码:

Type
 TCustromer

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

当 CustomerName 或 customerName 值发生变化时,我该如何中断?

【问题讨论】:

  • 您是在构建还是发布配置?您是否在一个项目组中打开了多个项目?这个单元是你项目的一部分还是在它之外?
  • 数据断点工作正常。我总是通过给出绝对地址来设置它们。
  • @Jerry 对所有人都没有。常规断点可以正常触发。这里的问题是如何为地址字段使用变量?
  • 您说“我也尝试在 write 方法上放置一个常规断点,该行变为绿色。”这意味着它不能正常工作。
  • 要在属性设置器上设置断点,您需要将其放在设置器的实现中,而不是在属性声明中。属性声明不代表任何可执行代码,这是常规断点唯一可以去的地方。

标签: delphi delphi-xe


【解决方案1】:

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

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

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

实现目标的更简单方法是为您的属性编写一个 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;

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 是的,我现在在 cmets 中看到了它,猜想我期待在更突出的答案部分看到它。 XE我还没用过,太贵了。
    猜你喜欢
    • 2013-08-30
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 2012-02-01
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    相关资源
    最近更新 更多