2013-08-25 62 views
0

我有一個組件,它附加到任何TCustomEdit控件。它過濾到TCustomEdit控件的鍵盤輸入,這樣控件的行爲就像一個maskedit。在TMemo,TEdit控件之外攔截pastefromclipboard消息

但我遇到了另一個問題。雖然我可以在粘貼之前分析剪貼板的內容,然後決定是否粘貼(OnKeyDown事件CTRL + V),但我無法通過右鍵單擊菜單來粘貼。

我不想攔截OnChange事件,因爲我想在控件的文本實際更改之前進行操作。

感謝建議

+2

你可以聽WM_PASTE嗎? –

+0

@DavidHeffernan:我想,但是如何:-)我不知道如何攔截另一個控件的WM_Paste。有沒有辦法通過這個控制管事件到達附加的TCustomEdit控件? – lyborko

+0

替換窗口過程。我想你使用WindowProc屬性。 –

回答

2

我認爲你可以通過偵聽發送給目標控件的WM_PASTE消息來做你所需要的。最簡單的方法是通過WindowProc屬性替換窗口過程。

+0

是的,我做到了.... – lyborko

1

這裏是如何做到這一點:

TTextMask = class (TComponent) 
    private 
    FtempWndProc: TWndMethod; 
    FWinControl:TWinControl; 
    procedure DoWindowProc(var Message: TMessage); 
    procedure SetWinControl(Value: TWinControl); 
    //... 
    published 
    //... 
    property WinControl : TWinControl read FWinControl write SetWinControl; 
    end; 

// ... 

procedure TTextMask.SetWinControl(Value: TWinControl); 
begin 
    if Assigned(Value) and not Assigned(FWincontrol) 
     then 
      begin 
      FtempWndProc := Value.WindowProc; 
      Value.WindowProc := DoWindowProc; 
      end; 
    //... 
    FWincontrol:=Value; 
end; 



procedure TTextMask.DoWindowProc(var Message: TMessage); 
var s:string; 
    Index:Integer; 
    m:integer; 
begin 
    if Message.Msg = WM_Paste then 
    begin 
    // code here 
    end; 
    FtempWndProc(Message); 
end; 

感謝名單了很好的建議,大衛。

+2

在您的組件或其實例存儲在「FWinControl」字段中的組件被銷燬之前,您必須恢復原始窗口過程。 – TLama

+1

@TLama Thanx ... – lyborko