Как выйти из редактора Inplace и обработать кнопку в Delphi? - PullRequest
3 голосов
/ 28 июня 2011

В моем приложении Delphi 2009 у меня есть это окно:

enter image description here

У него есть 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;

Ответы [ 2 ]

1 голос
/ 28 июня 2011

Это действительно похоже на ошибку. Два возможных (неприятных) обходных пути:

Через приложение. Сообщение:

procedure TMainForm.ApplicationEventsMessage(var Msg: tagMSG;
  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);
        with Screen.ActiveControl do
          if not PtInRect(ClientRect, ScreenToClient(P)) then
            Perform(WM_KILLFOCUS, 0, 0);
      end;
end;

Или подкласс компонента:

type
  TElXTree = class(ElXTree.TElXTree)
  private
    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
  end;

  TForm1 = class(TForm)
    ElXTree1: TElXTree;
    ...

procedure TElXTree.CMMouseLeave(var Message: TMessage);
var
  P: TPoint;
begin
  GetCursorPos(P);
  if not PtInRect(ClientRect, ScreenToClient(P)) then
    if Screen.ActiveControl <> nil then
      if Screen.ActiveControl.ClassNameIs('TElInpEdit') then
        Screen.ActiveControl.Perform(WM_KILLFOCUS, 0, 0);
  inherited;
end;

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

0 голосов
/ 28 июня 2011

Это может быть проблемой фокуса.Посмотрите на код, который вы написали в методах OnExit OnEnter вашей формы.

...