如何设置一个当属性被修改时触发断点的断点?

3

我有一个公共属性,通过读写方法访问私有字段。我尝试为该字段或属性添加数据断点,但是出现了“无效地址”错误消息。我使用类型名称限定了变量名。仍然出现相同的错误。

我还尝试在写方法上设置常规断点,但是该行显示为绿色。

在 Delphi XE 中,如何在变量值更改时中断程序执行?

更新

以下是示例代码:

Type
 TCustromer

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

当 CustomerName 或 customerName 的值发生变化时,我应该如何打断程序?


@David 你如何获取变量的绝对地址?如果我使用Inspect,我会得到“Error inspecting 'xxxx': expression error”消息。 - Tony_Henrich
@Jerry 代码中的断点已经触发。在属性定义处设置的断点为绿色。 - Tony_Henrich
3
要在属性设置器上设置断点,您需要将其放在设置器的实现中,而不是在属性声明中。属性声明不代表任何可执行代码,这是常规断点可以放置的唯一位置。 - Rob Kennedy
@Rob 我来自 .NET 世界。Delphi 对我来说是新的东西。在 Visual Studio 中,我可以在属性声明中放置一个断点,并且每当类型的实例设置该属性时,它就会触发,无论它在代码中发生在何处。可能有一百个地方设置该属性。在每个地方都放置一个断点是不实际的。我正在寻找类似 Delphi 的东西。我认为如果我在写方法上放置一个断点,它就会在该类型的实例设置属性值时触发。 - Tony_Henrich
@Tony,我认为你还是误解了。“正常断点”意味着它在该属性setter的实现中,而不是界面或任何其他设置该属性的地方。这将在实际属性setter过程内部,即SetMyProperty(Value:String); - Jerry Dodge
显示剩余13条评论
2个回答

13

你来自 .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;

-1

我知道这是一个老问题,但Delphi曾经允许使用数据断点来实现此目的。我不知道XE是否有这个功能,但我猜它应该有。


是的,我现在在评论中看到了,我猜我本来期望在更突出的答案部分看到它。我还没有使用过XE,因为它太贵了。 - Paul McCarthy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接