Главная Новые темы Список тем Задать вопрос Поиск  

Форум "Delphi"


Паскаль, Делфи


 #0 ID © 14.11.06 12:21:58 - 14.11.06 15:26:17

как отловить изменение TCheckBox



Здравствуйте!
Подскжите, как корректно отловить изменения (переход Checked из true в false и на оборот).
Мой вариант:

procedure TfrmMain.chbBDDisableClick(Sender: TObject);
begin
  if not chbBDDisable.Checked then
    begin
       edtNameBD.Enabled:=true;
       edtServerBD.Enabled:=true;
       edtPortConnect.Enabled:=true;
       speFindSMStoSend.Enabled:=true;
       chbAddSMSInFiles.Enabled:=true;
    end
   else
    begin
       edtNameBD.Enabled:=false;
       edtServerBD.Enabled:=false;
       edtPortConnect.Enabled:=false;
       speFindSMStoSend.Enabled:=false;
       chbAddSMSInFiles.Enabled:=false;
    end;
end;


проблема в том, что значение Checked меняется только после отработки события, и решение в этой ситуации я нашел , поставив if not ....
Есть ли другое решение? Цитата

 #1 Румпель © 14.11.06 12:35:40

Попробуй поиграться со свойством этого компонента - State
 #2 Старый маразматик © 14.11.06 12:50:25

вероятно, OnClick?
 #3 Румпель © 14.11.06 13:07:08

2#2  Старый маразматик  © 14.11.06 15:50:25

Ну... Для этого компонента OnClick как бы, вообще, самое основное событие. НО ! При щелчке на компоненте Checked и State уже приняли новое значение.
 #4 Чехонте 14.11.06 13:45:31

может onExit смотреть?
 #5 Старый маразматик © 14.11.06 13:50:40

>#3  Румпель ©

согласен, невнимательно прочел, чего надо.

ладно. можно и сложно. смотрим, шо творицца внутри:

procedure TCustomCheckBox.SetState(Value: TCheckBoxState);
begin
  if FState <> Value then
  begin
    FState := Value;
    if HandleAllocated then
      SendMessage(Handle, BM_SETCHECK, Integer(FState), 0);
    if not ClicksDisabled then Click;
  end;
end;

т.е., нам нужно отловить виндозное событие BM_SETCHECK, которое отправленно конкретному чекбоксу, как я понимаю. или написать свою компоненту.
 #6 ID © 14.11.06 13:51:49

Всем спасибо. Разобрался. Проблема была не в Checked, а в алгоритме программы.
В событии OnClick действительно Checked имеет актуальное значение.
 #7 Старый маразматик © 14.11.06 13:53:10

собстна, надо влезть как раз в TCustomCheckBox.SetState, шоб перехватывать изменение состояния. потому как перехватывать смысла нет - оно уже успеет изменицца чуть выше...
 #8 Румпель © 14.11.06 13:54:01

2#6  ID  © 14.11.06 16:51:49

Я в  #3  Румпель  © 14.11.06 16:07:08 забыл уже выделить.
Прости уж, меня, старого и склерозного
 #9 Старый маразматик © 14.11.06 13:54:16

>#6  ID ©

шоб тебя дождь намочил!
 #10 ID © 14.11.06 14:33:01

#9  Старый маразматик  ©
зато узнал много полезного из этого поста :)
 #11 Старый маразматик © 14.11.06 14:52:13

>#10  ID ©

про то, шо в VCL полезно заглядывать? гыгы
 #12 Kortez © 14.11.06 14:54:52

     

эта старинная грабля на самом деле является вполне логичной. кому интересно в обработчике знать старое состояние чека?
 #13 ID © 14.11.06 14:58:10

я не помню ситуацию (толи это было с другим компонентом, толи в другой среде разработки VB), но меня перемкнуло, что в событии onClick Checked меняется после отработки события, на этом и зациклился.
 #14 ID © 14.11.06 15:02:14

#12  Kortez  ©
действительно старинная грабля, что даже не помню, когда с этим сталкивался, а в голове осело, что там есть какойто подвох :)
 #15 Старый маразматик © 14.11.06 15:26:17

меня больше убивало, шо OnExit выполняецца только после того, как фокус уже перешел в другой контрол. хотя, в общем-то понятно, шо другим методом его не выполнишь, но все равно, весьма неудобно проверять введенные значения. поскоку в следующем контроле может стоять своя проверка. а каждую введенную буковку проверять - тоже не выход. короче, без пляски с бубном - ну никак!




  • Написать ответ

    Имя: Регистрация HTML?
    smiles смайлики
    Потом перейти в:    
    паутина



      ©  webest.net, 2002-2007  

    top.mail.ru
    » Бесплатный счетчик посещений
    » Рейтинг сайтов