В моем приложении Delphi 2009 у меня есть это окно:
У него есть TPageControl с TTabSheet, а также кнопки внизу, которые работают на всехлисты.
Слева от TTabSheet находится TElXTree (компонент дерева / сетки LMD), а справа от TTabSheet - TPanel, содержащий кнопки, относящиеся только к этому листу.
Когда в TElXTree выбрана строка, и я нажимаю любую кнопку в любом наборе кнопок, все кнопки работают нормально.
Теперь в пределах TElXTree столбец с надписью «Текст» можно редактировать с помощью Inplace.Редактор поставляется с TElXtree.Когда я нажимаю на текст, он переходит в режим редактирования.
В режиме редактирования, когда я щелкаю в любом месте TElXTree (например, на флажке), он выходит из редактора И обрабатывает команду (т.е. проверяетили снимите флажок).Однако в режиме редактирования, когда я нажимаю любую кнопку в любом наборе кнопок, она просто выходит из редактора и НЕ обрабатывает кнопку.Затем мне нужно нажать на кнопку еще раз, чтобы обработать эту кнопку.
Есть ли здесь что-то простое, чего я не делаю или не понимаю, что позволило бы мне нажать на одну из этих кнопок и позволить ей выйтимой редактор на месте И обрабатываете кнопку?
Продолжение:
Благодаря ответу @ NGLN я получил обходной путь.Я использовал его метод Application.OnMessage, который я ранее использовал в любом случае для некоторого кода перетаскивания.Я должен был внести некоторые изменения, и вот что я придумал:
procedure TMainForm.AppMessageHandler(var Msg: TMsg; var Handled: Boolean);
var
P: TPoint;
begin
if Msg.message = WM_LBUTTONDOWN then
if Screen.ActiveControl <> nil then
if Screen.ActiveControl.ClassNameIs('TElInpEdit') then
begin
GetCursorPos(P);
{ When in the inplace editor, I need to go to its parent ElXTree }
{ because the ElXTree does not have the problem. }
{ Only components outside the ElXTree do }
with Screen.ActiveControl.Parent do
if not PtInRect(ClientRect, ScreenToClient(P)) then begin
{ The WM_Killfocus didn't work for me, but it gave me this idea: }
{ 1. Complete the operation, and 2. Simulate the mouse click }
InplaceEdit.CompleteOperation(true);
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
{ Then skip the regular handling of this WM_LBUTTONDOWN }
Handled := true;
end;
end;
end;