Форум: "Начинающим";
Текущий архив: 2005.12.04;
Скачать: [xml.tar.bz2];
Вниз
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, не вызвав при этом его события onClickForm1.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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.038 c