Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 27.01.2016
Сообщений: 45

Запрет нажатия левой кнопки мыши на кнопке (C++ Builder 6)

13.03.2016, 18:43. Показов 3086. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно реализовать блокировку нажатия для левой кнопки мыши(если это возможно).
Кроме:
C++
1
if(Button == mbLeft) return;
ничего не знаю, да и он не работает.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.03.2016, 18:43
Ответы с готовыми решениями:

Клики левой кнопки мыши по таймеру, при зажатой левой кнопке мыши (user32.lib)
Уважаемые форумчане, взорвался мозг. Помогите. Есть одна, по мне, невыполнимая, задача, которую я уже очень долго не могу решить. Мне...

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

Имитация нажатия левой кнопки мыши
Нужна имитация нажатия левой кнопки мыши только для конкретного окна/программы, то есть не это: ...

22
1 / 1 / 0
Регистрация: 27.01.2016
Сообщений: 45
16.03.2016, 14:40  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Chelybey Посмотреть сообщение
Сообщение от volvo
Перед попыткой обращения к элементу массива, неплохо было бы всегда проверять, не вылетают ли индексы за его пределы (и не только при i == 0 и j == 0, при i == O-1 попытка обратиться к ...[i+1] тоже может окончиться плачевно)
Да проверка идёт. в строках 13, 15, 17, 19, 21, 23, 25, 27. но что-то всё равно не то. Буду проверять массив.

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
40
41
42
43
44
45
46
47
48
49
50
51
52
if(Button == mbLeft)
        {
                for(int i=0;i<U;i++)
                for(int j=0;j<O;j++)
                {
 
                        if(But[i][j]&&(i<U)&&(j<O))
                        if(But[i][j]->Tag !=1)
                        {
                                h = 0;
                                if(But[i-1][j-1]&&(i!=0)&&(j!=0))
                                        if(But[i-1][j-1]->Tag ==1) h++;
                                if(But[i-1][j]&&(i!=0)&&(j<O))
                                       if(But[i-1][j]->Tag   ==1) h++;
                                if(But[i-1][j+1]&&(i!=0)&&(j<O))
                                        if(But[i-1][j+1]->Tag ==1) h++;
                                if(But[i][j-1]&&(j!=0)&&(i<U))
                                        if(But[i][j-1]->Tag   ==1) h++;
                                if(But[i][j+1]&&(j<O)&&(i<U))
                                        if(But[i][j+1]->Tag   ==1) h++;
                                if(But[i+1][j-1]&&(i<U)&&(j!=0))
                                        if(But[i+1][j-1]->Tag ==1) h++;
                                if(But[i+1][j]&&(i<U)&&(i<O))
                                        if(But[i+1][j]->Tag   ==1) h++;
                                if(But[i+1][j+1]&&(i<U)&&(j<O))
                                        if(But[i+1][j+1]->Tag ==1) h++;
 
                                if(((TSpeedButton *)Sender)->Name == But[i][j]->Name)
                                {
                                        if((h == 0)||(((TSpeedButton *)Sender)->Spacing == 2))
                                                ((TSpeedButton *)Sender)->Caption = "";
                                        else
                                        {
                                                switch(h)
                                                {
                                                        case 1: ((TSpeedButton *)Sender)->Font->Color = clHotLight; break;
                                                        case 2: ((TSpeedButton *)Sender)->Font->Color = clGreen; break;
                                                        case 3: ((TSpeedButton *)Sender)->Font->Color = clRed; break;
                                                        case 4: ((TSpeedButton *)Sender)->Font->Color = clBlue; break;
                                                        case 5: ((TSpeedButton *)Sender)->Font->Color = clMaroon; break;
                                                        case 6: ((TSpeedButton *)Sender)->Font->Color = clTeal; break;
                                                        case 7: ((TSpeedButton *)Sender)->Font->Color = clPurple; break;
                                                        case 8: ((TSpeedButton *)Sender)->Font->Color = clBlack; break;
                                                }
                                                ((TSpeedButton *)Sender)->Caption = h;
                                        }
 
                            }
                        }
                }
              
          }

Теперь лучше, но в крайнем правом столбце накручивает от 1 до 2-х мин.

Добавлено через 2 минуты
Кажется, всё, ещё сейчас изменил массива с [30][30] до [31][31]. Теперь не накручивает.
Буду проверять остальные поля.

Добавлено через 1 минуту
Цитата Сообщение от volvo Посмотреть сообщение
Сообщение от Chelybey
Да проверка идёт
Не та проверка там идет. Ты проверяешь, есть ли работоспособный объект в ячейке. Но если индексы выходят за границы массива, то уже при попытке обратиться к этой ячейке (а не проверить ее содержимое) будет проблема (а если включен CodeGuard - то и вылет). Делать нужно как-то так:
C++Выделить код
1
2
if(j > 1 && i > 1 && But[j-1][i-1]) // сначала проверяем, что ячейка вообще существуют, потом - что в ней не NULL
// if(But[j-1][i-1]->Tag ==1) h++; // а тут уже спокойно обращаемся к полю объекта
Там, где используется "+", нужно сравнивать с верхней границей массива:
C++Выделить код
1
2
if(i < O-1 && But[j][i+1]) // если i будет равен O-1, то But[j][i+1] эквивалентно But[j][O], а это вылет за границу массива
* if(But[j][i+1]->Tag * ==1) h++;
Идея понятна?

Да уже сделал, только ты меня опередил)

Добавлено через 9 минут
Теперь осталось сделать нормальное определение, что все ячейки без мин открыты, чтобы завершить игру.
И по возможности авто открытие соседних полей без мин.(есть учебник по Builder в примерах, там есть сапер, от туда я и взял определение мин в соседних клетка, буду теперь в открытие пустых клеток разбираться ).
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33480 / 21578 / 8250
Регистрация: 22.10.2011
Сообщений: 37,041
Записей в блоге: 12
16.03.2016, 14:46
Chelybey, когда я пишу:
if(j > 1 && i > 1 && But[j-1][i-1]), это значит именно то, что я написал, а не if(But[j-1][i-1] && j > 1 && i > 1). От порядка записи операций сравнения зависит правильность работы кода. Сначала проверяем валидность индексов, и только потом - само содержимое ячейки. В моем варианте, если хотя бы одна из ячеек имеет невалидный индекс - то дальше ничего проверяться не будет (короткая схема вычисления логических выражений, один из операндов && равен false - дальше можно не проверять, результат уже false). В твоем коде опять вылетит ошибка, потому что сначала программа полезет в несуществующую ячейку.

Поменяй местами порядок проверок, иначе они бесполезны.
0
1 / 1 / 0
Регистрация: 27.01.2016
Сообщений: 45
16.03.2016, 14:49  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
Chelybey, когда я пишу:
if(j > 1 && i > 1 && But[j-1][i-1]), это значит именно то, что я написал, а не if(But[j-1][i-1] && j > 1 && i > 1). От порядка записи операций сравнения зависит правильность работы кода. Сначала проверяем валидность индексов, и только потом - само содержимое ячейки. В моем варианте, если хотя бы одна из ячеек имеет невалидный индекс - то дальше ничего проверяться не будет (короткая схема вычисления логических выражений, один из операндов && равен false - дальше можно не проверять, результат уже false). В твоем коде опять вылетит ошибка, потому что сначала программа полезет в несуществующую ячейку.
Поменяй местами порядок проверок, иначе они бесполезны.
Проверил, и так без ошибок, но раз ты советуешь так, то переделаю.
Просто я в этом разницы не увидел.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.03.2016, 14:49

Имитация нажатия левой кнопки мыши
Подскажите, как в Qt сгенерировать событие нажатия левой кнопки мыши?

Отлавливание нажатия левой кнопки мыши в Edit
Добрый вечер. Проблема в отлавливании нажатия левой кнопки мыши в Edit. Во всех остальных областях окна сообщение нажатия обрабатывать не...

Имитация нажатия левой и правой кнопки мыши
Тут на форуме просто свалка из таких тем, и везде мегаметоды для этого писать надо, Подскажите команду пожалуйста как иммитировать нажатие...

Hook для нажатия левой кнопки мыши
Подскажите пожалуйста как отследить нажатие левой кнопки мыши вне модального окна. Я так понимаю нужно писать Hook, был бы признателен за...

Симуляция нажатия левой кнопки мыши в другом окне
Есть программа (написана на C# - Windows form app) мне нужно послать нажатие лкм по координатам чтобы нажать, допустим, кнопку ...


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

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Новые блоги и статьи
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru