![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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, по-моему...