2013-06-25 33 views
0

我正在使用支持英語和希伯來語的Delphi XE3編寫應用程序。將TTextEdit更改爲從右向左的語言不會改變插入符號

當我改變當前的語言(與Alt鍵 + ),而在一些文本編輯器的編輯模式(TEDIT等),插入符號(文本光標)圖標不會更改爲類似的新方向它在其他已知應用程序(Office,Chrome等)中編輯。
對於那些不知道不同的脫字符圖標可能的人,這裏是他們的圖像:
Left-to-right (English) caret iconRight-to-left (Hebrew) caret icon

只有當我將焦點更改爲另一個組件,然後在編輯模式下返回到之前的編輯器時,它纔會顯示與當前語言方向對應的正確脫字符號圖標。

在使用Delphi XE3之前,我使用了Delphi 7,它工作正常。 另外,我已經嘗試了DevExpress文本編輯器,它們也有同樣的問題。

+0

Delphi 7或Delphi XE3中沒有TTextEdit或TMultiEdit;你試過那個「工作正常」是什麼?你談論「編輯模式」;您正在處理的控件中還有哪些其他模式? –

+0

你是對的。我的意思是Delphi VCL中的TEdit和DevExpress中的TTextEdit/TcxMemo。簡而言之 - 每一個文本編輯器。 – Saurye

回答

0

我不確定過去可能發生了什麼或者可能發生了什麼變化,但是像下面這樣的東西應該可以工作。看起來WM_INPUTLANGCHANGE是一個很滑的信息,幾乎不可能通過覆蓋WndProc或者甚至使用Application.HookMainWindow(它有一個像樣的文章here)可靠地捕獲。還要注意,這只是希伯來語鍵盤的一個例子 - 它不會捕獲所有從右到左的鍵盤(如果需要,您顯然需要添加它們)。

const HEBREW_KEYBOARD = $40D0000; 
var gLangHook: HHOOK = 0; 

function LangHookProc(Code: Integer; wParam: WPARAM; 
            lParam: LPARAM): LRESULT; stdcall; 
begin 
    if (Code = HC_ACTION) and 
    (PCWPStruct(lParam)^.message = WM_INPUTLANGCHANGE) then 
    begin 
    if (PCWPStruct(lParam)^.lParam and $FFFF0000) = HEBREW_KEYBOARD then 
     Application.BiDiMode := bdRightToLeft 
    else 
     Application.BiDiMode := bdLeftToRight; 
    end; 
    Result := CallNextHookEx(gLangHook, Code, wParam, lParam); 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    gLangHook := SetWindowsHookEx(WH_CALLWNDPROC, @LangHookProc, HInstance, 
                  GetCurrentThreadId); 
    if gLangHook = 0 then 
    RaiseLastOSError; 
end; 

procedure TForm1.FormDestroy(Sender: TObject); 
begin 
    if gLangHook <> 0 then 
    begin 
    UnhookWindowsHookEx(gLangHook); 
    gLangHook := 0; 
    end; 
end; 

在這裏,我設置應用程序的BiDiMode - 如果所有的孩子都有ParentBiDiMode := true那麼所有的控制應該切換到從右到左的模式。當然,你可以處理這個,但你想 - 我認爲這是很難的部分。

+0

首先 - 感謝您的回覆:) 我確實不得不努力找到一種方法來捕獲WM_INPUTLANGCHANGE消息,但後來我發現CM_INPUTLANGCHANGE工作得很好。 關於BiDiMode的變化 - 我已經嘗試過使用它,但它不會改變插入符號的方向,而只是編輯器的對齊方式。 – Saurye

+0

哇... CM_INPUTLANGCHANGE要容易得多。這似乎是VCL不會遺漏的東西,但這是我聽到的第一個。去搞清楚。無論如何,在這一點上,當我說*「它不會改變插入符號的方向」*時,我不確定我是否理解你的意思。你可以再詳細一點嗎? –

+0

是的,這有點難以解釋...所以我會再次嘗試使用圖像:)從左至右(英文)caret icon:[http://up380.siz.co.il/up3/t1fhokkgjmzz.png ],從右至左(希伯來語)插入圖標:[http://up380.siz.co.il/up1/odjazzjnn3zk.png]。而且,問題在於,當我更改語言時,脫字符圖標不會立即更改,而只會在將焦點更改爲另一個控件時返回到以前的編輯器。 – Saurye

0

無論是像@J ...這樣的Delphi XE3錯誤,還是機器特有的錯誤,我都會遇到它。
我沒有找到明確的解決方案,而是一個很好的解決方法。
注意:此解決方案僅適用於DevExpress編輯器,因爲事件被TWinControl後代捕獲。

下面是代碼:

procedure OnChangeLanguageEvent(var Msg: TMessage); message CM_INPUTLANGCHANGE; 

procedure TForm1.OnChangeLanguageEvent(var Msg: TMessage); 
begin 
    Screen.ActiveControl.Perform(WM_KILLFOCUS,0,0); 
    Screen.ActiveControl.Perform(WM_SETFOCUS,0,0); 
    inherited; 
end; 

在這個過程中我趕上事件CM_INPUTLANGCHANGE,當我這樣做,我sequently失去焦點,恢復當前有效控制的重點。這模擬了我之前所說的,只有當我將焦點更改爲另一個組件時,然後返回到編輯模式下的以前的編輯器時,它才顯示正確的脫字符圖標。

我不太喜歡這個解決方案,因爲它並沒有真正解決任何問題,但對我的需求來說很好。 歡迎您提出其他想法:)

相關問題