TSpeedButton陷入了外观

时间:2011-12-09 20:18:15

标签: delphi button

我使用设置了属性Flat的TSpeedButton。当我按下它并产生异常时,它仍处于按下状态。下面图像的第一张图像是在按下按钮和第二张图像之前,当除外时,保留在该位置。

enter image description here

使用两个事件,OnMouseDown和OnMouseUp。事件处理程序的代码是:

procedure TVector_Choice.Button_Down (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
   FStart_X  := X;
   FStart_Y  := Y;
   FSelected := True;
end; // MouseDown //

procedure TVector_Choice.Button_Up (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
   Application.ProcessMessages;
   if Assigned (FOnSelect) and FSelected then
   begin
      FOnSelect (Sender);
      FSelected := False;
   end; // if
end; // MouseUp //

FOnSelect (Sender);中的过程Button_Up发生异常。异常是通过try..finally处理,以便重置鼠标指针。我不知道如何重置“按下”状态,这不是我在上面试过的'Down'状态。我无法在小型测试程序中重现此行为。我使用的是Delphi XE。

如何将此按钮自动重置为未按下状态?

2 个答案:

答案 0 :(得分:5)

您的代码存在一些问题

为了能够在单个速度按钮上设置向下状态,您需要设置
A AllowAllUp:= true
B groupindex <> 0
只有这样, C down属性才能将自身用作复选框。

enter image description here

当满足这些条件时,您可以使用普通香草TSpeedButton的OnClick事件。

procedure TForm2.btn2Click(Sender: TObject);
begin
  case btn2.Down of
    true: //do stuff when down
    false: //do stuff when up
  end; {case}
end;

无需复杂的自定义消息处理。

如果AllowAllUp:= false,那么具有相同所有者和相同groupindex的2个或更多个速度按钮会像一组radiobutton一样同时执行。

您的代码备注
最后,您的代码似乎使用了从TSpeedButton继承的自定义控件,但是看不到inherited关键字,当您禁用继承行为时,您希望按钮如何运行?

除此之外,您的代码还有许多其他问题,但主要问题是,如果必须继承标准控件,因为您需要一些特殊行为,请确保重用尽可能多的行为尽可能尝试并始终在覆盖的任何代码中调用inherited(除非您要完全禁用继承的行为)

答案 1 :(得分:2)

try..finally未处理异常,您需要使用try..except处理。

当出现错误并且未处理时(使用try..except),该方法将中止。

要同时执行try..finally和try..except,您可以嵌套它们:

try
  // Do the thing that needs cleaning up
  try
    // Possible error raising code
  except
    // Handle the error here
  end;
finally
  // Cleanup
end;