| | | | |
VCL.TRadioButton.Автовыбор при получении фокуса в момент показа формы | Полный текст материала
Другие публикации автора: Cepгей Poщин
Цитата или краткий комментарий: «... При получении фокуса ввода контролом TRadioButton в момент отображения формы свойство Checked принимает значение True. ...» |
Важно:- Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
- Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
- Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.
Добавить свое мнение.
[TRadioButton] [Интерфейс. Компоненты и формы]
Отслеживать это обсуждение
Всего сообщений: 830-12-2005 05:46сообщение от автора материала 1) может без необходимости изменится фокус ввода;
2) неактивные кнопки могут активизироваться
3) замена стандартного модуля StdCtrls может привести к проблемам при смене версии Delphi 5.
1) Такова жизнь, но это, помоему, не большая жертва.
2) Нет, покрайней мере у себя я этого не обнаружил.
3) В стандартный модуль только добавлена внутрення процедура FocusChanged. Если её добавить в Delphi5, то проблемы это вряд ли вызовет, хотя конечно надо проверять. Пример у меня не компилируется. Delphi 5 виснет при его загрузке.
Возможно поможет удаление из папки проекта файлов dsk, cfg, dcu. Если нет, то вероятно дело в dfm.
P. S. Спасибо за пример - это вариант, как обойти камень. Я предлагаю убрать его с дороги :)
|
|
30-12-2005 04:51Очевидно, что камень существует. Вероятность его встретить на мой взляд велика.
Пример у меня не компилируется. Delphi 5 виснет при его загрузке.
Предлагаемое решение не плохое, но имеет на мой взляд ряд недостатков (существует ли идеальное решение?):
1) может без необходимости изменится фокус ввода;
2) неактивные кнопки могут активизироваться
3) замена стандартного модуля StdCtrls может привести к проблемам при смене версии Delphi 5.
Можеть быть при необходимости изменения RadioButton.Checked лучше пользоваться следующими процедурами?
procedure RadioButtonSetChecked(rb : TRadioButton; Value: Boolean);
var
Form: TCustomForm;
begin
rb.Checked := Value;
Form := GetParentForm(rb);
if (Form<>nil) and (Form.ActiveControl.Parent = rb.Parent) then
begin
if Value then
rb.SetFocus
else
Form.DefocusControl(rb, True);
end;
end;
procedure RadioGroupSetIndex(rg : TRadioGroup; Index : integer);
begin
rg.ItemIndex := Index;
Index := rg.ItemIndex;
if index>0 then RadioButtonSetChecked( rg.Controls[index] as TRadioButton, True);
end;
|
|
29-12-2005 04:43А чем это мой код неправильный, или это тоже вопрос принципа?
Вы можете делать как угодно. Например принудительно перед открытием устанавливаеть нужные значения
procedure TMainForm.Button1Click(Sender: TObject);
begin
FormDialog.RadioGroup1.ItemIndex:=0;
FormDialog.RadioButton1.Checked:=true;
FormDialog.ShowModal;
ClickTee(nil);
end; а после того, как диалог станет видимым будет выбран тот контрол, который имеет фокус ввода. Когда кнопка нажиматеся мышью, она получает фокус ввода и RadioButton`ы будут отображены правильно. Если нажимается клвиша Esc, или Alt+F4, или потомок TGraphicControl, или диалог закрывается каким-то иным способом не приводящим к потери фокуса RadioButton`ом, то при следующем открытии диалога этот RadioButton будет выбран не взирая на то, какое значение в него было установлено до этого! Если такое поведение Вы считаете правильным, то обратитесь к модераторам сайта и предложите исключить эту статью из списка камней.Сообщение не подписано |
|
29-12-2005 03:25При открытии — запоминаем, при закрытии восстанавливаем
Может должно быть наоборот, а? Запоминать при закрытии с условием mrOK. И всё это делать в главной форме?
Я принципиально не хочу править код — я хочу проверить правильный код, как это указано в статье. Резонно? |
|
28-12-2005 07:02сообщение от автора материала Я не знаю, может если всё это убрать и сделать нормальный модальный диалог — то никаких ошибок не будет… C этим трудно поспорить, вообще ни чего не делать, то вообще ни каких ошибок не будет.
В данном случае используется нормальный модальный диалог. При его открытии запоминаем состояние всех TRadioButton.
procedure TFormDialog.DoShow;
begin
inherited;
fOldItemIndex:=RadioGroup1.ItemIndex;
fOldItemIndexEx:=ItemIndexEx;
end; При его закрытии восстанавливаем состояние всех TRadioButton.
procedure TFormDialog.DoClose(var Action: TCloseAction);
begin
inherited;
if Action<>caNone then begin
RadioGroup1.ItemIndex:=fOldItemIndex;
ItemIndexEx:=fOldItemIndexEx;
end;
end;
При нажатии на кнопку "применить" меняются ранее сохраненные значения
procedure TFormDialog.Button2Click(Sender: TObject);
begin
fOldItemIndex:=RadioGroup1.ItemIndex;
fOldItemIndexEx:=ItemIndexEx;
Close;
end;
В конечном счете я хочу добиться простой вещи:
После того как я поменял что то в диалоге, решил, что мне это не нужно и закрыл его нажав кнопку "отмена" в следующий раз диалог должен отображаться в том виде, в каком он отображался до моих отмененных изменений.
По-моему ничего экстроординарного и нестандартного в этом нет. На примере видно, что поведение диалога меняется если нажимать кнопку "отмена", или клавишу Esc. Это кстати может привести к болшим непоняткам, если Вы привыкли нажмать кнопку мыши и видеть правильное поведение, а конечный пользователь привык нажимать клавишу Esc
|
|
28-12-2005 05:30Непонятно зачем нужен весь код в UnitDialog… Форма не удаляется, всё можно прочитать напрямую, непонятные перехваты событий Show, Close. Я не знаю, может если всё это убрать и сделать нормальный модальный диалог — то никаких ошибок не будет… |
|
28-12-2005 02:33сообщение от автора материала Честно говоря я не понял, какой код ненужный. В приведенном проекте только два модуля UnitMain и UnitDialog, которые занимают в сумме 7,5Кб. Еще в проект включены стандартные модули. Если пути у вас другие, то их надо исправить, или вообще удалить из проекта. Модуль StdCtrls.pas я предлагаю исправить. |
|
27-12-2005 04:12Так как в тестовом примере очень много ненужного кода, проверить его нет возможности. Сделайте пожалуйста пример, только с необходимым кодом. В архив dsk и cfg файлы класть не нужно. |
|
|
|