发送自己不起作用

时间:2012-10-23 06:57:15

标签: delphi delphi-xe2

如果需要,请不要确定如何制作标题。我有一个程序

procedure TFZone1Mod7.ChangeText(sender: TObject);
var
  ShapeOrderNo: integer;
  FoundComponent: TComponent;
begin
  if TryStrToInt(copy(TShape(Sender).Name,6,MaxInt),ShapeOrderNo) then
    begin
      FoundComponent := FindComponent('label'+inttostr(ShapeOrderNo+12));
      if (FoundComponent is TLabel) then
            Label25.Caption := TLabel(FoundComponent).Caption
      else
          showmessage('not found');
    end;
  showmessage(TShape(sender).Name);

end;

所以我在Shape1MouseEnter上调用该过程。所以我认为(Self)会发送shape1但它不发送表单(TFZone1Mod7)我怎么能让它发送形状? 这就是我如何称呼它。

procedure TFZone1Mod7.Shape1MouseEnter(Sender: TObject);
begin
    changetext(self);
end;

1 个答案:

答案 0 :(得分:4)

在此方法中

procedure TFZone1Mod7.Shape1MouseEnter

SelfTFZone1Mod7类型的对象。这就是你的形式。请记住,Self是指与活动方法关联的实例。在您的代码中,类是一个表单,因此实例Self始终是一个表单实例。

要了解Self是什么,请查看procedurefunction关键字后面的类型。 Self实例是该类型的实例。

在您的情况下,如果您想要传递形状,您可以传递Shape1,或更通用,Sender。后者允许您在多个形状之间共享一个事件处理程序。

这种错误突出了为什么你应该使用as运算符进行格式化转换。如果您犯了错误,您将立即以有用的方式获得相关信息。你未经检查的演员阵容只会导致难以理解的神秘错误。

所以我可能倾向于将ChangeText声明为接收TShape类型的参数。然后像这样称呼它:

ChangeText(Sender as TShape);

这允许您从ChangeText中移除强制转型,并将它们仅限于事件处理程序,而事件处理程序必须只有TObject个实例,Sender可用。