Моральный_ehjl дата публикации 05-06-2008 06:47 | КАТЕГОРИЯ | | БИБЛИОТЕКА.VCL.Установка TRadioButton.Checked не всегда срабатывает | | ПРОДУКТ | | Delphi | | ПЛАТФОРМА | | Windows |
Неестественное поведение RadioButton в FormCloseQuery.
Используем две формы, помещаем несколько RadioButton на вторую форму, при её активации записываем состояние выбора в глобальную переменную. В открывшейся форме вручную изменяем выбор RadioButton's. При закрытии формы, в событии FormCloseQuery, читаем данные из глобальной переменной и возвращаем RadioButton's в исходное состояние. Активируем снова вторую форму, и вот тут происходит непонятное, RadioButton's возвращаются в состояние до закрытия формы. Получается, что в событии FormCloseQuery, у RadioButton's не изменилось состояние выбора?
procedure TForm2.FormActivate(Sender: TObject);
begin
if RadioButton1.Checked then N:=1
else if RadioButton2.Checked then N:=2
else if RadioButton3.Checked then N:=3;
end;
procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if N=1 then RadioButton1.Checked:=True
else if N=2 then RadioButton2.Checked:=True
else if N=3 then RadioButton3.Checked:=True;
end;
Просмотрим последовательность действий и значения в отладке:
выбран RadioButton1, сохранили состояние выбора в переменную N
RadioButton1.Checked=True
RadioButton2.Checked=False
N=1
выбран RadioButton2
RadioButton1.Checked=False
RadioButton2.Checked=True
N=1
закрытие формы, событие FormCloseQuery, в зависимости от значения N производим выбор
RadioButton1.Checked=True
RadioButton2.Checked=False
N=1
для активации второй формы, используем Form2.ShowModal
до вызова этой функции
RadioButton1.Checked=True
RadioButton2.Checked=False
N=1
после её вызова
RadioButton1.Checked=False
RadioButton2.Checked=True
N=2
Как мы видим, состояние RadioButton's изменилось, по неизвестной причине. Но, если разместить на форме CheckBox, проделать ту же цепочку действий, только перед закрытием формы изменить его состояние выбора - неестественного поведения RadioButton's не наблюдается, в случае, если мы меняем состояние выбора CheckBox.
Скачать пример:
StoneTest_107.zip
Проверено в D7. Действительно, эффект имеет место быть. При этом, состояние радиобаттонов в OnCloseQuery успешно изменяется, и остается правильным перед следующим ShowModal. Но к моменту OnActivate оно уже вернулось на предыдущее! Чекбокс в том же контейнере влияет не сам по себе, а там, что при его изменении не него переходит фокус. Если на радиобаттонах не было фокуса в момент OnCloseQuery, то задуманная программистом схема работает правильно.
Очевидно, при активации формы происходит восстановление фокуса, и это приводит к активации сфокусированного ранее радиобаттона, несмотря на то что он был программно выключен (включение одного радиобаттона приводит к выключению соседних).
В качестве решения можно предложить перед закрытием формы вместо включения радиобаттона переводить на него фокус.
[TRadioButton] [Получение/потеря фокуса]
Обсуждение материала [ 09-06-2008 02:32 ] 5 сообщений |