我使用设置了属性Flat
的TSpeedButton。当我按下它并产生异常时,它仍处于按下状态。下面图像的第一张图像是在按下按钮和第二张图像之前,当除外时,保留在该位置。
使用两个事件,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。
如何将此按钮自动重置为未按下状态?
答案 0 :(得分:5)
您的代码存在一些问题
为了能够在单个速度按钮上设置向下状态,您需要设置
A :AllowAllUp:= true
和
B :groupindex <> 0
。
只有这样, C :down
属性才能将自身用作复选框。
当满足这些条件时,您可以使用普通香草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;