TSpeedButton陷入了外观

Arn*_*old 1 delphi button

我使用带有属性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.

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

Joh*_*ica 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;
Run Code Online (Sandbox Code Playgroud)

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

如果AllowAllUp:= false那么具有相同所有者和相同的2个或更多个速度groupindex按钮一致地像一组radiobutton 一样动作.

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

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