2011-06-28 25 views
3

在我的Delphi 2009的應用程序,我有這樣的窗口:如何退出我的就地編輯器並在Delphi中處理按鈕?

enter image description here

它有一個具有上所有紙張操作下就可以了TTabSheet以及按鈕的TPageControl。

在TTabSheet的左邊是一個TElXTree(LMD的樹/網格組件),而在TTabSheet的右邊是一個TPanel,其中包含特定於此工作表的按鈕。

當我在TElXTree中選擇了一行,並且我點擊了任意一組按鈕中的按鈕時,按鈕都正常工作。

現在在TElXTree中,標有「Text」的列可以使用隨TElXtree提供的Inplace-Editor進行編輯。當我點擊文本時,它進入編輯模式。

當處於編輯模式時,當我點擊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; 
+3

看起來像樹組件中的錯誤 –

+0

@PA:即在樹編輯器中處理代碼的就地編輯器。 –

回答

1

確實看起來像一個錯誤。兩種可能的(骯髒)的變通辦法:

通過Application.OnMessage:

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

解決方法#1不起作用。它確實殺死了焦點,我知道它現在應該處理鼠標左鍵。但由於某種原因,它沒有,也沒有完成任何更多。我正在研究這個。同時,如果您有任何想法,我會很感激您的任何想法。 – lkessler

+0

現在我明白了。它花了一些調試和工作,雖然。在我的問題中查看我的代碼。感謝@NGLN提供這個。 – lkessler

+1

@lkessler這種不完全工作的原因可能是額外的深度(我的樹是形式的直接孩子),但我不急於再次安裝LMD包來測試它...很高興我可以幫助雖然。 – NGLN

0

它可能是一個焦點問題。查看您在窗體的OnExit OnEnter方法中編寫的代碼。

+0

感謝這一點,但不幸的是我沒有任何相關的OnExit或OnEnter方法。它似乎是組件中的一個錯誤。 – lkessler