2 / 2 / 2
Регистрация: 29.09.2012
Сообщений: 444

Событие MouseMove при нажатой кнопке

10.01.2015, 01:03. Показов 10994. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте уважаемые программисты.

Вот есть такой код:
Pascal
1
2
3
4
5
6
7
8
9
10
procedure TForm1.Panel1MouseLeave(Sender: TObject);
begin
 Panel2.Visible:= False;
end;
 
procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 Panel2.Visible:= True;
end;
При наводе корсора на Panel1 появляется Panel2, а при уводе курсора - исчезает.
Но дело в том, что если нажать левую кнопку мышки и потом навести, то ничего не происходит, в то время как с нажатой правой кнопкой всё работает.

Подскажите пожалуйста как это побороть, чтобы и при нажатой левой кнопки мышки выполнялись данные действия?


пс Проект компилировал в делфи хе2.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.01.2015, 01:03
Ответы с готовыми решениями:

Рисование при нажатой кнопке мыши
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Canvas.MoveTo(X,Y);...

Как поменять указатель мыши при нажатой левой кнопке?
Мне надо, чтобы при нажатии левой кнопки мыши менялся значек указателя. Как это реализовать?

Как обработать прокрутку мыши при нажатой кнопке Ctrl
Если конкретно, я хочу увеличивать/уменьшать изображение в TImage, если пользователь зажал ctrl и прокрутил колесико вверх/вниз ...

18
 Аватар для virtual[ity]
165 / 143 / 66
Регистрация: 05.06.2010
Сообщений: 641
10.01.2015, 02:00
На MouseEnter с проверкой типа если панель 2 видна то спрятать, если нет, то показать.
Ты там хинты( или инфо панели) изобретаешь? Если не секрет?
0
пофигист широкого профиля
4761 / 3197 / 861
Регистрация: 15.07.2013
Сообщений: 18,553
10.01.2015, 02:10
Цитата Сообщение от Cannon1 Посмотреть сообщение
Вот есть такой код:
Цитата Сообщение от Cannon1 Посмотреть сообщение
а при уводе курсора - исчезает.
При уводе курсора это событие OnMouseLeave, а вовсе никакой не OnMouseMove
0
2 / 2 / 2
Регистрация: 29.09.2012
Сообщений: 444
10.01.2015, 02:13  [ТС]
Да не, это я для себя.

Так Ваш совет не работает, вопрос стоит о отом, чтобы события MouseMove и MouseLeave срабатывали при нажатой
левой кнопки мышки, а они не работают, пока не отпустишь кнопку.

Добавлено через 2 минуты
northener
Вы о чем, посмотрите мой код.

Как можно заставить реагировать OnMouseMove и OnMouseLeave при зажатой левой кнопки мышки?
0
пофигист широкого профиля
4761 / 3197 / 861
Регистрация: 15.07.2013
Сообщений: 18,553
10.01.2015, 02:31
Цитата Сообщение от Cannon1 Посмотреть сообщение
Как можно заставить реагировать OnMouseMove и OnMouseLeave при зажатой левой кнопки мышки?
Кстати OnMouseEnter тоже не срабатывает если лкм нажата до входа курсора на компонент.
А никак. Если нужно просто. Если ты нажал левую кнопку мышки и держишь её то ты как бы "зафиксировал" её на том окне, в котором нажал.
Непросто можно, но нафига это нужно?
0
2 / 2 / 2
Регистрация: 29.09.2012
Сообщений: 444
10.01.2015, 02:34  [ТС]
Ну с нажатой правой кнопкой-то работает, а с левой не хочет. Может какой флаг надо включить.

Ну хоть какое-то, пусть нестандартное и неправильно с точки зрения, решение есть?

Хотябы OnMouseLeave сделать, в виндусовском окне то оно работает по крайней мере.
0
пофигист широкого профиля
4761 / 3197 / 861
Регистрация: 15.07.2013
Сообщений: 18,553
10.01.2015, 02:36
Цитата Сообщение от Cannon1 Посмотреть сообщение
Ну с нажатой правой кнопкой-то работает. Может какой флаг надо включить.
ПКМ и ЛКМ имеют настолько разные функции, что глупо даже об этом думать.
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
10.01.2015, 10:12
Можно сделать так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Panel2.Visible := PtInRect(Panel1.BoundsRect, Point(X, Y));
end;
 
procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Panel2.Visible := PtInRect(Panel1.ClientRect, Point(X, Y));
end;
но работать будет только если ЛКМ нажимается на панели или на форме.
1
2 / 2 / 2
Регистрация: 29.09.2012
Сообщений: 444
10.01.2015, 15:39  [ТС]
FIL

Большое спасибо, уже что-то.

Если будут ещё идеи, то пожалуйста озвучьте.

Добавлено через 2 часа 59 минут
Цитата Сообщение от northener Посмотреть сообщение
Непросто можно, но нафига это нужно?
Приведите пример непростым путём пожалуйста, если знаете как.
0
844 / 739 / 342
Регистрация: 22.09.2012
Сообщений: 5,034
10.01.2015, 17:20
Delphi
1
2
3
4
5
6
7
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   if GetKeyState(VK_LBUTTON)<0 then Caption:='Нажата левая';
   if GetKeyState(VK_RBUTTON)<0 then Caption:='Нажата правая';
   if GetKeyState(VK_MBUTTON)<0 then Caption:='Нажата средняя';
end;
0
2 / 2 / 2
Регистрация: 29.09.2012
Сообщений: 444
10.01.2015, 17:23  [ТС]
NIKOLAYY

А это к чему? Вопрос то читали?
Как можно заставить реагировать OnMouseMove и OnMouseLeave при зажатой левой кнопки мышки?
0
844 / 739 / 342
Регистрация: 22.09.2012
Сообщений: 5,034
10.01.2015, 18:16
Цитата Сообщение от Cannon1 Посмотреть сообщение
Как можно заставить реагировать OnMouseMove и OnMouseLeave при зажатой левой кнопки мышки?
У тебя какая цель зажимания кнопки? Я могу кнопку зажать на каком-нибуть компоненте и двигать мышью и компонент например панель будет двигаться до тех пор пока неопущу кнопку.
Вот тебе и действие пока зажата.

Просто это событие можно оформить не только на OnMouseMove но и нужно подключить еще OnMouseDown и плюс к этому проверка еще кнопок мыши.
Но это не один вариант, еще можно набросать кучу вариантов, все зависит от конечной цели.
0
2 / 2 / 2
Регистрация: 29.09.2012
Сообщений: 444
10.01.2015, 18:20  [ТС]
Цель - заставить работать обработчики OnMouseMove и OnMouseLeave и OnMouseEnter с зажатой ЛКМ, и сделать это не просто.
В гугле вопросы похожие поднимались, решений не видел.
0
844 / 739 / 342
Регистрация: 22.09.2012
Сообщений: 5,034
10.01.2015, 18:29
Цитата Сообщение от Cannon1 Посмотреть сообщение
и сделать это не просто.
В гугле вопросы похожие поднимались, решений не видел.
Да что там не просто, то вот накидал тебе пример, на зажатую кнопку квадратики например рисую в имаге, помимо всего у меня в лейблах отображается номер квадратика, а в заголовке формы координаты по самой имаге. Смотри пару картинок, одна до запуска, вторая после запуска и после того как зажму левую или правую кнопку и проведу по имаге курсором.

В этом примере кода я тебе там прокомментировал его внутри самого кода.
Delphi
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
var
  Form1: TForm1;
  x1, y1: Integer; //координаты ячеек
  i, j: Integer;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Caption := 'X = ' + IntToStr(X) + ', Y = ' + IntToStr(Y);
  x1 := X div 20;
  y1 := Y div 20;
  Label1.Caption := IntToStr(x1);
  Label2.Caption := IntToStr(y1);
 
  //если зажата правая кнопка- то рисуем квадратики
  if Shift = [ssRight] then
  with Image1.Canvas do
  begin
    Brush.Color := clRed;
    FillRect(Rect(X div 20 * 20, Y div 20 * 20, X div 20 * 20 + 20, Y div 20 * 20
      + 20));
  end;
 
    //если зажата левая кнопка- то рисуем картинки
  if Shift = [ssLeft] then
  with Image1.Canvas do
  begin
   Draw(X div 20 * 20, Y div 20 * 20,Image2.Picture.Bitmap);
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  //  Image1.Canvas.MoveTo(100, 100); //Начальные координаты линии
  //  Image1.Canvas.LineTo(200, 200); //Конечные координаты линии
 
end;
 
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Shift = [ssRight] then
  with Image1.Canvas do
  begin
    Brush.Color := clRed;
    FillRect(Rect(X div 20 * 20, Y div 20 * 20, X div 20 * 20 + 20, Y div 20 * 20
      + 20));
  end;
 
 
 if Shift = [ssLeft] then
 with Image1.Canvas do
  begin
   Draw(X div 20 * 20, Y div 20 * 20,Image2.Picture.Bitmap);
  end;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  for i := 0 to 15 do
  begin
    Image1.Canvas.MoveTo(i * 20, 0); //Начальные координаты линии
    Image1.Canvas.LineTo(i * 20, 200); //Конечные координаты линии
  end;
 
  for i := 0 to 10 do
  begin
    Image1.Canvas.MoveTo(0, i * 20); //Начальные координаты линии
    Image1.Canvas.LineTo(300, i * 20); //Конечные координаты линии
  end;
 
end;
 
end.
Миниатюры
Событие MouseMove при нажатой кнопке   Событие MouseMove при нажатой кнопке  
0
2 / 2 / 2
Регистрация: 29.09.2012
Сообщений: 444
10.01.2015, 18:32  [ТС]
Спасибо за старания, но мы на разных языках говорим наверно
0
10.01.2015, 18:34

Не по теме:

Просто тебе уже кучу примеров накидали, а дальше собирай сам :)

0
2 / 2 / 2
Регистрация: 29.09.2012
Сообщений: 444
10.01.2015, 18:46  [ТС]
Нужно вмешаться в работу винды, или самих этих обработчиков, что не реагируют при зажатой ЛКМ, и там грамотно изменить.

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

Добавлено через 8 минут
Вот смотрите, у виндосовского окна если нажать на любую из трёх клавишь(свернуть, развернуть, закрыть) и потом с зажатой кнопкой отвести мышку в сторону, то событие MouseLeave срабатывает, так как его хотя бы так же в приложении с компонентами заставить работать?
0
844 / 739 / 342
Регистрация: 22.09.2012
Сообщений: 5,034
10.01.2015, 19:07
Ты хотел мышь заставить работать когда она у тебя находится не над формой?
0
0 / 0 / 0
Регистрация: 12.12.2018
Сообщений: 1
30.08.2022, 09:59
При зажатой левой кнопке нужно следить за X, Y
и даже не над формой.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TForm1.Panel1MouseLeave(Sender: TObject);
begin
 Panel2.Visible:= False;
end;
 
procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 if (x > Panel1.Width)or(x<0)or             
    (y > Panel1.Height)or(y<0) then        
      Panel2.Visible:= False    
 else
      Panel2.Visible:= True;
 
end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.08.2022, 09:59
Помогаю со студенческими работами здесь

Событие MouseMove для кнопки
Здравствуйте! Я хотел бы создать кнопку, нарисованную мной же. Она когда на неё наводишь курсор - меняет цвет (типо светится). Когда я на...

Узнать о нажатой кнопке в ходе работы программы
Доброго дня суток! Как динамическим образом по ходу работы программы узнать о нажатой кнопке (Button) их несколько и нужно узнать какую...

Можно ли создать условие по последней нажатой кнопке
К примеру, if последней была нажата Button1 then делаем одно else делаем другое

Таймер, таблица, массив, событие по кнопке - буфер
Приблизительно такой пример. Есть таблица 4 столбца, 4 строки. 21|32|64|65 43|7|87|53 1|4|0|1| 2|7|5|1| По таймеру, каждое T...

StringGrid неправильный перевод даты при mousemove
вот тут кратенький кодик. выводит неправильные минуты может 61, может 94:) что-то не то точно. Буду благодарна любым предложением. теряюсь...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

Новые блоги и статьи
Динамические массивы в C++ - создание и использование
NullReferenced 27.04.2025
Динамические массивы представляют собой один из фундаментальных инструментов программирования на C++, позволяющий создавать структуры данных, размер которых определяется во время выполнения. . .
Асинхронный JavaScript: Промисы, Async/Await и Fetch API
Reangularity 27.04.2025
Пользователь заходит на веб-страницу, нажимает кнопку и. . . ничего не происходит. Сайт словно замер. Через несколько секунд всё внезапно оживает, но пользователь уже успел закрыть вкладку. Знакомая. . .
Management on GitLab and repository management in Visual Studio code
jigi33 27.04.2025
- repo management on GitLab - CI/ CD in GitLab - VCS repository management in Visual Studio code (see attachments)
Kanban или Scrum - что выбрать?
EggHead 27.04.2025
Kanban и Scrum — уже много лет удерживают лидирующие позиции среди гибких подходов. Руководители проектов и команды разработчиков то и дело сталкиваются с дилеммой: какой из этих двух методов выбрать. . .
Кастомные Middleware на C# в ASP.NET Core
UnmanagedCoder 27.04.2025
Разработка веб-приложений сегодня мало напоминает монолитное программирование прошлых лет. На смену громоздким блокам кода пришла модульная архитектура, где каждый компонент выполняет строго. . .
Анализ и линтинг кода JavaScript: ESLint, Prettier и JSHint
run.dev 26.04.2025
JavaScript прошёл долгий путь от простого языка для анимации веб-страниц до основы современной веб-разработки. С ростом сложности приложений, увеличением кодовых баз и масштабированием команд. . .
Паттерны в Python: Singleton, Factory и Observer
py-thonny 26.04.2025
Паттерны проектирования — это проверенные временем решения типовых проблем разработки программного обеспечения. Их история берёт начало с книги "Приёмы объектно-ориентированного проектирования. . . .
Исключения в C#: Stack Overflow, Access Violation и Out of memory
stackOverflow 26.04.2025
Исключения в C# — это не только механизм оповещения о проблемах, а целое искусство управления потоком выполнения программы в экстремальных ситуациях. Обычное исключение, например,. . .
Логирование в C# ASP.NET Core с помощью Serilog, ElasticSearch, Kibana
stackOverflow 25.04.2025
Помните те времена, когда для анализа проблемы приходилось подключаться к серверу, искать нужный лог-файл среди десятков других и вручную фильтровать тысячи строк в поисках ошибки? К счастью, эти дни. . .
Структура "железный OnKeyUp" вместо антидребезга. Полностью асинхронный счётчик.
Hrethgir 25.04.2025
Программа для симуляции схемы - Logisim Evolution В общем какое-то время отвлёкся, так было надо, теперь когда запилю это на verilog и FPGA , досоставлю заявку в ФИПС на полезную модель - не готов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru