Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
2 / 2 / 2
Регистрация: 13.03.2013
Сообщений: 107

PopUp меню для строк DBGrid

18.04.2013, 15:48. Показов 3247. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет, не могу сообразить как корректно организовать вызов контекстного меню для строк dbgrida. Нужно чтобы меню вызывалось только при щелчке на конкретной строке, при щелчке в пустом месте dbgrida ничего происходить не должно. Помогите кто чем может...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.04.2013, 15:48
Ответы с готовыми решениями:

Сабклассинг. Общее Popup меню для всех форм проекта
Возможно ли создать своё Popup меню, общее для всех TextBox'ов проекта, находящихся на разных формах? В пределах одной формы я умею...

Получить событие для показа popup меню под комментарием "события гаджетов"
Пытаюсь получить событие для показа popup меню под комментарием "события гаджетов", переделывал раз 30, то появлялось, но делало не то...

Popup меню
Нашел в интернете код для работы с этим меню, все работает как надо, кроме одного. Мне нужно, чтобы меню появлялось только тогда, когда я...

14
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
18.04.2013, 16:07
Проверку надо делать
0
2 / 2 / 2
Регистрация: 13.03.2013
Сообщений: 107
18.04.2013, 17:20  [ТС]
Что значит на пустоту строк? Строки либо есть, либо их нет. Пустыми они быть не могут в моем случае. Вот проверка на чем был щелчок очевидно нужна, только я не соображу как ее сделать.

Добавлено через 1 час 10 минут
Ребят, ну неужели никто не подскажет? Что-то вообще с этой темой беда в сети.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
18.04.2013, 17:25
Отлавливаете координаты мышиного курсора, если они совпадают с координатами вожделенной ячейки - выводите прыгающее меню, примеров сети - вагон и тележка.
0
2 / 2 / 2
Регистрация: 13.03.2013
Сообщений: 107
18.04.2013, 18:44  [ТС]
А можно ли как-то в обработчике OnPopup для контекстного меню перехватить его открытие и не отображать. Вызываю CloseMenu(), но меню все равно отображается потому, что OnPopup отрабатывает до фактической отрисовки. Не подскажете как быть?

Добавлено через 1 минуту
Вот текст моего OnPopup
C++
1
2
3
4
5
6
7
8
TPoint mousePos, clientPos;
    GetCursorPos(&mousePos);
    clientPos = DBGrid1->ScreenToClient(mousePos);
    TGridCoord mouseCoors = DBGrid1->MouseCoord(clientPos.x, clientPos.y);
 
    if (mouseCoors.X < 0 || mouseCoors.Y < 0) {
        PopupMenu1->CloseMenu();
    }
Добавлено через 3 минуты
т.е. если щелчок произошел вне ячеек грида, то меню отображать не надо...

Добавлено через 4 минуты
Цитата Сообщение от LK Посмотреть сообщение
Отлавливаете координаты мышиного курсора, если они совпадают с координатами вожделенной ячейки - выводите прыгающее меню, примеров сети - вагон и тележка.
Проблема в том, где собственно отлавливать эти координаты? Если onMouseDown, то она реагирует только на щелчки на пустом месте грида, если onCellClick, то он не отрабатывает для правой клавиши мыши. Может я что-то усложняю?Подскажите, пожалуйста...
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
18.04.2013, 18:59
угу... усложняете... ssRight ... if(Msg.message==WM_RBUTTONDOWN)
0
2 / 2 / 2
Регистрация: 13.03.2013
Сообщений: 107
18.04.2013, 21:23  [ТС]
Цитата Сообщение от LK Посмотреть сообщение
угу... усложняете... ssRight ... if(Msg.message==WM_RBUTTONDOWN)
Я искренне прошу прощения, но Вы как-то вырванно из контекста написали... видно мне опыта состыковать свое видение с Вашей подсказкой не хватает. Нельзя ли чуточку подробней?
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
18.04.2013, 21:36
master151, я имел ввиду, отслеживать положение курсора и нажатие правой кнопки манипулятора типа "мышь".
0
2 / 2 / 2
Регистрация: 13.03.2013
Сообщений: 107
18.04.2013, 21:43  [ТС]
Цитата Сообщение от LK Посмотреть сообщение
master151, я имел ввиду, отслеживать положение курсора и нажатие правой кнопки манипулятора типа "мышь".
Нет, это я как раз таки понял. А где его отслеживать Вы предлагаете? Вне обработчиков событий DBGrid?
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
18.04.2013, 21:45
вот так
C++
1
2
3
4
5
6
7
8
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  TPoint point;
  GetCursorPos(&point);
  AnsiString pos;
  pos.sprintf("[%d;%d]",point.x,point.y);
  Label1->Caption = pos;
};
можно отслеживать положение курсора, но в вашем случае таймер не нужен, достаточно проверить положение при нажатии желаемой клавиши манипулятора, дальше смотрите, куда эти координаты попадают.

Связь с интернетом - Чтобы избавиться от MouseDown
C++
1
2
int x=Form1->ScreenToClient(Mouse->CursorPos).x;
int y=Form1->ScreenToClient(Mouse->CursorPos).y;
0
2 / 2 / 2
Регистрация: 13.03.2013
Сообщений: 107
18.04.2013, 21:51  [ТС]
То есть повесить обработчик onMouseDown на всю форму и в нем отлавливать щелчки правой мыши на строках грида, я правильно понял?
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
18.04.2013, 21:57
видимо, всё проще - вы ведь знаете, каким условиям должна удовлетворять строка -
Цитата Сообщение от master151 Посмотреть сообщение
только при щелчке на конкретной строке
- удовлетворяет - показываете попап, т.е., обычное if -
Цитата Сообщение от Sasha Посмотреть сообщение
Проверку надо делать
0
2 / 2 / 2
Регистрация: 13.03.2013
Сообщений: 107
19.04.2013, 11:25  [ТС]
Цитата Сообщение от LK Посмотреть сообщение
видимо, всё проще - вы ведь знаете, каким условиям должна удовлетворять строка - - удовлетворяет - показываете попап, т.е., обычное if -
Мне кажется Вы меня немного неверно поняли. Контекстное меню нужно отображать если щелчок был на строке, без условий просто на любой строке с данными. Но меню не должно появляться (а лучше если будет появляться другое меню) при щелчке на гриде ПУСТОМ месте грида, где строк нет.

Добавлено через 44 минуты
Цитата Сообщение от LK Посмотреть сообщение
видимо, всё проще - вы ведь знаете, каким условиям должна удовлетворять строка - - удовлетворяет - показываете попап, т.е., обычное if -
Не могли бы Вы попутно подсказать как можно в событии onCellClick отловить нажатие правой кнопки или оно отрабатывает только для левой?

Добавлено через 12 часов 38 минут
Цитата Сообщение от master151 Посмотреть сообщение
Мне кажется Вы меня немного неверно поняли. Контекстное меню нужно отображать если щелчок был на строке, без условий просто на любой строке с данными. Но меню не должно появляться (а лучше если будет появляться другое меню) при щелчке на гриде ПУСТОМ месте грида, где строк нет.

Добавлено через 44 минуты

Не могли бы Вы попутно подсказать как можно в событии onCellClick отловить нажатие правой кнопки или оно отрабатывает только для левой?
Я наконец то понял, Вы имели ввиду функцию WindowProc(TMessage &msg)? Я просто только что познакомился с ней
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
19.04.2013, 11:41
Вот как я когда -то делал
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
void __fastcall TMainForm::NewDBWindowProc(TMessage &msg)
{
       if(msg.Msg == WM_RBUTTONDOWN) // Нажали правую кнопку мыши ?
    {
         if(ADOQuery1->RecordCount!=0)
          {
           if(DBGrid1->SelectedRows->Count > 0)
          {
            TPoint P = TPoint(msg.LParamLo, msg.LParamHi);
        P = DBGrid1->ClientToScreen(P);
        PopupMenu3->Popup(P.x, P.y); // Показываем popup в области грида
                msg.Result = 0; // Сообщение обработано ...
        return;     // Уходим
          }
           else
          {
           AnsiString ert = "\t\t\tНе выделена ни одна строка в базе!!!!!!!!\n\nДля копирования или перемещения строк в базе, зажмите клавишу Ctrl на клавиатуре и выберите необходимые строки левой кнопкой мыши, а затем нажмите на правую кнопку мыши для вызова контекстного меню\n\nДля снятия выделения строк используйте клавишу Esc";
          if (Application->MessageBox(ert.c_str(),"Предупреждение",MB_OK +MB_TOPMOST+ MB_ICONEXCLAMATION)==IDOK)
          {
            return;
          }
         }
        }
    }
    OldDBWindowProc(msg); // Обрабатываем остальные сообщения
}
 
void __fastcall TMainForm::FormCreate(TObject *Sender)
{
        OldDBWindowProc = DBGrid1->WindowProc;
        DBGrid1->WindowProc = NewDBWindowProc;
}
 
 
//в h-файле
private:
 
        TWndMethod OldDBWindowProc;
    void __fastcall NewDBWindowProc(TMessage&);
1
2 / 2 / 2
Регистрация: 13.03.2013
Сообщений: 107
19.04.2013, 12:27  [ТС]
Цитата Сообщение от Sasha Посмотреть сообщение
Вот как я когда -то делал
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
void __fastcall TMainForm::NewDBWindowProc(TMessage &msg)
{
       if(msg.Msg == WM_RBUTTONDOWN) // Нажали правую кнопку мыши ?
    {
         if(ADOQuery1->RecordCount!=0)
          {
           if(DBGrid1->SelectedRows->Count > 0)
          {
            TPoint P = TPoint(msg.LParamLo, msg.LParamHi);
        P = DBGrid1->ClientToScreen(P);
        PopupMenu3->Popup(P.x, P.y); // Показываем popup в области грида
                msg.Result = 0; // Сообщение обработано ...
        return;     // Уходим
          }
           else
          {
           AnsiString ert = "\t\t\tНе выделена ни одна строка в базе!!!!!!!!\n\nДля копирования или перемещения строк в базе, зажмите клавишу Ctrl на клавиатуре и выберите необходимые строки левой кнопкой мыши, а затем нажмите на правую кнопку мыши для вызова контекстного меню\n\nДля снятия выделения строк используйте клавишу Esc";
          if (Application->MessageBox(ert.c_str(),"Предупреждение",MB_OK +MB_TOPMOST+ MB_ICONEXCLAMATION)==IDOK)
          {
            return;
          }
         }
        }
    }
    OldDBWindowProc(msg); // Обрабатываем остальные сообщения
}
 
void __fastcall TMainForm::FormCreate(TObject *Sender)
{
        OldDBWindowProc = DBGrid1->WindowProc;
        DBGrid1->WindowProc = NewDBWindowProc;
}
 
 
//в h-файле
private:
 
        TWndMethod OldDBWindowProc;
    void __fastcall NewDBWindowProc(TMessage&);
Вот это да, сам бы не додумался, спасибо огромное
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.04.2013, 12:27
Помогаю со студенческими работами здесь

popup меню в lotus
Подскажите пожалуйста. Мне необходимо в дизайнере в окне редактирования кода добавить свой строку в попапе. При нажатии на которую будет...

Исчезновение Popup-меню
При проходе мыши по некоторой области окна вызываю Popup-меню (пользуюсь WM_MOUSEMOVE). Как сделать, чтобы при выходе мыши за пределы...

Вопрос по Popup-меню
Привет всем! Столкнулся вот с какой задачей: необходимо программно выбрать определенный пункт всплывающего (Popup) меню, конкретнее -...

Режим появления PopUp меню
Как лучше сделать, чтобы когда в ListView щелкали правой кнопкой мыши по строке выпадало PopUp меню, а когда по пустому месту то...

Как ограничить высоту Popup-меню програмно???
Subj в следующем: Все кто работал с API-шным Popup-меню знают - если его высота перекрывает высоту видимой области на нем появляются...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru