Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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, не вызвав при этом его события 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.038 c
2-1132174399
DillerXX
2005-11-16 23:53
2005.12.04
Передача данных из DLL в главный процесс


2-1132227371
ramzes13
2005-11-17 14:36
2005.12.04
Как заменить Enter в ListBoxe


2-1132299591
Officeman
2005-11-18 10:39
2005.12.04
Как из одного ListView передать значение в другой ListView1


1-1131191838
ArtemESC
2005-11-05 14:57
2005.12.04
Как получить точку экрана?


3-1129634132
Juice
2005-10-18 15:15
2005.12.04
dbExpress - хорошо или плохо ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский