Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Строки в ListBox  (Прочитано 5736 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Makson
Новенький

ru
Offline Offline

« : 30-05-2014 23:08 » 

Как сделать, чтобы при нажатии на строку в listbox выполнялось какое то действия? или подскажите, каким другим способом можно реализовать подобное действие со строками?
Записан
zubr
Команда клуба

by
Offline Offline
Пол: Мужской

« Ответ #1 : 31-05-2014 04:59 » 

В событии OnClick:
1. Определяем выбрана ли у нас строка if(ListBox1->ItemIndex == -1) - если не выбрана выходим из обработчика.
2. Определяем координаты курсора GetCursorPos
3. Выполняем метод TListBox::ItemAtPos с координатами курсора. Если он возвращает -1 - уходим, если индекс строки, сравниваем его с ListBox1->ItemIndex, если совпадает, выполняем нужный код.
Записан
Makson
Новенький

ru
Offline Offline

« Ответ #2 : 31-05-2014 06:22 » 

а вы не можете дать примерный код, я просто только начал изучать C++ Ага
Записан
zubr
Команда клуба

by
Offline Offline
Пол: Мужской

« Ответ #3 : 31-05-2014 07:03 » 

А открыть хелп с описанием указанных методов и MSDN с описанием функций слабо?
C++ здесь вообще не причем.
Записан
oktonion
Участник

ru
Offline Offline

« Ответ #4 : 06-10-2014 18:45 » 

1)
Кидаем на форму  (Form1):

TListBox - 1 шт.  (ListBox1)
TLabel    - 1 шт.  (Label1)

2)
На событие OnClick листбокса вешаем:

Код:
void __fastcall TForm1::ListBox1Click(TObject *Sender)
{
    if(ListBox1->ItemIndex > -1)//выбрана какая либо строка
        Label1->Caption = ListBox1->Items->Strings[ListBox1->ItemIndex];
}

3)
Кликаем по строчкам в листбоксе - текст в лэйбле меняется на текст активной позиции листбокса.

4)
voilà (вы восхитительны)

PS:
Формально говоря, если задача именно отловить только все клики мыши то нужно вешать на событие OnMouseDown к примеру:
Код:
void __fastcall TForm1::ListBox1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
    int indx = ListBox1->ItemAtPos(TPoint(X, Y), false);//индекс выбранной строки
    if(indx > -1)
        Label1->Caption = ListBox1->Items->Strings[indx];
}
« Последнее редактирование: 06-10-2014 19:02 от oktonion » Записан
zubr
Команда клуба

by
Offline Offline
Пол: Мужской

« Ответ #5 : 07-10-2014 11:47 » 

oktonion, касаемо п. 2, а если пользователь кликнет не на позиции строки, а вне, но в области Listbox?
Записан
oktonion
Участник

ru
Offline Offline

« Ответ #6 : 09-10-2014 09:13 » 

zubr ,
OnClick отрабатывает только при выборе существующей позиции. Если кликать на свободную область, то это событие не вызовется.
В случае с OnMouseDown клики будут обрабатываться по всей области листбокса.

Фактически вообще странно что событие называется OnClick. Его скорее стоило бы назвать OnSelect, так как вызываться оно будет при выборе позиции любым доступным способом (lmb click, enter, up/down key и т.д.). При том именно "клики" кнопками мыши обрабатываться не будут, кроме lmb click.
« Последнее редактирование: 09-10-2014 09:27 от oktonion » Записан
zubr
Команда клуба

by
Offline Offline
Пол: Мужской

« Ответ #7 : 09-10-2014 11:14 » 

zubr ,
OnClick отрабатывает только при выборе существующей позиции. Если кликать на свободную область, то это событие не вызовется.
В случае с OnMouseDown клики будут обрабатываться по всей области листбокса.

Фактически вообще странно что событие называется OnClick. Его скорее стоило бы назвать OnSelect, так как вызываться оно будет при выборе позиции любым доступным способом (lmb click, enter, up/down key и т.д.). При том именно "клики" кнопками мыши обрабатываться не будут, кроме lmb click.
oktonion, ты прав. Я ошибочно считал, что OnClick срабатывает на всей области листбокса.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines