Delphi关于RadioButton的按键事件与再次点击时取消选中

全局变量rbc:string;//记录点击时RadioButton1的checked状态
procedure TForm1.RadioButton1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
    if RadioButton1.Checked=true then	//点击时已选中
    begin
        rbc:='Y';
        RadioButton1.Checked:=false;
    end
    else rbc:='N';			//点击时未选中
end;

procedure TForm1.RadioButton1Click(Sender: TObject);
begin
    if rbc='Y' then
    begin
        RadioButton1.Checked:=false;	//在两个过程中都写是因为这两个过程的发生顺序是不定的,不知道哪个会先运行,所以保险起见两个都写了。
    end;
end;

procedure TForm1.RadioButton1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
    if rbc='Y' then
    begin
        RadioButton1.Checked:=false;
    end;
end;


---------------------------------------


在研究如何使点击处于已点击状态(checked=true)的RadioButton时取消选中的时候,发现了它的按键事件很是让人纠结。

设有一个rb1:TRadioButton;

鼠标点击时的事件如下:

0.rb1.checked=false;

1.rb1MouseDown() //进入鼠标按下事件

2.rb1MouseUp() //进入鼠标抬起事件

3.判断rb1.checked状态,若为true,不做修改,事件结束。

   若为false,修改rb1.checked:=true;进入rb1Click()事件

以上是平常状态的过程,但若在这些按键事件过程中插入修改rb1.checked状态的语句,情况就纠结了。

一、已选中的情况下,再次点击时在鼠标按下或抬起事件中修改rb1.checked:=false:

这种情况,在理论上,在鼠标抬起后判断rb1.checked时,由于已修改为false,所以此时会自动修改rb1.checked:=true后进入rb1Click()事件,所以rb1总为checked=true状态。

实际运行的情况就会是再次点击rb1后,rb1会闪一下,然后仍然停留选中状态rb1.checked=true。

但是!!!!

实际运行下,发现并不是每次都会闪一下。又时会出现再次点击后rb1.checked=false的情况。闪一下和取消选中两种情况的发生概率不定,连续点击下,一般是:闪一下-闪一下-闪一下·····(若干次后情况突然改变)-选中状态改变-选中状态改变-选中状态改变······(若干次后情况再次突然改变)-闪一下-闪一下-闪一下·····以此类推。

这就让人非常纠结了,在rb1MouseDown()、rb1MouseUp()、rb1Click()三个事件过程中设置断点,调试发现:

在使用F8键step over调试时,三个事件过程的运行顺序是rb1MouseDown()->rb1MouseUp()->rb1Click()

在使用F9键run调试时,三个事件过程的运行顺序是rb1MouseDown()->rb1Click()->rb1MouseUp(),

两种调试结果运行顺序不同(??????),但结果都是理论结果(闪一下)

两种按键调试结果不同的原因,可能跟进入调试时是鼠标按下时发生,rb1MouseUp()事件尚未发生有关。

而运行时的情况不同,猜想可能是跟鼠标按下时间有关。

到这里已经晕了,看情况再研究吧。

你可能感兴趣的:(Delphi关于RadioButton的按键事件与再次点击时取消选中)