| 
| 
 | Вопрос # 363/ вопрос решён / | 
 |  Как сделать, чтобы галочки ставились в CheckListBox не только при нажатии на область пометки, но и при нажатии на название элемента?======================================
 Что напрашивалось сразу - я написал обработчик событий на OnClick и вроде заработало, но после этого при нажатии на область пометки - галочка появляется и сразу исчезает! Забавно так))) Прилагаю обработчик! Может както его модифицировать?
 Приложение:Переключить в обычный режим procedure TOtchForm3.CheckListBox1Click(Sender: TObject);begin CheckListBox1.Checked[CheckListBox1.ItemIndex]:= not
CheckListBox1.Checked[CheckListBox1.ItemIndex];end; 
|  |   Вопрос задал: RedMask (статус: Посетитель)Вопрос отправлен: 28 февраля 2007, 10:34
 Состояние вопроса: решён, ответов: 4.
 |  Ответ #1. Отвечает эксперт: Иусов Сергей Ник. Здравствуйте, RedMask!Забавный обработчик, думаю он войдет в анналы истори :)))
 
 Попробуй так:
 
 PS: Не проверял, могут быть ошибки в синтаксисе :)
 Приложение:Переключить в обычный режим procedure TOtchForm3.CheckListBox1Click(Sender: TObject);var  mes:string;begin if (Sender as TCheckListBox).Checked[(Sender as TCheckListBox).ItemIndex] then mes:=' checked'else mes:=' unchecked';ShowMessage('Item: "'+(Sender as TCheckListBox).Items[(Sender as
TCheckListBox).ItemIndex]+mes);end;
|  | Ответ отправил: Иусов Сергей Ник. (статус: 3-ий класс)Время отправки: 28 февраля 2007, 10:56
 Оценка за ответ: 4
 Комментарий к оценке: Ну не знаю, в чём я не правильно задал вопрос %)) |  Ответ #2. Отвечает эксперт: Роман Здравствуйте, RedMask!Вот работающий код.Нужно для проверки использовать State которое имеет 3 состояния:cbUnchecked-выключен,cbChecked-включен,cbGray-серое состояние. Приложение:Переключить в обычный режим procedure TForm1.CheckListBox1Click(Sender: TObject);begin if (Sender as TCheckListBox).State[(Sender as TCheckListBox).ItemIndex]=cbChecked then  (Sender as TCheckListBox).Checked[(Sender as TCheckListBox).ItemIndex]:=falseelse(Sender as TCheckListBox).Checked[(Sender as TCheckListBox).ItemIndex]:=true;end;
|  | Ответ отправил: Роман (статус: 5-ый класс)Время отправки: 28 февраля 2007, 11:41
 Оценка за ответ: 4
 Комментарий к оценке: Работает, если в  OnClickCheck поставить abort =) |  Ответ #3. Отвечает эксперт: Николай Рубан Единственное что могу еще дополнительно порекомендовать, так это просто пропишите в оба обработчика (Click и ClickCheck) одинаковые действия...
 Смотрите приложение.
 Удачи!!!
 Приложение:Переключить в обычный режим procedure TForm1.CheckListBox1Click(Sender: TObject);begin  if CheckListBox1.Selected[CheckListBox1.ItemIndex] then  CheckListBox1.Checked[CheckListBox1.ItemIndex]:= not
CheckListBox1.Checked[CheckListBox1.ItemIndex];end; procedure TForm1.CheckListBox1ClickCheck(Sender: TObject);begin  if CheckListBox1.Selected[CheckListBox1.ItemIndex] then  CheckListBox1.Checked[CheckListBox1.ItemIndex]:= not
CheckListBox1.Checked[CheckListBox1.ItemIndex];end;
|  | Ответ отправил: Николай Рубан (статус: 10-ый класс)Время отправки: 28 февраля 2007, 14:10
 Оценка за ответ: 5
 Комментарий к оценке: Я сделал что-то типо этого! Спасибо |  Ответ #4. Отвечает эксперт: Aymenel Здравствуйте, RedMask!var
 Flag: boolean;
 
 procedure TForm1.CheckListBox1Click(Sender: TObject);
 begin
 if not Flag then
 CheckListBox1.Checked[CheckListBox1.ItemIndex]:= not CheckListBox1.Checked[CheckListBox1.ItemIndex];
 Flag := False;
 end;
 
 procedure TForm1.CheckListBox1ClickCheck(Sender: TObject);
 begin
 Flag := True;
 end;
 
|  | Ответ отправил: Aymenel (статус: 2-ой класс)Время отправки: 28 февраля 2007, 19:39
 Оценка за ответ: 5
 Комментарий к оценке: Работающий вариант! :-) |  
 Мини-форум вопросаВсего сообщений: 5; последнее сообщение — 28 февраля 2007, 14:55; участников в обсуждении: 3. 
|   | RedMask (статус: Посетитель), 28 февраля 2007, 12:15 [#1]:Не могу пока поставить оценки пока, потому что. 
 -Иусов Сергей Ник, ваш обрабочик выдаёт сообщение уже после изменения статуса пометки, поэтому не могу использовать
 
 -Роман, ваш обработчик почему то также работает, как и мой! При нажатии на пометку галочка появляется и сразу исчезает
 |  
|   | Иусов Сергей Ник. (статус: 3-ий класс), 28 февраля 2007, 12:25 [#2]:Тогда: 1. Учимся правильно задавать вопросы
 2. Используем событие OnClickCheck
 |  
|   | Иусов Сергей Ник. (статус: 3-ий класс), 28 февраля 2007, 13:09 [#3]:Коментарий к коментарию (извините за тавтологию) к моему ответу. Вопрос был: Модифицировать обработчик.
 Обработчик был модифицирован, модификация вопрошающего не устроила. Возникает вопрос: почему? Наверное нужно было объяснить что требуется получить от модифицированного обработчика.
 |  
|   | RedMask (статус: Посетитель), 28 февраля 2007, 14:13 [#4]:Не очень хочу спорить, но вопрос был не модифицировать обработчик, а "Как сделать, чтобы галочки ставились в CheckListBox не только при нажатии на область пометки, но и при нажатии на название элемента?" - цитата оттуда! А дальше я просил "Может както его (обработчик)модифицировать?", но это не значит, что я на этом настаиваю! Важнее решить ситуацию, а способ предлагаете вы. Всё оказалось очень просто, в другом обработчике поставил Abort |  
|   | Роман (статус: 5-ый класс), 28 февраля 2007, 14:55 [#5]:procedure TForm1.CheckListBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 begin
 CheckListBox1ClickCheck(Sender);
 end;
 
 procedure TForm1.CheckListBox1ClickCheck(Sender: TObject);
 begin
 if (Sender as TCheckListBox).State[(Sender as TCheckListBox).ItemIndex]=cbChecked then
 (Sender as TCheckListBox).Checked[(Sender as TCheckListBox).ItemIndex]:=false
 else
 (Sender as TCheckListBox).Checked[(Sender as TCheckListBox).ItemIndex]:=true;
 end;
 
 procedure TForm1.CheckListBox1KeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
 begin
 try
 if Key = vk_Space then
 CheckListBox1ClickCheck(Sender) ;
 except
 on EListError do end;
 end;
 У меня работает.
 |  31 января 2011, 19:58: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |