Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.04;
Скачать: CL | DM;

Вниз

CheckBox   Найти похожие ветки 

 
~shaman~ ©   (2005-11-13 07:51) [0]

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


 
gdaujk ©   (2005-11-13 08:54) [1]

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


 
~shaman~ ©   (2005-11-13 09:02) [2]

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


 
Virgo_Style ©   (2005-11-13 09:22) [3]

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


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


 
gdaujk ©   (2005-11-13 10:26) [4]

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], выделив в отдельную процедуру.


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

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

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


 
Palladin ©   (2005-11-13 11:53) [6]


> 2Wish

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


 
gdaujk ©   (2005-11-13 11:57) [7]

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

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


 
Zeqfreed ©   (2005-11-13 15:29) [8]

~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 16:09) [9]

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;


 
checkbox   (2005-11-13 17:51) [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 17:56) [11]

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: Мой вариант лучше :-)))


 
Zeqfreed ©   (2005-11-13 18:39) [12]

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


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

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


 
sniknik ©   (2005-11-13 21:33) [14]

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

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


 
sniknik ©   (2005-11-13 21:36) [15]

к [14]


TCustomCheckBox.
...
property State: TCheckBoxState read FState write SetState default 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;


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

а гдк здесь вызывается 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;


 
gdaujk ©   (2005-11-14 07:51) [17]

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-15 05:21) [18]

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2005.12.04;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.03 c
4-1128064513
nevalex
2005-09-30 11:15
2005.12.04
КАК МНЕ ОРГАНИЗОВАТЬ МНОГОПОТОЧНЫЙ ПОИСК


6-1124950549
yasny
2005-08-25 10:15
2005.12.04
TIdSMTP получение поддтверждения о доставке


14-1131783496
Fin
2005-11-12 11:18
2005.12.04
Проблема с запуском среды.


2-1132010052
Canvas
2005-11-15 02:14
2005.12.04
Как нарисовать на канвасе полумесяц?


2-1132149166
йцукен
2005-11-16 16:52
2005.12.04
TextWidth только для моноширинных шрифтов?