Вот схемка, над которой ставил эксперименты.
code_1395.txt
* При запуске загорелся красный LED (onSetFocus)
* При клике на едите и потом на текстовой части CBox - фиг вам
* При клике на едите и потом на кнопке CBox - onSetFocus однако
* При выборе элеменат списка - переключение жёлтой лампочки (onClick)
* При редактировании текста в CBox-е - зелёная лампочка (onChar)
А у тебя как (на штатном и на одифицированном)?
[size=-2]------ Добавлено в 17:15
Плюс к сказанному - если поставить ReadOnly, то событие onSetFocus происходит. Но это и понтяно - у такого CBox-а при клике в любой части происходит раскрытие списка
[size=-2]------ Добавлено в 17:16
А если Edit-у привязать onSetFocus, то там всё работает...
Этот топик читают: Гость
Ответов: 5446
Рейтинг: 323
|
|||
карма: 1 |
| ||
файлы: 1 | code_1395.txt [607B] [424] |
Разработчик
Ответов: 26151
Рейтинг: 2127
|
|||
iarspider, ну все правильно, он и выдает onSetFocus при выпадении (и при запуске тоже ???). Пример работает точно как ты описал.
[size=-2]------ Добавлено в 17:28 Вот смотри в Win'e
|
|||
карма: 22 |
|
Ответов: 5446
Рейтинг: 323
|
|||
Ну дык и я о чём - нету WM_SETFOCUS при ReadOnly=false и клике на текстовой части. Сейчас запулю VC++, посмотрю, как там оно. Пока что обнаружил лишь то, что надо чтобы CBox выдавал onSetFocus и при нотифае EN_SETFOCUS
[size=-2]------ Добавлено в 17:49 Короче так. Есть такой uber-message, зовётся WM_COMMAND, и позволяет он, в числе прочего, пролучать notifications (уведомления) от контролов, что с ними происходит. В частности, есть такой notification - CBN_SETFOCUS: MSDN писал(а):
The CBN_SETFOCUS notification message is sent when a combo box receives the keyboard focus. The parent window of the combo box receives this notification message through the WM_COMMAND message. Более того, есть ещё уйма его "коллег" по типу элемента - в частности, CBN_SELCHANGE, перехват которого куда корректнее для целей отлова изменения выделения в CBOx-е, чем onClick. [size=-2]------ Добавлено в 17:51 Да, для справки - WM_COMMAND: MSDN писал(а):
WM_COMMAND Notification -------------------------------------------------------------------------------- The WM_COMMAND message is sent when the user selects a command item from a menu, when a control sends a notification message to its parent window, or when an accelerator keystroke is translated. Syntax WM_COMMAND WPARAM wParam LPARAM lParam; Parameters wParam The high-order word specifies the notification code if the message is from a control. If the message is from an accelerator, this value is 1. If the message is from a menu, this value is zero. The low-order word specifies the identifier of the menu item, control, or accelerator. lParam Handle to the control sending the message if the message is from a control. Otherwise, this parameter is NULL. Return Value If an application processes this message, it should return zero. Remarks Accelerator keystrokes that select items from the window menu are translated into WM_SYSCOMMAND messages. If an accelerator keystroke occurs that corresponds to a menu item when the window that owns the menu is minimized, no WM_COMMAND message is sent. However, if an accelerator keystroke occurs that does not match any of the items in the window's menu or in the window menu, a WM_COMMAND message is sent, even if the window is minimized. If an application enables a menu separator, the system sends a WM_COMMAND message with the low-word of the wParam parameter set to zero when the user selects the separator. Windows 98/Me, Windows 2000/XP: If a menu is defined with a MENUINFO.dwStyle value of MNS_NOTIFYBYPOS, WM_MENUCOMMAND is sent instead of WM_COMMAND. Notification Requirements Minimum DLL Version None Header Declared in Winuser.h, include Windows.h Minimum operating systems Windows 95, Windows NT 3.1 [size=-2]------ Добавлено в 17:53 Только вот не знаю, как в нашем случае (создание контролов "на лету") его прикрутить. Dilma, Galkov, что скажете - есть возможность? |
|||
карма: 1 |
|
Администрация
Ответов: 15295
Рейтинг: 1519
|
|||
Возможность обработать WM_COMMAND?
|
|||
карма: 27 |
|
Ответов: 9906
Рейтинг: 351
|
|||
Матчасть учи.
Менять чего-то, не зная ее - плохой стиль. Только после того, как это сделано, можно делать заключения. Например: а ну его нафиг этот KOL [size=-2]------ Добавлено в 18:56 Грубо говоря - непонятно чего ты хочешь, и от кого... |
|||
карма: 9 |
|
Ответов: 2125
Рейтинг: 159
|
|||
iarspider писал(а): при клике на кнопке - событие происходит, при клике в текстовой области - нетКомбобокс состоит из двух окон - рамка с кнопкой, а в нём окно-текстбокс. Текстбокс посылает нотификацию своему родителю - рамке с кнопкой, по идее она должна обработать эту нотификацию посылкой аналогичного сообщения своему родителю, но что там в КОЛе на эту тему накрутили - это вопрос к Галкову. iarspider писал(а): как в нашем случае (создание контролов "на лету") его прикрутить.Очень просто - надо обрабатывать WM_COMMAND/CBN_SETFOCUS в своём окне, который является владельцем комбобоксов, нужно лишь знать DlgID комбобоксов. |
|||
карма: 1 |
|
Ответов: 9906
Рейтинг: 351
|
|||
Ну конечно, искусством контекстного поиска в тексте только я и владею
CBN_SETFOCUS возвращается KOL-ом как OnEnter |
|||
карма: 9 |
|
Ответов: 2125
Рейтинг: 159
|
|||
Galkov писал(а): CBN_SETFOCUS возвращается KOL-ом как OnEnter... немножко фантазии ... |
|||
карма: 1 |
|
Ответов: 5446
Рейтинг: 323
|
|||
(iarspider чуть было не подавился пивом) Это ж какую травку надо было покурить, чтобы так обозвать?!...
Так. Вроде прикрутил. Проверьте меня, плиз! hiComboBox.pas
Думаю, что городить отдельное событие для onEnter (CBN_SETFOCUS) не надо. [size=-2]------ Добавлено в 20:33 А теперь вопрос к Дилме: можно ли сделать, чтобы при активации любого контрола в экземпляре динамической панели происходил выбор (##select) данного экземпляра панели? Ибо в противном случае кольцевание получается, что не есть хорошо... |
|||
карма: 1 |
|
Ответов: 9906
Рейтинг: 351
|
|||
iarspider,
1) менять свой пост без обновления его времени - плохой стиль 2) может поставишь в труд объяснить ЧЕГО ХОЧЕШЬ. Какова цель "прикручивания". Откуда взялась эта цель. Если, конечно, тебя интересует результат 3) что за бред сивой кобылы с "кольцеванием" через ##select |
|||
карма: 9 |
|
Ответов: 5446
Рейтинг: 323
|
|||
Galkov,
1) Ок, буду знать 2+3) Хочу я создать имитацию таблицы с переменным числом рядов на основе ScrollBox+PanelEx, у которой нельзя удалить 1й ряд. Для этого мне нужно уметь определять, в какой сейчас панели стоит фокус, дабы удалить именно её по кнопке "Удалить ряд". Для этого я при создании запоминаю ##handle панели, и по событию onSetFocus на элементе панели делаю ##hselect с запомненным ##handle (как-бы кольцо). Подробнее завтра. |
|||
карма: 1 |
|
Разработчик
Ответов: 26151
Рейтинг: 2127
|
|||
iarspider писал(а): Хочу я создать имитацию таблицы с переменным числом рядов на основе ScrollBox+PanelExМдяяя... Это ж сколько пива надо выпить |
|||
карма: 22 |
|
Ответов: 9906
Рейтинг: 351
|
|||
Я такое в своем калькуляторе делал. одна панель: две кнопы (Exec, Delete) и три Edit-а (Name, Expression, Result)
И не жужжу... Есть "недокументированные" точки ##EventHandle и ##EventIndex Так что запоминать ничего нет необходимости. Напомню: самого себя уничтожать нельзя - только через таймер (другое ничего в голову не пришло) Впрочем, тебе там скажут [size=-2]------ Добавлено в 09:55 iarspider писал(а): Так. Вроде прикрутил. Проверьте меня, плиз!А фигня какая-то, на самом деле... Двойное использование _event_onSetFocus - типичный результат строительства шанхаев... Все смахивает на то, что надо убирать из Win перехват _onMessage, и заменять его на _onEnter, _onLeave И не трогать всякие там ComboBox-ы |
|||
карма: 9 |
|
Ответов: 5446
Рейтинг: 323
|
|||
Galkov писал(а): Есть "недокументированные" точки ##EventHandle и ##EventIndex
Так что запоминать ничего нет необходимости. Ах вот оно что! Это существенно облегчает жизнь... Galkov писал(а): Напомню: самого себя уничтожать нельзя - только через таймер (другое ничего в голову не пришло)
Впрочем, тебе там скажут Плавали (точнее-падали) - знаем... Galkov писал(а): Все смахивает на то, что надо убирать из Win перехват _onMessage, и заменять его на _onEnter, _onLeave
И не трогать всякие там ComboBox-ы Ну положим, CBM_SETFOCUS есть нотифай, посылаемый только CBox-ом, и поэтому думается мне, что место ему - в hiComboBox.pas, а не в Win.pas. Наверное. А схемку того, что я наворотил, я выкладывал уже - code_1394.txt |
|||
карма: 1 |
|
Ответов: 9906
Рейтинг: 351
|
|||
iarspider писал(а): Ну положим, CBM_SETFOCUS есть нотифай, посылаемый только CBox-ом, и поэтому думается мне, что место ему - в hiComboBox.pas, а не в Win.pas. Наверное.Ну вы чего, действительно не владеете искусством контекстного поиска, что-ли Излагаю последовательнось действий, на которые у меня потребовалось минут 10 (с почесыванием в репе) 1) ищу CBM_SETFOCUS 2) вижу единственное его вхождение как константу в поле aEnter таблицы ComboActions: TCommandActions 3) ищу использование aEnter 4) наблюдаю значения этих полей в таблицах (перечисляю ненулевые):
а) в fCommandActions стоит адрес одной из наблюдаемых ранее табличек (что и так понятно впрочем) б) CM_COMMAND - это сообщение посланное парентом нужному контролу в ответ на WM_COMMAND, чтобы каждый занимался своими делами, а не чужими (и плевали они с высокой колокольни на отмеченный tsdima параметр DlgID) То пишу в пост: CBN_SETFOCUS возвращается KOL-ом как OnEnter
А теперь честно: я что, Америку открыл, или неведомое никому ранее боевое искусство Типа: ну именно такое и называется, наверное - учить матчасть... |
|||
карма: 9 |
|