当我在对象检查器/事件选项卡中单击OnMouseDown时,我有一个形状。我想让它做“SelectMessage”程序,但它没有显示为一个选项。此外,如果我手动输入“SelectMessage”我得到错误属性和方法Selectmessage不兼容。
Selectmessage
procedure TFZone1Mod7.Selectmessage(sender: TObject);
var
ShapeOrderNo: Integer;
begin
if TryStrToInt(copy(TShape(Sender).Name,6,MaxInt),ShapeOrderNo) then
begin
LookUpMessage(ShapeOrderNo);
end;
end;
如果我这样做
procedure TFZone1Mod7.Shape1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
selectmessage(sender);
end;
然后它会起作用。但如果可以的话,更容易从事件中选择。
感谢
答案 0 :(得分:3)
OnMouseEvent
的事件处理程序必须具有以下形式的签名:
procedure (Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer) of object;
组件将调用您的事件处理程序传递所有这些参数,并且您的事件处理程序必须是预期的形式。
你无法控制这一点。该组件具有用于其事件处理程序的预定的硬编码形式。你只需要适应。你当前的解决方案是正确的。
话虽如此,SelectMessage
只有在传递TShape
时才能工作。所以以这种方式声明函数:
procedure TFZone1Mod7.SelectMessage(Shape: TShape);
var
ShapeOrderNo: Integer;
begin
if TryStrToInt(copy(Shape.Name,6,MaxInt), ShapeOrderNo) then
LookUpMessage(ShapeOrderNo);
end;
并称之为:
procedure TFZone1Mod7.Shape1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
SelectMessage(Sender as TShape);
end;
答案 1 :(得分:3)
我的Delphi知识有点生疏,但AFFAIR的签名需要与IDE生成的方法相匹配,所以:
procedure TFZone1Mod7.Selectmessage(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
ShapeOrderNo: Integer;
begin
if TryStrToInt(copy(TShape(Sender).Name,6,MaxInt),ShapeOrderNo) then
begin
LookUpMessage(ShapeOrderNo);
end;
end;