全局变量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()事件尚未发生有关。
而运行时的情况不同,猜想可能是跟鼠标按下时间有关。
到这里已经晕了,看情况再研究吧。