-
Здравствуйте! Вот такая проблема при работе кода
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 тому РадиоБаттону, который был выбран перед этим. Все работает, но почему то два раза подряд. Т.е. сообщение появляется два раза Подскажите, почему? Что не так?
-
Потому что при изменении свойства Checked у TRadioButton вызывается его метод Click. В принципе для устранения сей ситуации в VCL предусмотрено свойство TButtonControl.ClicksDisabled. Но оно (по крайней мере в моей Д2007) до сих пор сидит в protected.
-
Для устранения сей ситуации можно использовать свойство Tag как флаг, проверять в самом начале обработчика, если установлено - сбрасывать и выходить.
-
Я думаю, здесь с логикой построяния интерфейса что-то не то. Если элемент не должен срабатывать при каких то условиях, то надо при наступлении этих условий делать элемент disable := true, и при наступлении других - disable := false.
-
> Inovet © (25.02.17 08:18) [3]
лучше visible, иначе наличие неактивного контрола вызывает вопросы и размышления, чей-то он есть, а щелкнуть не могу, и придется сообщение об этом выводить иначе, либо после нажатия "итого", либо высвечивать какую-то label красную, если интерфейс громоздкий (т.е. до кнопки "итого" очень далеко). а если его нет - то и вопросов нет.
-
хотя, можно и disable и hint
-
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;
-
> Inovet © (25.02.17 08:18) [3] > > Я думаю, здесь с логикой построяния интерфейса что-то не > то.
Имхо, тут с логикой VCL что-то не то. Зачем при программном изменении свойства Checked вызывается метод Click?
-
> Германн © (26.02.17 02:40) [7]
да, это очень раздражало, вначале :) но когда знаешь об этом, то даже удобно.
-
> Германн © (25.02.17 02:24) [1]
> Но оно (по крайней мере в моей Д2007) до сих пор сидит > в protected.
Кого это может остановить.
type
THackRadioButton = class(TRadioButton);
..
THackRadioButton(RadioButton1).ClicksDisabled := True;
-- Regards, LVT.
-
> lewka © (25.02.17 01:26) > > т.е. должен возвращать checked тому РадиоБаттону, который > был выбран перед этим. > Все работает, но почему то два раза подряд. Т.е. сообщение > появляется два раза > > Подскажите, почему? Что не так?
Очевидно потому, что используется один обработчик на все RadioButton. Первый раз вызывается обработчик при реальном клике, а второй раз при
TsRadioButton(Components[i]).Checked:=True;
Просто нужно изменить логику.
-
А если так?
> 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;
-
> Leonid Troyanovsky © (26.02.17 17:07) [9] > > > > Германн © (25.02.17 02:24) [1] > > > Но оно (по крайней мере в моей Д2007) до сих пор сидит > > в protected. > > Кого это может остановить. >
Блин! Леонид, вы опять меня не поняли. О том как получить доступ к protected свойствам я узнал еще до появления интернета (в моей квартире). Я не понимаю почему то или иное свойство до сих пор находится в этой секции? Ещё точнее я понимаю почему. Потому что нынешним разработчикам Дельфи или их начальству это не интересно.
-
> Германн © (27.02.17 03:13) [12]. > почему то или иное свойство до сих пор находится в этой секции?
Может, отделение невинапишного?
-
> Kilkennycat © (27.02.17 12:38) [13] > > > > Германн © (27.02.17 03:13) [12]. > > почему то или иное свойство до сих пор находится в этой > секции? > > Может, отделение невинапишного? >
Не. Костя, вот таких недоделок в VCL много. Имхо, папаша Борланд и его потомки не очень хотят заниматься самой VCL. И я их отчасти понимаю.
-
> Германн © (28.02.17 02:08) [14]
Возможно. Когда начинал работать с Делфи, тож удивлялся и беспощадно правил генофонд - мне тогда казалось это лучшим решением :)
|