3

TSpeedButton が押されたときに実行したいアクションと、同じボタンが「押されていない」ときに実行したいアクションがあります。onunpress イベントがないことはわかっていますが、別のボタンが押されたときにアクションを実行する簡単な方法はありますか?

procedure ActionName.ActionNameExecute(Sender: TObject);
begin
  PreviousActionName.execute(Sender);
  //
end;

不格好すぎるようです。

4

2 に答える 2

5

unpressはありませんが、Downプロパティを照会できます。

この例ではいくつかのダーティキャストが使用されていますが、アクションとOnClickの両方で機能します。

procedure Form1.ActionExecute(Sender: TObject);
var
  sb : TSpeedButton;
begin
  if Sender is TSpeedButton then
    sb := TSpeedButton(Sender)
  else if (Sender is TAction) and (TAction(Sender).ActionComponent is TSpeedButton) then
    sb := TSpeedButton(TAction(Sender).ActionComponent)
  else 
    sb := nil;

  if sb=nil then
    DoNormalAction(Sender)
  else if sb.Down then
    DoDownAction(sb)
  else 
    DoUpAction(sb);
end;
于 2008-10-08T19:45:01.663 に答える
5

あなたの説明から、スピードボタンをGroupIndex <> 0で使用しているが、同じグループ内の他のボタンは使用していないか、少なくともRadioButtons(AllowAllUp True)として機能していないと思います。

ボタンを押すためのonClickイベントは1つだけですが、GroupIndexがある場合、何をするかはボタンの状態によって異なります。
したがって、onClickハンドラーが起動される前にDownが更新されるため、onClickイベントハンドラーでDownがFalseであるかどうかをテストする必要があります。

元:

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  with Sender as TSpeedButton do
  begin
    if Down then
      showmessage('pressing')
    else
      showmessage('unpressing');
  end;
end;
于 2008-10-08T20:23:22.303 に答える