Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];

Вниз

Определение компонента, над которым находится курсор мыши.   Найти похожие ветки 

 
3asys   (2004-03-11 14:15) [0]

Как определить над каким компонентом находится курсор мыши?
В том числе и для компонентов у которых нет события OnMouseMove

С уважением, 3asys


 
Юрий Зотов ©   (2004-03-11 14:24) [1]

function ControlUnderMouse: TControl;
var
 P: TPoint;
 W := TWinControl;
begin
 P := Mouse.CursorPos;
 W := FindVCLWindow(P);
 if W <> nil then
 begin
   P := W.ScreenToClient(P);
   Result := W.ControlAtPos(P, True, True);
   if Result = nil then Result := W
 end  
 else Result := nil
end;


 
NAlexey ©   (2004-03-11 14:40) [2]

Если мне не изменяет память, то была похожая ветка. Так вот приведенный Юрий Зотов ©   (11.03.04 14:24) [1] пример сработает невсегда.


 
3asys   (2004-03-11 14:44) [3]

Спасибо Большое! Это работает.
Но мне нужно получить компонент, для того, чтобы затем передать его в качестве родителя при создании на нем нового компонента:

.....
TControl(cmp).Parent:=ControlUnderMouse;
а при этом выдается сообщение: "Incompatible types "TWinControl" and "TControl"
Что здесь можно сделать?

С уважением, 3asys


 
NAlexey ©   (2004-03-11 14:46) [4]

Мда, вот тебе бабушка и Юрьев день.:)


 
Юрий Зотов ©   (2004-03-11 14:59) [5]

> NAlexey ©   (11.03.04 14:40) [2]

А в каких же случаях он не сработает? Даже интересно.

> 3asys (11.03.04 14:44) [3]

Вы спрашивали о КОМПОНЕНТЕ под мышью, верно? Не уточняя при этом, что это за компонент, верно? А под мышью может быть ЛЮБОЙ визуальный компонент - то есть, любой потомок TControl.

Именно ТАКОЙ пример я Вам и написал. Эта процедура определяет ЛЮБОЙ контрол, находящийся под мышью - как потомок TWinControl, так и потомок TGraphicControl. А Вам, оказывается, нужны только TWinControl"ы - потому что только они могут быть Parent"ами. Извините, но вопросы надо формулировать точно. А так - что Вы спросили, то Вы и получили, и в том, что Вы спросили не то, что Вам на самом деле нужно - вина Ваша собственная и больше ничья.

Ваша же задача проще.
TControl(Сmp).Parent := FindVCLWindow(Mouse.CursorPos);
И все.


 
3asys   (2004-03-11 15:11) [6]

>>Юрий Зотов
Большое Спасибо - все отлично работает.
Прошу извинить - неудачно сформулировал вопрос.

С уважением, 3asys


 
Юрий Зотов ©   (2004-03-11 15:17) [7]

> NAlexey ©   (11.03.04 14:46) [4]

Ау-у! Так что же там насчет бабушки?
:о)


 
NAlexey ©   (2004-03-11 15:22) [8]

Тут я тут.:) Приношу свои извенения, действительно приведенный код работает нормально. В прошлый раз о котором шла речь(NAlexey ©   (11.03.04 14:40) [2] ) код был несколько другой. И еще сдается мне что мои слова насчет бабушки истолкованы неверно. И к тебе они не относятся никак:) Просто задающий вопрос не был в силах сам разобоаться с тем как воспользоваться кодом.


 
NAlexey ©   (2004-03-11 15:30) [9]

Хотя тщательное тестирование всеже показало правоту моих слов. Тест такой:
1)Кладем на форму панель, в нее кладем другую(ну или кнопку там), потом кладем PageControl добавляем одну закладку. Надвигаем PageControl таким образом чтобы он своим краем(именно краем а не TTabShee-тами) наезжал на вложенную панель. Наводим мышь и видим что под мышью у нас не PageControl как должно быть а вложенная в панель панель. Могу впринципе объяснить почему. Такчто...


 
Юрий Зотов ©   (2004-03-11 15:36) [10]

Вы имеете в виду, что на панель наезжает правый верхний угол PageControl (т.е. его невидимый кусок)?

Если так, то почему же мы должны получить PageControl? Что видим на экране - то и получаем. Все логично.


 
NAlexey ©   (2004-03-11 15:43) [11]

Да, именно это я и имею ввиду. Кстати не такой уж он и невидимый(визуально). С точки зрения интерфейса он очень видимый. И если например делать какой либо дизайнер где таскаешь элементы, этот код будет работать невсегда.


 
Юрий Зотов ©   (2004-03-11 15:50) [12]

> NAlexey ©   (11.03.04 15:43) [11]

> Кстати не такой уж он и невидимый(визуально). С точки зрения
> интерфейса он очень видимый.

То есть, как это? Все же - видимый, или невидимый? Разве есть еще другие варианты?

> И если например делать какой либо дизайнер где таскаешь
> элементы, этот код будет работать невсегда.

Не понимаю. Давайте говорить конкретно - в каких случаях он НЕ будет работать?

Приведенный Вами случай - не доказательство. Мы видим, что мышь находится над панелью - и функция показывает то же самое. Все нормально.


 
NAlexey ©   (2004-03-11 16:25) [13]

>Юрий Зотов ©   (11.03.04 15:50) [12]
Ок привожу конкретный пример. Почему возникла неодназначность в терминах, и почему я употребил слово визуально. Ключевым моментом здесь является ф-ция
WindowFromPoint
The WindowFromPoint function does not retrieve a handle to a hidden or disabled window, even if the point is within the window

В нашем разговоре мы начали употреблять слово невидимый. Пусть будет так. Так вот когда ложишь PageControl поверх панели вложенной в панель(нагляднее на этом фоне смотрелся бы TImage) так вот та часть которая в ремарке этой ф-ции считается невидимой визуально на самом деле видима, и закрывает участок TImage, если например перейти в дизайнер Delphi и потаскать по форме PageControl ясно что он таскается за эту часть, даже если смоделировать приведенный мной пример. Если я завтра захочу написать такой редактор и воспользоваться Вашим кодом то он будет работать(опять же ключевое слово) - НЕВСЕГДА. Вы просили пример, я его привел. В чем дело?


 
serge35   (2004-03-11 16:59) [14]

Лично я в этом случае делал popup меню и присваивал его к каждой добавленной компоненте. при нажатии на правую кнопку мыши выпадало меню с пунктом "Добавить компоненту" и внутри этого пункта определял компоненту, которая иницилизировала меню.


 
Юрий Зотов ©   (2004-03-11 17:16) [15]

> NAlexey ©   (11.03.04 16:25) [13]

> Вы просили пример, я его привел. В чем дело?

В том, что Вы привели пример неверный. И вот почему.

Если Вы будете делать дизайнер, то, как грамотный разработчик, Вы будете обязаны позаботитьсяь о том, чтобы редактируемая форма и все ее компоненты знали о том, что они работают в Design-time (см. SetDesigning и иже с ним). А в этом случае и PageControl, и все другие контролы будут работать не так, как они работаю в run-time, а точно так же, как они работают в самой Delphi (и если они будут работать не так, как они работают в Delphi, то это автоматически означает что дизайнер просто криво написан).

В частности, в этом режиме контролы никогда не будут невидимыми, никогда не будут задизаблены, будут корректно отрабатывать CM_DesignHitTest и другие design-time сообщения (а сам дизайнер обязан позаботиться о том, чтобы такие сообщения посылать или перехватывать - а если он их не посылает или не перехватывает, то это опять-таки просто кривой дизайнер).

И при таком раскладе (то есть, при ГРАМОТНО написанном дизайнере)приведенный мною код тоже сработает нормально и все определит именно так, как Вы и хотите.

Уверяю Вас, что это так. И знаю, о чем говорю - потому что дизайнер я писал. Да и - как Вы считаете, чем пользуется дизайнер самой Delphi?

Ответ - теми же самыми функциями VCL, что использовал и я. Работает ведь? И даже несмотря на FindWindow...

Так что - сорри, но пример Ваш не катит:
"Если я завтра захочу написать такой редактор и воспользоваться Вашим кодом то он будет работать (опять же ключевое слово) - НЕВСЕГДА".

Если Вы завтра захотите написать такой редактор и воспользоваться моим кодом то он будет работать (опять же ключевое слово) - ВСЕГДА.

При условии, что Вы напишете редактор ГРАМОТНО (это тоже ключевое слово). Либо не беритесь писать редакторов.


 
Юрий Зотов ©   (2004-03-11 17:20) [16]

> И даже несмотря на FindWindow...

Описка, конечно. Имелось в виду WindowFromPoint.


 
serge35   (2004-03-11 17:43) [17]

Можно привести пример, как перевести компоненту в режим дизайна?


 
Юрий Зотов ©   (2004-03-11 17:56) [18]

> serge35   (11.03.04 17:43) [17]

Можно - SetDesigning. Но для написания дизайнера этого будет недостаточно. Надо создавать целую СРЕДУ разработки - то есть, целое ОКРУЖЕНИЕ компонента, поддерживающее его редактирование. Так же, как это делает Delphi.


 
NAlexey ©   (2004-03-12 08:17) [19]

>Юрий Зотов ©   (11.03.04 17:16) [15]
Извиняюсь за длительное молчание. Не было возможности Вам ответить. Соглашаюсь с Вашими Юрий доводами насчет дизайнера, тем не менее мне кажется что это как раз тот момент когда может быть 2 правды. Может быть пример насчет дизайнера и не совсем удачен, тем не менее, можно придумать массу других примеров в которых возникает необходимость узнавать контрол под мышью, например необходимо выводить ClassName контрола над которым парит мышь вне зависимости от того Enabled он или нет. Я не хотел разжигать спор и проч. Считаю что вы правы, правы по своему. Я бы например посоветовал отказаться от использования WindowFromPoint и использовать рекурсивный перебор контролов сверху вниз, в этом случае не возникло бы такой неодназначности.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.036 c
1-1078831472
BPK
2004-03-09 14:24
2004.03.28
Как определять абстрактные методы?


1-1078902375
Ш-К
2004-03-10 10:06
2004.03.28
Class-reference types


1-1078382508
fatal
2004-03-04 09:41
2004.03.28
правила создания RC-файла


3-1077182609
RavenD
2004-02-19 12:23
2004.03.28
утилиты?


3-1077370184
Nous Mellon
2004-02-21 16:29
2004.03.28
Сортировка и ADO





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский