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を送信すると思いますが、form(TFZone1Mod7)を送信しません。シェイプを送信するにはどうすればよいですか?これが私がそれを呼んでいる方法です。

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

1 に答える 1

4

このメソッドの内部

procedure TFZone1Mod7.Shape1MouseEnter

SelfタイプのオブジェクトですTFZone1Mod7。そしてそれがあなたの形です。Selfこれは、アクティブなメソッドに関連付けられているインスタンスを指していることに注意してください。また、コードでは、クラスはフォームであるため、インスタンス、Selfは常にフォームインスタンスです。

何であるかを知るには、 orキーワードSelfに続くタイプを見てください。インスタンスはそのタイプのインスタンスです。procedurefunctionSelf

あなたの状況では、シェイプをパスしたい場合は、、Shape1またはより一般的には、のいずれかをパスできますSender。後者を使用すると、1つのイベントハンドラーを複数のシェイプ間で共有できます。

この種の間違いは、as演算子でチェックキャストを使用する必要がある理由を浮き彫りにします。間違えた場合は、すぐに役立つ方法で通知されます。チェックされていないキャストは、不可解なエラーを理解するのが難しくなります。

したがって、私はおそらくChangeText、タイプのパラメーターを受け取ると宣言する傾向がありますTShape。そしてそれをこのように呼びます:

ChangeText(Sender as TShape);

これにより、キャストを削除してChangeText、必然的にTObjectインスタンスのみを使用できるイベントハンドラーに限定することがSenderできます。

于 2012-10-23T07:20:39.473 に答える