Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Изменить поведение при нажатии для TRadioButton или TComboBox

Delphi , Компоненты и Классы , Флажки

Изменить поведение при нажатии для TRadioButton или TComboBox

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

// Q: It appears that programatically setting Item.Index for the Radio Button 
// fires the onClick event.  It also appears  doing the same for the 
// ComboBox does NOT fire the OnClick event. Does another property the two 
// control effect this behavior. 

// A: No, it is caused by the way Windows sends the notifications that fire the 
// event when the control state is changed by a program action. 

// Q: I have an instance where I need each of 
// the control to exhibit the opposite behavior. 

// A: For a TRadiobutton you can disconnect the OnClick handler, change the 
// state, then reconnect the handler. 

procedure ChangeRadiobuttonState(ARadiobutton: TRadiobutton;
   checkit: Boolean);
 var
   oldhandler: TNotifyEvent;
 begin
   oldhandler := ARadiobutton.Onclick;
   ARadiobutton.Onclick := nil;
   ARadiobutton.Checked := checkit;
   ARadiobutton.OnClick := oldhandler;
 end;


 // To make the combobox "click" after setting the item index simply call its 
// Click method. The control inherits this method from TControl, but it is 
// protected. So you need a bit of hoop-jumping: 

Type
   TComboCracker = class(TCombobox);

 procedure SetComboboxIndex(ACombobox: TCombobox; Index: Integer);
 begin
   ACombobox.ItemIndex := Index;
   TCombocracker(ACombobox).Click;
 end;

Текст переведен на русский язык:

Код, предоставленный ниже, является решением проблемы программного изменения состояния TRadioButton или TComboBox без вызова соответствующего события.

Для TRadioButton, когда вы изменяете свойство Checked программно, оно вызывает событие OnClick. Для избежания этого поведения можно отключить обработчик OnClick, изменить состояние и затем снова подключить обработчик. Это достигается в процедуре ChangeRadiobuttonState следующим образом:

  1. Сохранение текущего обработчика OnClick в переменной oldhandler.
  2. Отключение обработчика OnClick, установка его в nil.
  3. Изменение свойства Checked TRadioButton.
  4. Восстановление обработчика OnClick с помощью сохраненного старого обработчика.

Для TComboBox, когда вы изменяете свойство ItemIndex программно, оно не вызывает событие OnClick. Для имитации клика для TComboBox нужно вызвать метод Click. Однако, этот метод защищен и не может быть доступен напрямую. Чтобы преодолеть это ограничение, создается новый класс TComboCracker, который наследуется от TCombobox. Процедура SetComboboxIndex использует этот класс для изменения свойства ItemIndex TComboBox и затем вызывает метод Click.

Код можно улучшить добавлением обработки ошибок и валидации параметров входных данных. Например, вы можете проверять, является ли индекс ввода в диапазоне допустимых значений перед изменением свойства ItemIndex TComboBox.

Вот обновленная версия кода с некоторыми улучшениями:

type
  TComboCracker = class(TCombobox);

procedure SetComboboxIndex(ACombobox: TCombobox; Index: Integer);
begin
  if Index >= 0 then // Валидация индекса ввода
    begin
      ACombobox.ItemIndex := Index;
      TComboCracker(ACombobox).Click;
    end
  else
    raise Exception.Create('Недопустимый индекс');
end;

procedure ChangeRadiobuttonState(ARadiobutton: TRadiobutton; checkit: Boolean);
var
  oldhandler: TNotifyEvent;
begin
  if Assigned(ARadiobutton.OnClick) then // Валидация обработчика OnClick
    begin
      oldhandler := ARadiobutton.OnClick;
      ARadiobutton.OnClick := nil;
      ARadiobutton.Checked := checkit;
      ARadiobutton.OnClick := oldhandler;
    end
  else
    raise Exception.Create('Нет обработчика OnClick');
end;

В обновленной версии я добавил обработку ошибок с помощью исключений для обработки недопустимых индексов ввода и неиспользуемых обработчиков OnClick. Это делает код более устойчивым и удобным в использовании.

Изменение поведения при нажатии для TRadioButton или TComboBox может быть достигнуто программными способами, изменяющими состояние контрола и временно отключая обработчик событий.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Флажки ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-24 19:55:19/0.0036969184875488/0