С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/32: Рейтинг темы: голосов - 32, средняя оценка - 4.88
4 / 4 / 0
Регистрация: 12.05.2012
Сообщений: 42
1

DbGridEh (или dbgrid) выделение правой кнопкой мыши

13.06.2012, 12:44. Показов 6077. Ответов 30
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день. Подскажите пожалуйста как выйти из подобной ситуации.
Есть DBGridEh, в нем включен мультиселект. При нажатии левой кнопки мыши - все ок. Выбранная строчка становится активной и добавляется в SelectedRows, но при нажатии правой кнопки по строчке - она подсвечивается, но не выбирается. Тоесть в SelectedRows не добавляется.

Проблема в следующем. Есть popup меню. Оно открывается по правой кнопке. И есть функция удалить, которая должна удалять выбранное (ые) строки. Как вы уже, наверное, догадались - она удаляет те строки которые выбраны с помощью левой кнопки мыши. Тоесть если я щелкну по строчке 1 левой, а потом по строчке 3 правой - откроется popup меню около 3й строчки. Я нажму кнопку Удалить, но удалиться не 3я, а 1я.

Как это исправить? Я думал через EntityAccessGrid->SelectedRows->CurrentRowSelected=true; , но не понял куда ее запихнуть. В событии CellClick не работает.

Подскажите пожалуйста, может вообще не в ту сторону пошел....

Добавлено через 2 минуты
Да, такая же ситуация, при смене выделенной строки с помощью стрелок на клавиатуре, или прокрутке колесиком мыши или ползунком.
Строки подсвечиваются, но не выбираются, следовательно в списке выделенных строк - NULL.
Надо чтоб подсвеченная строка - всегда была выбранной, ну или выбранная - всегда подсвеченная, а остальные не подсвечивались...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.06.2012, 12:44
Ответы с готовыми решениями:

Нажатие на пункт PopupMenu MenuItem по событию MenuItemClick правой или левой кнопкой мыши
Собственно никак не получается. Надо, чтобы по левой работал код пункта, а по правой только чекинг...

Перемещение объекта правой кнопкой мыши
Добрый день. Вопросик есть. Перемещаю панель по MouseDown if(Button == mbLeft) {...

Блокировка копирования и вставки правой кнопкой мыши
нужна функция не позволяющая вставлять (к примеру в Edit) правой кнопкой мыши. чтобы понятнее было...

Запрет клика правой кнопкой мыши в программе
Подскажите, пожалуйста, код.

30
20123 / 5690 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 3
13.06.2012, 12:46 2
При нажатии левой кнопки мыши - все ок. Выбранная строчка становится активной и добавляется в SelectedRows, но при нажатии левой кнопки по строчке - она подсвечивается, но не выбирается. Тоесть в SelectedRows не добавляется.
У вашей мыши - две левые кнопки ? И какие-то странные строчки.
0
4 / 4 / 0
Регистрация: 12.05.2012
Сообщений: 42
13.06.2012, 12:48  [ТС] 3
спасибо. поправил. во втором случае - правой кнопки
0
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
13.06.2012, 12:55 4
Цитата Сообщение от Od1Um Посмотреть сообщение
Тоесть если я щелкну по строчке 1 левой, а потом по строчке 3 правой - откроется popup меню около 3й строчки. Я нажму кнопку Удалить, но удалиться не 3я, а 1я.
Ну так зажми Ctrl и левой кнопкой мыши выбирай нужные строки, а потом на одной из выделенных строк вызывай свой попуп левой кнопкой мыши и удалиться. У меня лично так сделано. Это всё как в екселе.
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
13.06.2012, 12:58 5
Od1Um, а что если при обращении к DBGrid'у при нажатии правой кнопки эмулировать нажатие левой? Хотя это, наверное, бред.
Кстати, а выделяется ли строчка при зажатом ctrl + правая кнопка мыши?

Добавлено через 1 минуту
Sasha, я так понял тут вопрос стоит в том, чтобы сделать выделение и по правой кнопке. Т.е.:
Цитата Сообщение от Sasha Посмотреть сообщение
всё как в екселе.

Хотя вот в экселе выделение будет слетать, кстати, при правом щелчке.
Ок, а в DBGrid'е если просто одну строчку счелкнуть правой кнопкой мыши - выделение будет?
0
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
13.06.2012, 13:02 6
Я так и непонял зачем ему на правую делать выделение? Всю жизнь всё время делалось на левой

Добавлено через 12 секунд
И попуп на левой был
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
13.06.2012, 13:03 7
Sasha,
Цитата Сообщение от Sasha Посмотреть сообщение
Я так и непонял зачем ему на правую делать выделение?
Согласен, это ни к чему.
Разве что только для единственной строчки (как в екселе).

Цитата Сообщение от The_Immortal Посмотреть сообщение
Ок, а в DBGrid'е если просто одну строчку счелкнуть правой кнопкой мыши - выделение будет?
Добавлено через 29 секунд
Цитата Сообщение от Sasha Посмотреть сообщение
И попуп на левой был
О_о Необычное решение...
0
4 / 4 / 0
Регистрация: 12.05.2012
Сообщений: 42
13.06.2012, 13:12  [ТС] 8
Ну так зажми Ctrl и левой кнопкой мыши выбирай нужные строки, а потом на одной из выделенных строк вызывай свой попуп левой кнопкой мыши и удалиться. У меня лично так сделано. Это всё как в екселе.
Так так и сделано, но есть другой момент. Пользователь выбрал 2 строчки. Потом решил что надо удалить 5ю. Кликнул по ней. Появился попап. Он нажал удалить, а удалились выделенные, так как с них выделение не слетело, а та по которой он кликнул - подсветилась, но не выбралась.

Вот такую ситуацию я и хочу предотвратить.

Кстати, а выделяется ли строчка при зажатом ctrl + правая кнопка мыши?
Да выделяется и добавляется к уже выделенным. А если просто правой щелкнуть - то подсвечивается, но не выделяется и выделения с других строк не снимается

Я так и непонял зачем ему на правую делать выделение? Всю жизнь всё время делалось на левой
Надо выделение на правой, для того, чтоб если человек захотел удалить 1 единственную строчку, ему не надо было сначала кликнуть левой, чтоб выделить, потом правой, чтоб выбрать попап, а потом еще раз левой по кнопке "удалить".

А так же, как писалось выше, чтобы предотвратить момент, когда левой кликнул по 1й строчке выбрав ее, а потом решил удалить 4ю строчку. Кликнул по ней правой кнопкой - она подсветилось, вылезло попап. Нажал удалить. 4я осталась, а 1я удалилась.

Добавлено через 3 минуты
Пока сделал так

C++
1
2
3
4
5
6
7
8
9
10
void __fastcall TAccessRightsManager::EntityAccessGridMouseDown(
      TObject *Sender, TMouseButton Button, TShiftState Shift, int X,
      int Y)
{
 if (Button == mbRight)
 {
  EntityAccessGrid->SelectedRows->Clear();
  EntityAccessGrid->SelectedRows->CurrentRowSelected=true;
 }
}
только не знаю на сколько это потимально. Это же можно подвесить на переключение с помощью клавишь со стрелками...но вот насколько это удобно..
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
13.06.2012, 13:14 9
Od1Um,
Цитата Сообщение от Od1Um Посмотреть сообщение
Пользователь выбрал 2 строчки. Потом решил что надо удалить 5ю. Кликнул по ней. Появился попап. Он нажал удалить, а удалились выделенные, так как с них выделение не слетело, а та по которой он кликнул - подсветилась, но не выбралась.
То есть Вас не смущает, что в офисном приложении (MS Excel), такой реализации нет?

Добавлено через 1 минуту
Цитата Сообщение от Od1Um Посмотреть сообщение
Надо выделение на правой, для того, чтоб если человек захотел удалить 1 единственную строчку, ему не надо было сначала кликнуть левой, чтоб выделить, потом правой, чтоб выбрать попап, а потом еще раз левой по кнопке "удалить".
С этим соглашусь.
0
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
13.06.2012, 13:17 10
Цитата Сообщение от The_Immortal Посмотреть сообщение
Сообщение от Sasha
И попуп на левой был
Необычное решение...
На правой ошибся
0
4 / 4 / 0
Регистрация: 12.05.2012
Сообщений: 42
13.06.2012, 13:18  [ТС] 11
То есть Вас не смущает, что в офисном приложении (MS Excel), такой реализации нет?
а при чем тут вообще офисное приложение Excel?? Это эталон чтоли?)) И тем более я не делаю таблицу Excelе подобную. Таблицу использую как список пользователей из БД, ячейки редактировать нельзя. Так что не совсем понимаю к чему тут Excel)
0
20123 / 5690 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 3
13.06.2012, 13:19 12
вствьте в нажатие правой кнопки - код левой )))
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
13.06.2012, 13:20 13
Цитата Сообщение от LK Посмотреть сообщение
вствьте в нажатие правой кнопки - код левой )))
Ну вот я примерно аналогичное предлагал:

Цитата Сообщение от The_Immortal Посмотреть сообщение
а что если при обращении к DBGrid'у при нажатии правой кнопки эмулировать нажатие левой? Хотя это, наверное, бред.



Цитата Сообщение от Od1Um Посмотреть сообщение
а при чем тут вообще офисное приложение Excel?? Это эталон чтоли?))
Нифига себе... Почему бы и не эталон? Вот уж у этих ребят на мой взгляд с интерфейсной логикой все нормально. Хотя... Может я просто привык
0
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
13.06.2012, 13:23 14
В общем запустил я свой проект у меня так

ЗАЖИМАЮ CTRL И ЛЕВОЙ КНОПКОЙ МЫШИ ВЫБИРАЮ НУЖНЫЕ СТРОКИ ЗАТЕМ НА ОДНОЙ ИЗ ВЫДЕЛЕННЫХ СТРОК ПРАВОЙ КНОПКОЙ МЫШИ ВЫЗЫВАЮ КОНТЕКСТНОЕ МЕНЮ В КОТОРОМ ЕСТЬ УДАЛИТЬ И УДАЛЯЮТСЯ ВЫДЕЛЕННЫЕ СТРОКИ
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
13.06.2012, 13:27 15
Sasha, да это все понятно... Od1Um-то хочет не

Цитата Сообщение от Sasha Посмотреть сообщение
НА ОДНОЙ ИЗ ВЫДЕЛЕННЫХ СТРОК
А на любой другой не выделенной, и чтобы эта строка (в дополнение к предыдущим выделенным через левую кнопку + ctrl)
Цитата Сообщение от Sasha Посмотреть сообщение
ПРАВОЙ КНОПКОЙ
выделялась.


Od1Um, я Вас правильно понял?

Добавлено через 2 минуты
LK,
Цитата Сообщение от LK Посмотреть сообщение
вствьте в нажатие правой кнопки - код левой )))
Так а так мона? Тогда же попап всплывать не будет, т.к. он повешен же именно на правую кнопульку

Od1Um
Цитата Сообщение от Od1Um Посмотреть сообщение
Это эталон чтоли?))
Кстати, а 1С для Вас тоже не эталон?
0
4 / 4 / 0
Регистрация: 12.05.2012
Сообщений: 42
13.06.2012, 13:30  [ТС] 16
Od1Um, я Вас правильно понял?
Абсолютно
ЗАЖИМАЮ CTRL И ЛЕВОЙ КНОПКОЙ МЫШИ ВЫБИРАЮ НУЖНЫЕ СТРОКИ ЗАТЕМ НА ОДНОЙ ИЗ ВЫДЕЛЕННЫХ СТРОК ПРАВОЙ КНОПКОЙ МЫШИ ВЫЗЫВАЮ КОНТЕКСТНОЕ МЕНЮ В КОТОРОМ ЕСТЬ УДАЛИТЬ И УДАЛЯЮТСЯ ВЫДЕЛЕННЫЕ СТРОКИ
Так у меня тоже работает. Но надо именно нажать правой по выделенным. А если нажать не по ним? Если щелкнуть по строчке, которая не была выбранна левой кнопкой мышки, то она подсветится, появится попап, но он удалит выделенные ранее, а не ту, по которой щелкнули.


Еще раз. Написал такой код.
C++
1
2
3
4
5
6
7
8
9
10
void __fastcall TAccessRightsManager::EntityAccessGridMouseDown(
      TObject *Sender, TMouseButton Button, TShiftState Shift, int X,
      int Y)
{
 if ((Button == mbRight)&&(ssCtrl==false))
 {
  EntityAccessGrid->SelectedRows->Clear();
  EntityAccessGrid->SelectedRows->CurrentRowSelected=true;
 }
}
Тоесть при щелчке правой кнопкой, он снимает все выделения и выделяет строчку по которой щелкнули. Вроде работает. На сколько правильно? И будет ли правильно подвесить этот же код на нажатие клавиш стрелок на клавиатуре?
Ну тоесть выбрал 1ю строчку левой кнопкой. Потом пожмакал вниз стрелками. Подсветилась 5я строчка, а выбрана все еще 1я.
0
20123 / 5690 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 3
13.06.2012, 13:31 17
я имел ввиду, в OnMouseDown для TDBGrid , если кнопка - правая кнопка - делать свои дела.
0
4 / 4 / 0
Регистрация: 12.05.2012
Сообщений: 42
13.06.2012, 13:37  [ТС] 18
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void __fastcall TAccessRightsManager::EntityAccessGridMouseDown(
      TObject *Sender, TMouseButton Button, TShiftState Shift, int X,
      int Y)
{
 if ((Button == mbRight)&&(!Shift.Contains(ssCtrl)))
 {
  EntityAccessGrid->SelectedRows->Clear();
  EntityAccessGrid->SelectedRows->CurrentRowSelected=true;
 }
 if ((Button == mbRight)&&(Shift.Contains(ssCtrl)))
 {
  EntityAccessGrid->SelectedRows->CurrentRowSelected=true;
 }
}
В общем. Если левая кнопка нажата - то все штатно. Если правая - то снимаются выделения со всех строк, а та, по которой нажали - подсвечивается.
Если правая + Кнтрл, то выделения не снимаютяс, а та, по которой кликнули - добавляется к выделенным.

Как вам?

Добавлено через 1 минуту
Так. Тут другая проблема с этим кодом. Выбрали 5 строк. Щелкнули правой кнопкой по одной из выбранных 5ти, она осталась выделенной, остальные сняли свои выделения(

Добавлено через 1 минуту
Решил добавляением условия...
C++
1
2
if (EntityAccessGrid->SelectedRows->CurrentRowSelected==false)
 {
Вот полный вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
 if (EntityAccessGrid->SelectedRows->CurrentRowSelected==false)
 {
 if ((Button == mbRight)&&(!Shift.Contains(ssCtrl)))
 {
  EntityAccessGrid->SelectedRows->Clear();
  EntityAccessGrid->SelectedRows->CurrentRowSelected=true;
 }
 if ((Button == mbRight)&&(Shift.Contains(ssCtrl)))
 {
  EntityAccessGrid->SelectedRows->CurrentRowSelected=true;
 }
 }
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
13.06.2012, 13:40 19
Od1Um, я к чему веду разговоры про эталоны-то. Вы разрабатываете продукт для кого? Наверное не для себя лично, а для пользователей, так? Соответственно неплохо бы было ориентироваться на среднестатистического юзера (имеющего дело с офисными приложениями, в частности), который просто не будет ожидать такого приема И будет ли он приятно удивлен таким решением - бааальшой вопрос.

Ладно, надо закончить демагогию эту Меня просто уж очень затронула нелогичность этого решения

Добавлено через 1 минуту
Цитата Сообщение от Od1Um Посмотреть сообщение
В общем. Если левая кнопка нажата - то все штатно. Если правая - то снимаются выделения со всех строк, а та, по которой нажали - подсвечивается.
Если правая + Кнтрл, то выделения не снимаютяс, а та, по которой кликнули - добавляется к выделенным.
Как вам?
Кросавчег!
0
4 / 4 / 0
Регистрация: 12.05.2012
Сообщений: 42
13.06.2012, 13:40  [ТС] 20
Ладно, надо закончить демагогию эту Меня просто уж очень затронула нелогичность этого решения
А в чем нелогичность то? Если вы выбрали 4 строк, а потом щелкнули правой кнопкой по другой строке, не из тех что вы выбрали, разве не должно с них выделение сниматься? Или как?

В том же Exel так и работает. Выделите пару строк, а потом правой кнопкой щелкните по любой другой строчке, которая не выбрана вами ранее.

Все выделения снимаются, выделяется строчка, по которой вы щелкнули и высплывает popup. Разве нет? так почему мое желание сделать подобное - не логично?)
0
13.06.2012, 13:40
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.06.2012, 13:40
Помогаю со студенческими работами здесь

ListView. Выбор элемента при клике правой кнопкой мыши
Нужно, чтобы при клике правой кнопки мыши по элементу выбирался этот самый элемент TreeView. Как...

DataGridView выделение правой кнопкой мыши
Есть dataGridView1. У него есть свой contextMenuStrip1. При щелчке по невыделенной записи (стоит...

Выделение нодов в treeView правой кнопкой мыши
При клике правой кнопкой на необходимом ноде, происходит моргание, выделенным остается прежний...

Выделение элемента ListBox правой кнопкой мыши
Как в listbox организовать: действие при двойном клике мышью выделять елемент правой кнопкой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Блоги программистов
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
Полезные поделки на Arduino, которые можно сделать самому
raxper 06.01.2025
Arduino как платформа для творчества Arduino представляет собой удивительную платформу для технического творчества, которая открывает безграничные возможности для создания уникальных проектов. Эта. . .
Подборка решений задач на Python
IT_Exp 06.01.2025
Целью данной подборки является предоставление возможности ознакомиться с различными задачами и их решениями на Python, что может быть полезно как для начинающих, так и для опытных программистов. . . .
С чего начать программировать микроконтроллер­­ы
raxper 06.01.2025
Введение в мир микроконтроллеров Микроконтроллеры стали неотъемлемой частью современного мира, окружая нас повсюду: от простых бытовых приборов до сложных промышленных систем. Эти маленькие. . .
Из чего собрать игровой компьютер
inter-admin 06.01.2025
Сборка игрового компьютера требует особого внимания к выбору комплектующих и их совместимости. Правильно собранный игровой ПК не только обеспечивает комфортный геймплей в современных играх, но и. . .
Обновление сайта www.historian.b­y
Reglage 05.01.2025
Обещал подвести итоги 2024 года для сайта. Однако начну с того, что изменилось за неделю. Добавил краткий урок по последовательности действий при анализе вредоносных файлов и значительно улучшил урок. . .
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
Модель полного двоичного сумматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list): s=^y] p=x and y for i in range(1,len(x)): s. append((x^y)^p) p=(x and y)or(p and (x or y)) return s x=list() y=list()
Это мы не проходили, это нам не задавали...(аси­­­­­­­­­­­­­­­­­­­­х­р­о­н­н­ы­й счётчик с управляющим сигналом задержки).
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
Руководство по созданию бота для Телеграм на Python
IT_Exp 04.01.2025
Боты для Телеграм представляют собой автоматизированные программы, которые выполняют различные задачи, взаимодействуя с пользователями через интерфейс мессенджера. В данной статье мы рассмотрим,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru