Delphi: TabStop проблемы TRadioButton - PullRequest
5 голосов
/ 17 мая 2011

Когда TRadioButton имеет TabStop = True, это ведет себя очень странно.

Если вы попытаетесь переключить фокус между многими переключателями в форме с помощью клавиши Tab, вы сделаете это только 1 раз за сеанс приложения.Табулирование является односторонним, никогда не возвращаясь к первому переключателю.Кроме того, когда фокус перемещается между переключателями, они автоматически «проверяются».

Можно ли исправить это поведение без создания собственного компонента?

Я хочу, чтобы стандартные переключатели имели значение

  1. циклически переключать фокусировку
  2. запрещать переключателю радио проверять, когда на него приходит фокус (я хочу, чтобы мои пользователи проверяли его с помощью клавиши пробела)

Ответы [ 3 ]

1 голос
/ 17 мая 2011

Я нашел интересную статью Крейга Стунца об этой проблеме. Как я вижу, мне нужно создать свой собственный контроль, чтобы решить его.

1 голос
/ 18 мая 2011

Я понимаю, что вы работаете с существующим кодом, который является реальным ограничением, которое слишком часто игнорируется на этих форумах.

Похоже, флажки подойдут вам лучше. Вы можете применить исключительность, обычно ожидаемую от RadioButtons в событии OnChecked. Это должно решить ваши проблемы с табуляции / фокусировки и выбора / отмены выбора.

Флажки не будут автоматически проверяться при получении фокуса, и ваши пользователи могут отмечать / снимать их с помощью клавиши пробела.

1 голос
/ 17 мая 2011

Вы можете поместить код в событие OnEnter, чтобы не устанавливать флажок.
Вам нужно каким-то образом сохранить ранее выбранный RadioButton.

var
  SelectedRadioButton: TRadioButton;

//event shared by all radiobuttons
procedure TForm1.RadioButton1Enter(Sender: TObject);
begin
  if Sender <> SelectedRadioButton then begin
    SelectedRadioButton.Checked:= true;
  end;
end;

procedure TFrameOrder.RadioButton1Click(Sender: TObject);
begin
  SelectedRadioButton:= (Sender as TRadioButton);
end;

procedure TFrameOrder.RadioButton1KeyPress(Sender: TObject; var Key: Char);
var
  MyRadioButton: TRadioButton;
begin
  MyRadioButton:= (Sender as TRadioButton);
  if Key in [#32,#13] then begin 
    MyRadioButton.Checked:= true;
    RadioButton1Click(MyRadioButton);
  end; {if}
end;

Возможно, проще создать новый компонент TMyRadioButton, потому что это загромождает ваш обычный код.

...