2013-11-24 39 views
1

這裏的設置時改變光標(符號)位置(我用Delphi 7,不知道這是否會在以後發生/早期版本):的RichEdit需要兩次點擊更改活動形式(德爾福)

用兩種形式創建一個新項目。 在第一種形式上放置TMemoTRichEditTButton。 將TMemoTRichEditLines屬性設置爲123456。 在TButtonOnClick事件處理程序把Form2.Show;

運行應用程序,單擊按鈕,空Form2將展示和獲得焦點。 現在單擊Form1TMemo的文本「123456」的中間 - 焦點將變回Form1,並且光標(插入符號)將位於文本「123456」的中間,並按預期方式單擊。 再次點擊Form2重新給予焦點。 現在單擊Form1TRichEdit的文本「123456」的中間 - 焦點將更改回Form1,但光標(插入符號)不會位於您單擊的文本「123456」的中間,但在RichEdit(或之前的任何地方)的第二個空行上。 如果在TRichEdit的文本「123456」中間的相同位置再次單擊,則光標(插入符號)現在將按預期方式移動到那裏。

因此,TRichEdit控件獲得焦點,但遊標(插入符號)未按預期移動。

注意:僅當將焦點從一種形式更改爲另一種形式時纔會發生這種情況。以同一形式將焦點從一個控件更改爲TRichEdit控件不會表現出這種有問題的行爲。

我的問題:如何避免在TRichEdit內需要進行第二次點擊,並在這方面控制行爲像TMemo

在此先感謝!

+1

這很可能是什麼與Delphi一起使用,並且只是這些Windows控件的標準行爲。 –

+0

從另一個應用程序切換焦點時也會發生。 –

+1

@DavidHeffernan是的,這也是我的想法,因爲RichEdit控件是Windows控件,而不是Delphi控件。這仍然是一個有問題的混亂行爲,沒有道理,需要解決方案。 – jedivader

回答

3

你可以派生一個新的控件,或者以任何你喜歡的方式繼承這個RichEdit的子類來干預激活機制。下面的示例中介類將焦點設置到鼠標按下消息之前的控制,當它即將通過鼠標左鍵來激活張貼如果控制是不是已經聚焦:

type 
    TRichEdit = class(comctrls.TRichEdit) 
    protected 
    procedure WMMouseActivate(var Message: TWMMouseActivate); 
     message WM_MOUSEACTIVATE; 
    end; 

procedure TRichEdit.WMMouseActivate(var Message: TWMMouseActivate); 
begin 
    if (GetFocus <> Handle) and (Message.MouseMsg = WM_LBUTTONDOWN) then 
    SetFocus; 
    inherited; 
end; 
+0

太棒了!這個解決方案完美地工作,正是我所期待的。謝謝! – jedivader

+0

@ jedi - 不客氣! –