Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

CheckBox [D7, WinXP]


~shaman~ ©   (2005-11-13 07:51:00) 

Подскажите, как программно изменить состояние CheckBox, не вызвав при этом его события onClick.


alex_***   (2005-11-15 10:18:00) [1]

во многих случаях как раз функциональность кнопки из 2-х состояний


ASoft   (2005-11-15 05:21:00) [2]

имхо, смысл решения должен сводиться к тому, чтобы не навешивать на процедуру клика по чекбоксу ничего серьезного, а проверять состояние чекбокса после, ведь это же не кнопка


gdaujk   (2005-11-14 07:51:00) [3]

ASoft   (14.11.05 04:46) [16]
а гдк здесь вызывается onClick?


В твойм примере нигде, ты это свойство считывашь, а не изменяешь:

type
 TCustomCheckBox = class(TButtonControl)
 ...
 protected
 property State: TCheckBoxState read FState write SetState default cbUnchecked;
 ...
 end;


Zeqfreed ©   (13.11.05 18:39) [12]
Ты не понял идеи моего решения ;)


Точно, по началу не понял... Только от этого оно лучше не стало :-)

PS: Хватит разводить болтавню. Я думаю, всё чно нужно было автору, уже написано...


ASoft   (2005-11-14 04:46:00) [4]

а гдк здесь вызывается onClick?
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
ShowMessage('Checking');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
case CheckBox1.state of
 cbChecked: ShowMessage('check');
 cbUnchecked: ShowMessage('Uncheck');
end;
end;


sniknik   (2005-11-13 21:36:00) [5]

к [14]


TCustomCheckBox.
...
property State: TCheckBoxState read FState write SetStatedefault cbUnchecked;
...

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;


sniknik   (2005-11-13 21:33:00) [6]

on-lite ©   (13.11.05 21:03) [13]
> Можно и так
> checkbox.state:=cbChecked;//будет галочка
> ...

галочка то может и будет, но смысл события onClick не допустить...
читайте ранее написанное.
решения, и не одно, уже были, а ваш пост решением не является.


on-lite   (2005-11-13 21:03:00) [7]

Можно и так
checkbox.state:=cbChecked;//будет галочка
checkbox.state:=cbUnchecked;//не будет галочки
:)
есть еще и третий параметр но он врятли тебе пригодится


Zeqfreed   (2005-11-13 18:39:00) [8]

gdaujk ©   (13.11.05 16:09) [9]
Ты не понял идеи моего решения ;)


gdaujk   (2005-11-13 17:56:00) [9]

checkbox   (13.11.05 17:51) [10]

Можно и так, но нужно заменить

if CheckBox1.Checked=false then CheckBox1.Checked:=true
   else CheckBox1.Checked:=false;


на

CheckBox1.Checked := not CheckBox1.Checked.

PS: Мой вариант лучше :-)))


checkbox   (2005-11-13 17:51:00) [10]

procedure TForm1.Button1Click(Sender: TObject);
begin
 CheckBox1.OnClick:=nil;

 if CheckBox1.Checked=false then CheckBox1.Checked:=true
    else CheckBox1.Checked:=false;

 CheckBox1.OnClick:=CheckBox1Click;
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
 caption:='';
end;


gdaujk   (2005-11-13 16:09:00) [11]

Zeqfreed ©   (13.11.05 15:29) [8]

По-моему не надо переписывать SetCheck. Всё проще:

type
 THackCheckBox = class(TCheckBox)
 private
   constructor Create(AOwner: TComponent); override;
 end;

...

implementation

constructor THackCheckBox.Create(AOwner: TComponent);
begin
 inherited;
 ClicksDisabled := True;
end;


Zeqfreed   (2005-11-13 15:29:00) [12]

~shaman~ ©   (13.11.05 7:51)

type
 THackCheckBox = class(TCheckBox)
 private
  procedure SetCheck(const Check : Boolean);
  property ClicksDisabled;
 end;

 ...

implementation

procedure THackCheckBox.SetCheck(const Check : Boolean);
var
 os : Boolean;
begin
 os := ClicksDisabled;
 ClicksDisabled := true;

 Checked := Check;

 ClicksDisabled := os;
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
 ShowMessage('Check box was clicked');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 THackCheckBox(Checkbox1).SetCheck(true);
end;


gdaujk   (2005-11-13 11:57:00) [13]

2Wish   (13.11.05 11:23) [5]
Чо то ты слишком загнул =)

Это у меня хобби такое - по мере возможности делать код чужих программ более громостким...


Palladin   (2005-11-13 11:53:00) [14]


> 2Wish

а выше почитать?


2Wish   (2005-11-13 11:23:00) [15]

gdaujk
Чо то ты слишком загнул =)

>Подскажите, как программно изменить состояние CheckBox, не вызвав при этом его события onClick
Form1.Checkbox1.checked := true;


gdaujk   (2005-11-13 10:26:00) [16]

Virgo_Style ©   (13.11.05 09:22) [3]
по-другому не получится


Сделать-то можно вот так:

procedure gdaSetCheckState(CheckBoxHandle: HWND; CheckState: TCheckBoxState);
begin
 SendMessage(CheckBoxHandle, BM_SETCHECK, Integer(CheckState), 0);
end;


Но при этом не меняется поле FState CheckBox'а, а следовательно при последующем использовании CheckBox становится нерабочим :-))

Так что можно предложить три варианта:

1.Писать потомок CheckBox'а. При этом опубликовать свойство ClicksDisabled (protected). Если сделать его равным True, при смене Checkbox.Checked не будет вызываться OnClick. Сам не пробовал.

2.
Перенести в OnMouseDown (OnMouseUp) то, что делается в OnClick. Сам пробовал :-).

3.Virgo_Style ©   (13.11.05 09:22) [3], выделив в отдельную процедуру.


Virgo_Style   (2005-11-13 09:22:00) [17]

temp:=CheckBox.OnClick;
CheckBox.OnClick:=nil;
...
CheckBox.OnClick:=temp;


afaik, по-другому не получится.


~shaman~   (2005-11-13 09:02:00) [18]

нет
так оно как раз и вызывается...


gdaujk   (2005-11-13 08:54:00) [19]

Checkbox.Checked, по-моему...


Наверх

Титульная страница Поиск, карта сайта Написать письмо