1. 程式人生 > >Delphi關於RadioButton的按鍵事件與再次點選時取消選中

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()事件尚未發生有關。

而執行時的情況不同,猜想可能是跟滑鼠按下時間有關。

到這裡已經暈了,看情況再研究吧。