*closed* Мистика с обработчиком нажатий клавиш. [Delphi/общее]

kill-still

Правю баги в чужом коде, и столкнулся с такой мистической проблемой:
надо поменять поведение компонента (потомок от TDrawGrid) при нажатии VK_DELETE (а конкретно отсутствие оного поведения при включоном эдиторе поставил во всех обработчиках брэкпоинты, запускаем. Если нажать любую другую клавишу, то в обработчик входит, если делит - то игнорирует вообще. Это всё при включоном эдиторе (property EditorMode). В нормальном режиме таблицы тоже в обработчик не входит, однако клавишу обрабатывает (удаляет значение в ячейке).
Компонент (грид этот) лежит прямо на форме.
У формы никакие обработчики не назначены, где перехватывается сообщение непонятно.
Написал перехватчик, хотел посмотреть откуда приходит мессадж, чтобы понять откуда он входит в обработчик. По Sender.ClassName не видит ничего.
Куда копать дальше ума не приложу. =(
куски кода:
   
TХХХХEditor = class(TInplaceEdit)
public
constructor Create(AOwner: TComponent); override;

procedure KeyDown(var Key: Word; Shift: TShiftState); override;
procedure KeyPress(var Key: Char); override;
end;
.........................
TХХХХGrid = class(TDrawGrid)
private
...............
protected
...............
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
procedure KeyPress(var Key: Char); override;
public
...............
constructor Create(AOwner: TComponent); override;
...............
property InplaceEditor;
published
...............
end;

..............
function TХХХХGrid.CreateEditor: TInplaceEdit;
begin
Result := TХХХХEditor.Create(Self);
end;


ни в одну из процедур KeyDown он не заходит
еще компоненте присвоена процедура к OnKeyDown, но туда тоже не заходит
(я так понимаю сюда выполнение кода должно заходить в последнюю очередь, после того как он пойдёт из подмененого KeyDown по inherited в исходники, и уже оттуда в OnKeyDown)

tokuchu

Скорее всего в каких-нибудь родителях перехватывается.

kill-still

каким образом в родителях, если оверрайднуто-то?
З.Ы. В родителе нормально всё работает.

bleyman

Я не знаю, как там что в дельфе, конечно. Но в винформах подобные штуки происходят постоянно и по вполне понятной причине. Ты ж понимаешь, надеюсь, что там под тонким слоем твоей аккуратненькой иерархии классов и вызовов методов между ними скрыто жуткое древнее винапи. Которое, на деле, всем и рулит. Начинается-то всё с какой-нибудь WM_KEYPRESS, прилетающей к WndProc дельфёгого TEdit'a, оттуда - к WndProc его предка, виндового стандартного Edit'а, ещё может WndProc дельфёгого TControl'a вызваться и всё такое. Если там где-то кто-то решил, что мессагу вполне удалось обработать, то до тебя она просто не дойдёт.

kill-still

да, конечно понимаю, я уже писал, что WM_KEYPRESS от другой клавиши я поймал, но откуда она пришла, отследить не удалось.
по существу:
у предка всё работает, значит с исходниками всё в порядке, стало быть ошибку надо искать в багокоде
ДАА! ещё: при отключённом-то эдиторе кнопка обрабатывается, причём явно не стандартной процедурой, а подмененой, и я в упор не могу понять ГДЕ . :shocked: :confused:

tokuchu

у предка всё работает
Определись про каких предков говоришь. :)
В общем я имел в виду 2 случая. Либо это съедается обработчиком из класса-предка. Либо это съедается контролом, в котором находится твой контрол.

kill-still

родитель - TDrawGrid (там же в коде видно)
лежит на TForm

Dimon89

Посмотри, не висит ли где менюшка (Popup или Main у которой одно из действий подвешено на Del. Тогда оно будет перехватываться раньше и тебе не приходить.

kill-still

О, респект тебе! :)
Экшн лист-то я просмотрел, а попап меню - нет, а там почему-то на несколько итемов процедуры напрямую, без экшенов повешены.
Оставить комментарий
Имя или ник:
Комментарий: