Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как определить класс объекта под курсором мыши. / 14 сообщений из 14, страница 1 из 1
29.01.2020, 18:12
    #39920133
FIL23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить класс объекта под курсором мыши.
Добрых суток,

Пишу билдер с помощью которого динамически создаются компоненты.

Хотелось бы определять Класс компонента когда над ними находится курсор мыши (ну и имя получить если это возможно)

Как реализовать?

Для чего мне это надо:
Имеется такой компонент StretchHandle который позволяет динамически изменять размер компонента.
Так вот мне надо чтобы при выборе компонент к нему применялся этот StretchHandle.

Ранее я это реализовывал так, при создании компонента прописывал метод OnClik, а уже потом когда мне надо было мышкой поменять размер обекта. я просто одним кликом мышки по объекту "натягивал" StretchHandle на этот объект.
Процедура OnClik для объектов работает так (сильно меня не обижать, я системный администратор, а не программист)
Код: pascal
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.
procedure TfmTemplateOfInventory.Click(Sender: TObject);
begin
StretchHandle1.Detach;
if (Sender is TGroupBox) then
  begin
  perSenderChild:=Sender;      
  StretchHandle1.Attach(Sender as TGroupBox);
  end else
    if (Sender is TEdit) then
      begin
      perSenderChild:=Sender; 
      StretchHandle1.Attach(Sender as TEdit);
      end else
        if (Sender is TLabel) then
          begin
          perSenderChild:=Sender; 
          StretchHandle1.Attach(Sender as TLabel);
          end else
            if (Sender is TCheckBox) then
              begin
              perSenderChild:=Sender; 
              StretchHandle1.Attach(Sender as TCheckBox);
              end else
                if (Sender is TMemo) then
                  begin
                  perSenderChild:=Sender;  
                  StretchHandle1.Attach(Sender as TMemo);
                  end ;
end;


но вот беда у TComboBox данный метод идет совсем для другого.

Помогите.
Спасибо.
...
Рейтинг: 0 / 0
29.01.2020, 18:15
    #39920134
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить класс объекта под курсором мыши.
FIL23
Добрых суток,

Пишу билдер с помощью которого динамически создаются компоненты.

Хотелось бы определять Класс компонента когда над ними находится курсор мыши (ну и имя получить если это возможно)

Уйбля
...
Рейтинг: 0 / 0
29.01.2020, 18:20
    #39920139
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить класс объекта под курсором мыши.
29.01.2020 18:12, FIL23 пишет:
> сильно меня не обижать, я системный администратор, а не программист

а ты не пробовал заняться ядерной физикой?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
29.01.2020, 18:20
    #39920140
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить класс объекта под курсором мыши.
FIL23
Который так работал
Переписать так
Код: pascal
1.
2.
3.
4.
5.
6.
procedure TfmTemplateOfInventory.Click(Sender: TObject);
begin
  StretchHandle1.Detach;
  StretchHandle1.Attach(Sender as TControl);
  perSenderChild:=Sender;
end;


FIL23
но вот беда у TComboBox данный метод идет совсем для другого.
Код: pascal
1.
2.
3.
4.
5.
procedure TfmTemplateOfInventory.ComboBoxClick(Sender: TObject);
begin
  Click(Sender);
  // Process ComboBox click
end;
...
Рейтинг: 0 / 0
29.01.2020, 18:34
    #39920147
FIL23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить класс объекта под курсором мыши.
_Vasilisk_
FIL23
Который так работал
Переписать так
Код: pascal
1.
2.
3.
4.
5.
6.
procedure TfmTemplateOfInventory.Click(Sender: TObject);
begin
  StretchHandle1.Detach;
  StretchHandle1.Attach(Sender as TControl);
  perSenderChild:=Sender;
end;



Действительно чё это я.

_Vasilisk_

FIL23
но вот беда у TComboBox данный метод идет совсем для другого.
Код: pascal
1.
2.
3.
4.
5.
procedure TfmTemplateOfInventory.ComboBoxClick(Sender: TObject);
begin
  Click(Sender);
  // Process ComboBox click
end;



Вот тут нет. Я имел ввиду немного другое, когда компонент лежит на форме и нажимаешь на него мышкой , то курсор в него "проваливается" , т.е. метод OnClick он для Item'ов внутри этого компонента, и этот метод будет работать только тогда когда я выберу из выпадающего списка какой нибудь итем.

Поэтому я хочу получать какой ни будь значение объекта , по которому я смогу потом его найти и приаттачить StretchHandle при срабатывании клавиши мыши. Как то так, надеюсь я правильно объяснил.
...
Рейтинг: 0 / 0
29.01.2020, 18:52
    #39920149
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить класс объекта под курсором мыши.
FIL23
когда компонент лежит на форме и нажимаешь на него мышкой , то курсор в него "проваливается" , т.е. метод OnClick он для Item'ов внутри этого компонента, и этот метод будет работать только тогда когда я выберу из выпадающего списка какой нибудь итем.
Реакция комбобокса на клик мыши - показать список элементов. Тут вам придется от чего-то отказываться. Либо от перетягивания, либо от отображения списка
...
Рейтинг: 0 / 0
29.01.2020, 19:01
    #39920154
FIL23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить класс объекта под курсором мыши.
по сути мне отображение списка не нужно
, как от него отказаться?


P/s
Я сейчас пробую в сторону CM_MOUSELEAVE CM_MOUSEENTER копать

получается получить Хэндл объекта и его класс, осталось два вопроса решить как получить этот объект в виде Tobject и как перехватить нажатие клавиши мыши.

Код: pascal
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.
procedure WndProc(var Message: TMessage); override;

procedure TfmTemplateOfInventory.WndProc(var Message: TMessage);
var
  MousePoint: TPoint;
  WndHnd: THandle;
  aName: array [0..255] of Char; 
begin
  with Message do
    case Msg of

      CM_MOUSELEAVE:
        begin
          GetCursorPos(MousePoint);
          WndHnd := WindowFromPoint(MousePoint);
          Label8.Caption:= IntToStr( WndHnd);
          GetClassName(WndHnd, aName, 256)   ;
          Label10.Caption:=  aName;
        end;

      CM_MOUSEENTER:
        begin
        GetCursorPos(MousePoint);
        WndHnd := WindowFromPoint(MousePoint);
        Label9.Caption:= IntToStr( WndHnd);
        end;
    end;
  inherited WndProc(Message);
end;
...
Рейтинг: 0 / 0
29.01.2020, 19:08
    #39920161
Ghost Writer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить класс объекта под курсором мыши.
FIL23
как получить этот объект в виде Tobject

посмотрите FindVCLWindow, FindDragTarget
...
Рейтинг: 0 / 0
29.01.2020, 19:28
    #39920171
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить класс объекта под курсором мыши.
FIL23
по сути мне отображение списка не нужно
, как от него отказаться?
Нужно проигнорировать сообщение CB_SHOWDROPDOWN
...
Рейтинг: 0 / 0
30.01.2020, 19:59
    #39920705
FIL23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить класс объекта под курсором мыши.
Вот что я надумал... уж извините , чукча не писатель.

Я переопределил TComboBox и назначил ему метод из которого я отлавливаю нажатие мыши на нем и потом выполняю все процедуры далее по списку.
На сколько это правильно?


Код: pascal
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.
type
  TMyComboBox = class(StdCtrls.TComboBox)
  private
    procedure WMLBUTTONDOWN(var msg: TMessage); message WM_LBUTTONDOWN;
end; 



type
  TfmTemplateOfInventory = class(TForm)
//....

  private
    procedure WndProc(var Message: TMessage); override;

var
   perSenderChild: TObject
   MousePoint: TPoint; 
end;


//тут получаем координаты курсора на форме 
procedure TfmTemplateOfInventory.WndProc(var Message: TMessage);
var
  WndHnd: THandle;
begin
  with Message do
    case Msg of

      CM_MOUSELEAVE:
        begin
          GetCursorPos(MousePoint);
          WndHnd := WindowFromPoint(MousePoint);
        end;
    end;
  inherited WndProc(Message);
end;


procedure TMyComboBox.WMLBUTTONDOWN(var msg: TMessage);
begin
inherited;
  case msg.Msg of
    WM_LBUTTONDOWN:
      begin
      fmTemplateOfInventory.StretchHandle1.Detach;
      fmTemplateOfInventory.StretchHandle1.Attach(FindDragTarget(MousePoint,true));
      perSenderChild:=FindDragTarget(MousePoint,true);
      end
  end;
end;




Есть еще один способ который мне может подойти, это бросить на форму ApplicationEvents и через метод OnMessage отлавливать все сообщения на форме, а после фильтровать что мне нужно.

Какой из низ будет "правильный"?
...
Рейтинг: 0 / 0
30.01.2020, 21:48
    #39920777
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить класс объекта под курсором мыши.
FIL23
Я переопределил TComboBox и назначил ему метод из которого я отлавливаю нажатие мыши

Вы для каждого контрола будите писать наследника ?
...
Рейтинг: 0 / 0
30.01.2020, 22:05
    #39920788
FIL23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить класс объекта под курсором мыши.
DimaBr
FIL23
Я переопределил TComboBox и назначил ему метод из которого я отлавливаю нажатие мыши

Вы для каждого контрола будите писать наследника ?


Возможно, благо их мне надо не много, основные только, а это в пике 10 штук.
...
Рейтинг: 0 / 0
30.01.2020, 22:22
    #39920796
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить класс объекта под курсором мыши.
FIL23
DimaBr
пропущено...

Вы для каждого контрола будите писать наследника ?


Возможно, благо их мне надо не много, основные только, а это в пике 10 штук.

а для чего всё это надо системному администратору ?
...
Рейтинг: 0 / 0
30.01.2020, 22:36
    #39920804
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить класс объекта под курсором мыши.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как определить класс объекта под курсором мыши. / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]