Вверх ↑
Этот топик читают: Гость
Ответов: 5446
Рейтинг: 323
#256: 2007-05-08 17:16:50 ЛС | профиль | цитата
Вот схемка, над которой ставил эксперименты.
code_1395.txt

* При запуске загорелся красный LED (onSetFocus)
* При клике на едите и потом на текстовой части CBox - фиг вам
* При клике на едите и потом на кнопке CBox - onSetFocus однако
* При выборе элеменат списка - переключение жёлтой лампочки (onClick)
* При редактировании текста в CBox-е - зелёная лампочка (onChar)

А у тебя как (на штатном и на одифицированном)?

[size=-2]------ Добавлено в 17:15
Плюс к сказанному - если поставить ReadOnly, то событие onSetFocus происходит. Но это и понтяно - у такого CBox-а при клике в любой части происходит раскрытие списка

[size=-2]------ Добавлено в 17:16
А если Edit-у привязать onSetFocus, то там всё работает...
карма: 1

0
файлы: 1code_1395.txt [607B] [424]
Разработчик
Ответов: 26151
Рейтинг: 2127
#257: 2007-05-08 17:28:49 ЛС | профиль | цитата
iarspider, ну все правильно, он и выдает onSetFocus при выпадении (и при запуске тоже ???). Пример работает точно как ты описал.

[size=-2]------ Добавлено в 17:28
Вот смотри в Win'e
function THIWin._onMessage;
begin
case Msg.message of
WM_SETFOCUS : _hi_OnEvent(_event_onSetFocus);
WM_KILLFOCUS: _hi_OnEvent(_event_onKillFocus);
end;
Result := _hi_OnMessage(OldMes,Msg,Rslt);
end;
Значит это сообщение нам Винда посылает. И что мы тут сделаем?
карма: 22

0
Ответов: 5446
Рейтинг: 323
#258: 2007-05-08 17:53:26 ЛС | профиль | цитата
Ну дык и я о чём - нету 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

0
Администрация
Ответов: 15295
Рейтинг: 1519
#259: 2007-05-08 18:10:20 ЛС | профиль | цитата
Возможность обработать WM_COMMAND?
карма: 27
0
Ответов: 9906
Рейтинг: 351
#260: 2007-05-08 18:56:37 ЛС | профиль | цитата
Матчасть учи.
Менять чего-то, не зная ее - плохой стиль.
Только после того, как это сделано, можно делать заключения.
Например: а ну его нафиг этот KOL

[size=-2]------ Добавлено в 18:56
Грубо говоря - непонятно чего ты хочешь, и от кого...
карма: 9

0
Ответов: 2125
Рейтинг: 159
#261: 2007-05-08 19:05:42 ЛС | профиль | цитата
iarspider писал(а):
при клике на кнопке - событие происходит, при клике в текстовой области - нет

Комбобокс состоит из двух окон - рамка с кнопкой, а в нём окно-текстбокс. Текстбокс посылает нотификацию своему родителю - рамке с кнопкой, по идее она должна обработать эту нотификацию посылкой аналогичного сообщения своему родителю, но что там в КОЛе на эту тему накрутили - это вопрос к Галкову.


iarspider писал(а):
как в нашем случае (создание контролов "на лету") его прикрутить.

Очень просто - надо обрабатывать WM_COMMAND/CBN_SETFOCUS в своём окне, который является владельцем комбобоксов, нужно лишь знать DlgID комбобоксов.
карма: 1

0
Ответов: 9906
Рейтинг: 351
#262: 2007-05-08 19:21:13 ЛС | профиль | цитата
Ну конечно, искусством контекстного поиска в тексте только я и владею

CBN_SETFOCUS возвращается KOL-ом как OnEnter
карма: 9

0
Ответов: 2125
Рейтинг: 159
#263: 2007-05-08 19:22:44 ЛС | профиль | цитата
Galkov писал(а):
CBN_SETFOCUS возвращается KOL-ом как OnEnter

... немножко фантазии ...
карма: 1

0
Ответов: 5446
Рейтинг: 323
#264: 2007-05-08 20:33:46 ЛС | профиль | цитата
(iarspider чуть было не подавился пивом) Это ж какую травку надо было покурить, чтобы так обозвать?!...

Так. Вроде прикрутил. Проверьте меня, плиз!

hiComboBox.pas

THIComboBox = class(THIWinList)
private
procedure _OnEnter(Obj:PObj); //!!!
// ...
procedure THIComboBox.Init;
//...
OnSelChange := _OnClick;
OnEnter := _OnEnter; // add
//...
//добавляем процедуру
procedure THIComboBox._OnEnter;
var dt:TData;
begin
dtNull(dt);
_hi_OnEvent(_event_onSetFocus,dt);
end;

Думаю, что городить отдельное событие для onEnter (CBN_SETFOCUS) не надо.
[size=-2]------ Добавлено в 20:33
А теперь вопрос к Дилме: можно ли сделать, чтобы при активации любого контрола в экземпляре динамической панели происходил выбор (##select) данного экземпляра панели? Ибо в противном случае кольцевание получается, что не есть хорошо...
карма: 1

0
Ответов: 9906
Рейтинг: 351
#265: 2007-05-08 22:22:16 ЛС | профиль | цитата
iarspider,
1) менять свой пост без обновления его времени - плохой стиль
2) может поставишь в труд объяснить ЧЕГО ХОЧЕШЬ. Какова цель "прикручивания". Откуда взялась эта цель. Если, конечно, тебя интересует результат
3) что за бред сивой кобылы с "кольцеванием" через ##select
карма: 9

0
Ответов: 5446
Рейтинг: 323
#266: 2007-05-08 22:40:04 ЛС | профиль | цитата
Galkov,
1) Ок, буду знать
2+3) Хочу я создать имитацию таблицы с переменным числом рядов на основе ScrollBox+PanelEx, у которой нельзя удалить 1й ряд. Для этого мне нужно уметь определять, в какой сейчас панели стоит фокус, дабы удалить именно её по кнопке "Удалить ряд". Для этого я при создании запоминаю ##handle панели, и по событию onSetFocus на элементе панели делаю ##hselect с запомненным ##handle (как-бы кольцо). Подробнее завтра.
карма: 1

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#267: 2007-05-08 23:07:41 ЛС | профиль | цитата
iarspider писал(а):
Хочу я создать имитацию таблицы с переменным числом рядов на основе ScrollBox+PanelEx

Мдяяя... Это ж сколько пива надо выпить
карма: 22

0
Ответов: 9906
Рейтинг: 351
#268: 2007-05-09 09:55:06 ЛС | профиль | цитата
Я такое в своем калькуляторе делал. одна панель: две кнопы (Exec, Delete) и три Edit-а (Name, Expression, Result)
И не жужжу...

Есть "недокументированные" точки ##EventHandle и ##EventIndex
Так что запоминать ничего нет необходимости.

Напомню: самого себя уничтожать нельзя - только через таймер (другое ничего в голову не пришло)
Впрочем, тебе там скажут

[size=-2]------ Добавлено в 09:55
iarspider писал(а):
Так. Вроде прикрутил. Проверьте меня, плиз!

А фигня какая-то, на самом деле...
Двойное использование _event_onSetFocus - типичный результат строительства шанхаев...

Все смахивает на то, что надо убирать из Win перехват _onMessage, и заменять его на _onEnter, _onLeave
И не трогать всякие там ComboBox-ы
карма: 9

0
Ответов: 5446
Рейтинг: 323
#269: 2007-05-09 10:57:28 ЛС | профиль | цитата
Galkov писал(а):
Есть "недокументированные" точки ##EventHandle и ##EventIndex
Так что запоминать ничего нет необходимости.


Ах вот оно что! Это существенно облегчает жизнь...

Galkov писал(а):
Напомню: самого себя уничтожать нельзя - только через таймер (другое ничего в голову не пришло)
Впрочем, тебе там скажут

Плавали (точнее-падали) - знаем...

Galkov писал(а):
Все смахивает на то, что надо убирать из Win перехват _onMessage, и заменять его на _onEnter, _onLeave
И не трогать всякие там ComboBox-ы


Ну положим, CBM_SETFOCUS есть нотифай, посылаемый только CBox-ом, и поэтому думается мне, что место ему - в hiComboBox.pas, а не в Win.pas. Наверное.


А схемку того, что я наворотил, я выкладывал уже - code_1394.txt
карма: 1

0
Ответов: 9906
Рейтинг: 351
#270: 2007-05-09 12:01:56 ЛС | профиль | цитата
iarspider писал(а):
Ну положим, CBM_SETFOCUS есть нотифай, посылаемый только CBox-ом, и поэтому думается мне, что место ему - в hiComboBox.pas, а не в Win.pas. Наверное.

Ну вы чего, действительно не владеете искусством контекстного поиска, что-ли

Излагаю последовательнось действий, на которые у меня потребовалось минут 10 (с почесыванием в репе)

1) ищу CBM_SETFOCUS
2) вижу единственное его вхождение как константу в поле aEnter таблицы ComboActions: TCommandActions
3) ищу использование aEnter
4) наблюдаю значения этих полей в таблицах (перечисляю ненулевые):
ButtonActions.aEnter=BN_SETFOCUS
EditActions.aEnter=EN_SETFOCUS
ListActions.aEnter=LBN_SETFOCUS
ComboActions.aEnter=CBN_SETFOCUS
RichEditActions.aEnter=EN_SETFOCUS
5) продолжаю наблюдать далее и вижу использование:
function WndProcCtrl
....
case Msg.message of
....
CM_COMMAND:
begin
Result := True;
Cmd := HiWord( Msg.wParam );
if Cmd = fCommandActions.aClick then
begin
if Integer( fClickDisabled ) <= 0 then
DoClick;
end else
if Cmd = fCommandActions.aEnter then
begin
if Assigned( fOnEnter ) then fOnEnter( Self_ );
end else
if Cmd = fCommandActions.aLeave then
begin
if Assigned( fOnLeave ) then fOnLeave( Self_ );
end else
....
Поскольку я уже знаю, все-таки, что:
а) в fCommandActions стоит адрес одной из наблюдаемых ранее табличек (что и так понятно впрочем)
б) CM_COMMAND - это сообщение посланное парентом нужному контролу в ответ на WM_COMMAND, чтобы каждый занимался своими делами, а не чужими (и плевали они с высокой колокольни на отмеченный tsdima параметр DlgID)

То пишу в пост:
CBN_SETFOCUS возвращается KOL-ом как OnEnter



А теперь честно: я что, Америку открыл, или неведомое никому ранее боевое искусство
Типа: ну именно такое и называется, наверное - учить матчасть...
карма: 9

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)