Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 363

/ вопрос решён /

Как сделать, чтобы галочки ставились в CheckListBox не только при нажатии на область пометки, но и при нажатии на название элемента?
======================================
Что напрашивалось сразу - я написал обработчик событий на OnClick и вроде заработало, но после этого при нажатии на область пометки - галочка появляется и сразу исчезает! Забавно так))) Прилагаю обработчик! Может както его модифицировать?

Приложение:
  1. procedure TOtchForm3.CheckListBox1Click(Sender: TObject);
  2. begin
  3. CheckListBox1.Checked[CheckListBox1.ItemIndex]:= not CheckListBox1.Checked[CheckListBox1.ItemIndex];
  4. end;
  5.  


RedMask Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: RedMask (статус: Посетитель)
Вопрос отправлен: 28 февраля 2007, 10:34
Состояние вопроса: решён, ответов: 4.

Ответ #1. Отвечает эксперт: Иусов Сергей Ник.

Здравствуйте, RedMask!
Забавный обработчик, думаю он войдет в анналы истори :)))

Попробуй так:

PS: Не проверял, могут быть ошибки в синтаксисе :)

Приложение:
  1. procedure TOtchForm3.CheckListBox1Click(Sender: TObject);
  2. var
  3. mes:string;
  4. begin
  5. if (Sender as TCheckListBox).Checked[(Sender as TCheckListBox).ItemIndex] then
  6. mes:=' checked'
  7. else
  8. mes:=' unchecked';
  9. ShowMessage('Item: "'+(Sender as TCheckListBox).Items[(Sender as TCheckListBox).ItemIndex]+mes);
  10. end;


Ответ отправил: Иусов Сергей Ник. (статус: 3-ий класс)
Время отправки: 28 февраля 2007, 10:56
Оценка за ответ: 4

Комментарий к оценке: Ну не знаю, в чём я не правильно задал вопрос %))

Ответ #2. Отвечает эксперт: Роман

Здравствуйте, RedMask!Вот работающий код.Нужно для проверки использовать State которое имеет 3 состояния:cbUnchecked-выключен,cbChecked-включен,cbGray-серое состояние.

Приложение:
  1. procedure TForm1.CheckListBox1Click(Sender: TObject);
  2. begin
  3. if (Sender as TCheckListBox).State[(Sender as TCheckListBox).ItemIndex]=cbChecked then
  4. (Sender as TCheckListBox).Checked[(Sender as TCheckListBox).ItemIndex]:=false
  5. else
  6. (Sender as TCheckListBox).Checked[(Sender as TCheckListBox).ItemIndex]:=true;
  7. end;


Ответ отправил: Роман (статус: 5-ый класс)
Время отправки: 28 февраля 2007, 11:41
Оценка за ответ: 4

Комментарий к оценке: Работает, если в OnClickCheck поставить abort =)

Ответ #3. Отвечает эксперт: Николай Рубан

Единственное что могу еще дополнительно порекомендовать, так это просто пропишите в оба обработчика (Click и ClickCheck) одинаковые действия...

Смотрите приложение.
Удачи!!!

Приложение:
  1. procedure TForm1.CheckListBox1Click(Sender: TObject);
  2. begin
  3. if CheckListBox1.Selected[CheckListBox1.ItemIndex] then
  4. CheckListBox1.Checked[CheckListBox1.ItemIndex]:= not CheckListBox1.Checked[CheckListBox1.ItemIndex];
  5. end;
  6.  
  7. procedure TForm1.CheckListBox1ClickCheck(Sender: TObject);
  8. begin
  9. if CheckListBox1.Selected[CheckListBox1.ItemIndex] then
  10. CheckListBox1.Checked[CheckListBox1.ItemIndex]:= not CheckListBox1.Checked[CheckListBox1.ItemIndex];
  11. 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

RedMask (статус: Посетитель), 28 февраля 2007, 12:15 [#1]:

Не могу пока поставить оценки пока, потому что.

-Иусов Сергей Ник, ваш обрабочик выдаёт сообщение уже после изменения статуса пометки, поэтому не могу использовать

-Роман, ваш обработчик почему то также работает, как и мой! При нажатии на пометку галочка появляется и сразу исчезает
Иусов Сергей Ник.

Иусов Сергей Ник. (статус: 3-ий класс), 28 февраля 2007, 12:25 [#2]:

Тогда:
1. Учимся правильно задавать вопросы
2. Используем событие OnClickCheck
Иусов Сергей Ник.

Иусов Сергей Ник. (статус: 3-ий класс), 28 февраля 2007, 13:09 [#3]:

Коментарий к коментарию (извините за тавтологию) к моему ответу.
Вопрос был: Модифицировать обработчик.
Обработчик был модифицирован, модификация вопрошающего не устроила. Возникает вопрос: почему? Наверное нужно было объяснить что требуется получить от модифицированного обработчика.
RedMask

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)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:27
Выполнено за 0.02 сек.