我使用带有属性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 //
Run Code Online (Sandbox Code Playgroud)
例程Button_Up中发生异常FOnSelect (Sender);.异常是通过try..finally处理,以便重置鼠标指针.我不知道如何重置"按下"状态,这不是我在上面试过的'Down'状态.我无法在小型测试程序中重现此行为.我使用Delphi XE.
如何将此按钮自动重置为未按下状态?
您的代码存在一些问题
为了能够在单个速度按钮上设置向下状态,您需要设置
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;
Run Code Online (Sandbox Code Playgroud)
无需复杂的自定义消息处理.
如果AllowAllUp:= false那么具有相同所有者和相同的2个或更多个速度groupindex按钮一致地像一组radiobutton 一样动作.
关于代码的注释
最后你的代码似乎使用了从TSpeedButton继承的自定义控件,但是inherited看不到关键字,当你禁用继承的行为时,你如何期望按钮操作?
除此之外,您的代码还有许多其他问题,但主要问题是如果您必须从标准控件继承,因为您需要一些特殊行为,请确保尽可能多地重用行为并尝试始终调用inherited任何代码你重写(除非你想完全禁用继承的行为)