2

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

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;
4

1 回答 1

4

在这个方法里面

procedure TFZone1Mod7.Shape1MouseEnter

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

要知道它是什么Self,请查看procedureorfunction关键字后面的类型。该Self实例是该类型的一个实例。

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

这种错误突出了为什么应该对as运算符使用检查强制转换。当您犯错时,您会立即以有用的方式得到通知。您未经检查的强制转换只会导致难以理解的神秘错误。

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

ChangeText(Sender as TShape);

这允许您从事件处理程序中删除强制转换ChangeText并将它们限制在事件处理程序中,这些事件处理程序必须只有一个可用的TObject实例Sender

于 2012-10-23T07:20:39.473 回答