Конференция "Начинающим" » два раза срабатывает onclick TRadiobutton
 
  • lewka © (25.02.17 01:26) [0]
    Здравствуйте! Вот такая проблема при работе кода

    procedure Tfmdata_dir.sRadioButton4Click(Sender: TObject);
    var n_c,i:Integer;
    begin
    if sComboBox1.ItemIndex=1 then
    sPageControl1.ActivePage:=sTabSheet4
    else
    begin
    ShowMessage('Заполняется только при повторном направлении');
     n_c:=0;
     for i := 0 to ComponentCount-1 do
      if Components[i] is TsRadioButton then
      begin
        n_c:=n_c+1;
        if n_c=sPageControl1.TabIndex+1 then
         begin
         TsRadioButton(Components[i]).Checked:=True;
         TsRadioButton(Components[i]).SetFocus;
         end;
      end;
    end;
    end;


    т.е. должен возвращать checked тому РадиоБаттону, который был выбран перед этим.
    Все работает, но почему то два раза подряд. Т.е. сообщение появляется два раза

    Подскажите, почему? Что не так?
  • Германн © (25.02.17 02:24) [1]
    Потому что при изменении свойства Checked у TRadioButton вызывается его метод Click.
    В принципе для устранения сей ситуации в VCL предусмотрено свойство TButtonControl.ClicksDisabled. Но оно (по крайней мере в моей Д2007) до сих пор сидит в protected.
  • Kilkennycat © (25.02.17 07:23) [2]
    Для устранения сей ситуации можно использовать свойство Tag как флаг, проверять в самом начале обработчика, если установлено - сбрасывать и выходить.
  • Inovet © (25.02.17 08:18) [3]
    Я думаю, здесь с логикой построяния интерфейса что-то не то. Если элемент не должен срабатывать при каких то условиях, то надо при наступлении этих условий делать элемент disable := true, и при наступлении других - disable := false.
  • Kilkennycat © (25.02.17 09:27) [4]

    > Inovet ©   (25.02.17 08:18) [3]

    лучше visible, иначе наличие неактивного контрола вызывает вопросы и размышления, чей-то он есть, а щелкнуть не могу, и придется сообщение об этом выводить иначе, либо после нажатия "итого", либо высвечивать какую-то label красную, если интерфейс громоздкий (т.е. до кнопки "итого" очень далеко).
    а если его нет - то и вопросов нет.
  • Kilkennycat © (25.02.17 09:29) [5]
    хотя, можно и disable и hint
  • NoUser © (25.02.17 13:59) [6]
    type TCheckedIn = class Helper for TButtonControl
    procedure SetCheckedIn(Value: Boolean);
    property  CheckedIn:Boolean write SetCheckedIn;
    end;

    procedure TCheckedIn.SetCheckedIn(Value: Boolean);
    var
    TmClick : TNotifyEvent;
    begin
    if ( Value <> Checked ) then
     begin
      TmClick := OnClick;
      OnClick := nil;
      Checked := Value;
      OnClick := TmClick;
     end;
    end;

    //
    CheckBox1.CheckedIn := not CheckBox1.Checked;
    RadioButton1.CheckedIn := not RadioButton1.Checked;
  • Германн © (26.02.17 02:40) [7]

    > Inovet ©   (25.02.17 08:18) [3]
    >
    > Я думаю, здесь с логикой построяния интерфейса что-то не
    > то.

    Имхо, тут с логикой VCL что-то не то. Зачем при программном изменении свойства Checked вызывается метод Click?
  • Kilkennycat © (26.02.17 03:49) [8]

    > Германн ©   (26.02.17 02:40) [7]

    да, это очень раздражало, вначале :)
    но когда знаешь об этом, то даже удобно.
  • Leonid Troyanovsky © (26.02.17 17:07) [9]

    > Германн ©   (25.02.17 02:24) [1]

    >  Но оно (по крайней мере в моей Д2007) до сих пор сидит
    > в protected.

    Кого это может остановить.

    type
     THackRadioButton = class(TRadioButton);
    ..
     THackRadioButton(RadioButton1).ClicksDisabled := True;


    --
    Regards, LVT.
  • другой Владимир (26.02.17 17:59) [10]

    > lewka ©   (25.02.17 01:26)
    >
    > т.е. должен возвращать checked тому РадиоБаттону, который
    > был выбран перед этим.
    > Все работает, но почему то два раза подряд. Т.е. сообщение
    > появляется два раза
    >
    > Подскажите, почему? Что не так?


    Очевидно потому, что используется один обработчик на все RadioButton. Первый раз вызывается обработчик при реальном клике, а второй раз при

    TsRadioButton(Components[i]).Checked:=True;


    Просто нужно изменить логику.
  • другой Владимир (26.02.17 18:15) [11]
    А если так?


    > for i := 0 to ComponentCount-1 do
    >   if Components[i] is TsRadioButton then
    >   begin
    >     n_c:=n_c+1;
    >     if n_c=sPageControl1.TabIndex+1 then
    >      begin
    >      TsRadioButton(Components[i]). OnClick := nil;
    >      TsRadioButton(Components[i]).Checked:=True;
    >      TsRadioButton(Components[i]). OnClick := sRadioButton4Click;
    >      TsRadioButton(Components[i]).SetFocus;
    >      end;
    >   end;
  • Германн © (27.02.17 03:13) [12]

    > Leonid Troyanovsky ©   (26.02.17 17:07) [9]
    >
    >
    > > Германн ©   (25.02.17 02:24) [1]
    >
    > >  Но оно (по крайней мере в моей Д2007) до сих пор сидит
    > > в protected.
    >
    > Кого это может остановить.
    >

    Блин!
    Леонид, вы опять меня не поняли.
    О том как получить доступ к protected свойствам я узнал еще до появления интернета (в моей квартире).
    Я не понимаю почему то или иное свойство до сих пор находится в этой секции?
    Ещё точнее я понимаю почему. Потому что нынешним разработчикам Дельфи или их начальству это не интересно.
  • Kilkennycat © (27.02.17 12:38) [13]

    > Германн ©   (27.02.17 03:13) [12].
    > почему то или иное свойство до сих пор находится в этой секции?

    Может, отделение невинапишного?
  • Германн © (28.02.17 02:08) [14]

    > Kilkennycat ©   (27.02.17 12:38) [13]
    >
    >
    > > Германн ©   (27.02.17 03:13) [12].
    > > почему то или иное свойство до сих пор находится в этой
    > секции?
    >
    > Может, отделение невинапишного?
    >  

    Не. Костя, вот таких недоделок в VCL много.
    Имхо, папаша Борланд и его потомки не очень хотят заниматься самой VCL. И я их отчасти понимаю.
  • Kilkennycat © (28.02.17 03:18) [15]

    > Германн ©   (28.02.17 02:08) [14]

    Возможно. Когда начинал работать с Делфи, тож удивлялся и беспощадно правил генофонд - мне тогда казалось это лучшим решением :)
 
Конференция "Начинающим" » два раза срабатывает onclick TRadiobutton
Есть новые Нет новых   [118240   +21][b:0][p:0.005]