Проблема FormShow в Delphi 7 - PullRequest
       26

Проблема FormShow в Delphi 7

3 голосов
/ 07 ноября 2011

Я создал форму (Имя: SubForm) с двумя радиокнопками. На любом из переключателей нажмите другую форму (Имя: MainForm). Для события SubForm.OnShow я установил radiobutton1.checked:= False; radiobutton2.checked:= False;, но SubForm будет отображаться с установленным radiobutton1 или radiobutton2

Есть идеи, почему свойство selected не установлено в False?

1 Ответ

3 голосов
/ 08 ноября 2011

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

Во-вторых, совершенно правильно сбросить группу переключателей в невыбранное / непроверенное состояние.Для недавнего примера см. опция радио по умолчанию в диалоге отклонения редактирования .

Я воспроизвел вашу проблему, но у меня нет объяснения.Что происходит, когда вы снова показываете форму (вместо того, чтобы заново создавать ее), тогда сфокусированный элемент управления по-прежнему остается переключателем.Этот фокус как-то мешает изменить проверенное состояние. Кто-нибудь знает, почему?Я не могу найти его в источнике VCL.

Решение состоит в том, чтобы расфокусировать выбранный переключатель.Это можно сделать тремя способами в порядке предпочтения:

  • Сфокусируйте элемент управления, который появляется первым в списке порядка табуляции (что в любом случае является хорошей практикой):

    procedure TSubForm.FormShow(Sender: TObject);
    begin
      SelectFirst;
      RadioButton1.Checked := False;
      RadioButton2.Checked := False;
    end;
    
  • Но когда переключатель является первым элементом управления, установите фокус на саму форму:

      SetFocus;
      RadioButton1.Checked := False;
      ...
    
  • Или установите фокус на любой другой элемент управления весли имеет смысл:

      OKButton.SetFocus;
      RadioButton1.Checked := False;
      ...
    
...