如果需要,请不要确定如何制作标题。我有一个程序
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;
答案 0 :(得分:4)
在此方法中
procedure TFZone1Mod7.Shape1MouseEnter
Self
是TFZone1Mod7
类型的对象。这就是你的形式。请记住,Self
是指与活动方法关联的实例。在您的代码中,类是一个表单,因此实例Self
始终是一个表单实例。
要了解Self
是什么,请查看procedure
或function
关键字后面的类型。 Self
实例是该类型的实例。
在您的情况下,如果您想要传递形状,您可以传递Shape1
,或更通用,Sender
。后者允许您在多个形状之间共享一个事件处理程序。
这种错误突出了为什么你应该使用as
运算符进行格式化转换。如果您犯了错误,您将立即以有用的方式获得相关信息。你未经检查的演员阵容只会导致难以理解的神秘错误。
所以我可能倾向于将ChangeText
声明为接收TShape
类型的参数。然后像这样称呼它:
ChangeText(Sender as TShape);
这允许您从ChangeText
中移除强制转型,并将它们仅限于事件处理程序,而事件处理程序必须只有TObject
个实例,Sender
可用。