powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как определить класс объекта под курсором мыши.
14 сообщений из 14, страница 1 из 1
Как определить класс объекта под курсором мыши.
    #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
Как определить класс объекта под курсором мыши.
    #39920134
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FIL23
Добрых суток,

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

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

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

а ты не пробовал заняться ядерной физикой?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как определить класс объекта под курсором мыши.
    #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
Как определить класс объекта под курсором мыши.
    #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
Как определить класс объекта под курсором мыши.
    #39920149
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FIL23
когда компонент лежит на форме и нажимаешь на него мышкой , то курсор в него "проваливается" , т.е. метод OnClick он для Item'ов внутри этого компонента, и этот метод будет работать только тогда когда я выберу из выпадающего списка какой нибудь итем.
Реакция комбобокса на клик мыши - показать список элементов. Тут вам придется от чего-то отказываться. Либо от перетягивания, либо от отображения списка
...
Рейтинг: 0 / 0
Как определить класс объекта под курсором мыши.
    #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
Как определить класс объекта под курсором мыши.
    #39920161
Ghost Writer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FIL23
как получить этот объект в виде Tobject

посмотрите FindVCLWindow, FindDragTarget
...
Рейтинг: 0 / 0
Как определить класс объекта под курсором мыши.
    #39920171
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FIL23
по сути мне отображение списка не нужно
, как от него отказаться?
Нужно проигнорировать сообщение CB_SHOWDROPDOWN
...
Рейтинг: 0 / 0
Как определить класс объекта под курсором мыши.
    #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
Как определить класс объекта под курсором мыши.
    #39920777
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FIL23
Я переопределил TComboBox и назначил ему метод из которого я отлавливаю нажатие мыши

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

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


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

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


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

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


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