Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Подводные камни
  
О разделе

Список по категориям
Общий список

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
 
 19:50 Fox
 
 
Во Флориде и в Королевстве сейчас  19:50[Войти] | [Зарегистрироваться]

БИБЛИОТЕКА.VCL.Установка TRadioButton.Checked не всегда срабатывает

Моральный_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
//при закрытии, возвращаем выбор RadioButton's в исходное состоние
  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 сообщений
  
Время на сайте: GMT минус 5 часов

Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Функция может не работать в некоторых версиях броузеров.

Хостинг предоставлен компанией DOTNETPARK (ASP.NET, MS SQL hosting)  

 
© При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
Все используемые на сайте торговые марки являются собственностью их производителей.

Яндекс цитирования