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

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

13.03.2016, 18:43. Показов 2809. Ответов 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
33378 / 21502 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 11
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
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 Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru