2

当我在对象检查器/事件选项卡中单击 OnMouseDown 时,我有一个形状。我希望它执行“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;

那么它将起作用。但如果可以的话,更容易从事件中进行选择。谢谢

4

2 回答 2

3

an 的事件处理程序OnMouseEvent必须具有以下形式的签名:

procedure (Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer) of object;

该组件将调用您的事件处理程序并传递所有这些参数,并且您的事件处理程序必须是预期的形式。

你无法控制这一点。该组件为其事件处理程序具有预先确定的硬编码形式。您只需要适应。您当前的解决方案是正确的。

话虽如此,SelectMessage只有在通过 a 时才能工作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;
于 2012-10-23T08:33:54.623 回答
3

我的 Delphi 知识有点生疏,但 AFAIR 的签名需要与 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;
于 2012-10-23T08:34:00.060 回答