Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 将TTextEdit更改为从右向左的语言不会';不要换插入符号_Delphi_Devexpress_Right To Left_Caret - Fatal编程技术网

Delphi 将TTextEdit更改为从右向左的语言不会';不要换插入符号

Delphi 将TTextEdit更改为从右向左的语言不会';不要换插入符号,delphi,devexpress,right-to-left,caret,Delphi,Devexpress,Right To Left,Caret,我正在用DelphiXE3编写一个支持英语和希伯来语的应用程序 当我在某些文本编辑器(TEdit等)的编辑模式下更改当前语言(使用Alt+Shift)时,插入符号(文本光标)图标不会像在其他已知应用程序(Office、Chrome等)的编辑器中那样更改为新方向。 对于那些不知道不同插入符号图标的人,这里是它们的图片: 和 只有当我将焦点更改为另一个组件,然后在编辑模式下返回到上一个编辑器时,它才会显示与当前语言方向对应的正确插入符号图标 在使用Delphi XE3之前,我使用过Delphi 7,

我正在用DelphiXE3编写一个支持英语和希伯来语的应用程序

当我在某些文本编辑器(TEdit等)的编辑模式下更改当前语言(使用Alt+Shift)时,插入符号(文本光标)图标不会像在其他已知应用程序(Office、Chrome等)的编辑器中那样更改为新方向。
对于那些不知道不同插入符号图标的人,这里是它们的图片:

只有当我将焦点更改为另一个组件,然后在编辑模式下返回到上一个编辑器时,它才会显示与当前语言方向对应的正确插入符号图标

在使用Delphi XE3之前,我使用过Delphi 7,它工作得很好。
另外,我也尝试过DevExpress文本编辑器,但它们也有同样的问题。

我不确定过去哪些功能可能有效,或者哪些功能可能发生了变化,但下面类似的功能应该有效。似乎
WM_INPUTLANGCHANGE
是一条很滑的消息,通过重写
WndProc
甚至使用
Application.HookMainWindow
钩住,几乎不可能可靠地捕捉到这条消息(有一篇不错的文章)。还要注意的是,这只是希伯来语键盘的一个例子——它不会捕获所有从右到左的键盘(如果需要的话,显然需要添加它们)

const希伯来语键盘=$40D0000;
变量gLangHook:HHOOK=0;
函数LangHookProc(代码:整数;wParam:wParam;
lParam:lParam):LRESULT;stdcall;
开始
如果(代码=HC_动作)和
(PCWPStruct(lParam)^.message=WM\u INPUTLANGCHANGE)然后
开始
如果(PCWPStruct(lParam)^.lParam和$FFFF0000)=希伯来语键盘,则
Application.BiDiMode:=bdright-toleft
其他的
Application.BiDiMode:=bdleftoright;
结束;
结果:=CallNextHookEx(gLangHook、Code、wParam、lParam);
结束;
过程TForm1.FormCreate(发送方:TObject);
开始
gLangHook:=setWindowshookx(WH_CALLWNDPROC,@LangHookProc,HInstance,
GetCurrentThreadId);
如果gLangHook=0,则
赖斯·塞罗;
结束;
程序TForm1.FormDestroy(发送方:ToObject);
开始
如果gLangHook为0,则
开始
unhookwindowshookx(gLangHook);
格兰胡克:=0;
结束;
结束;

这里我设置了应用程序的BiDiMode-如果所有子项都有
ParentBiDiMode:=true
,那么所有控件都应该切换到从右向左模式。当然,你可以随心所欲地处理这个问题-我认为这是最困难的部分。

不管它是不是像@J。。。建议的,或特定于机器的错误,我遇到了它。
我没有找到明确的解决方案,而是找到了一个很好的解决办法。
注意:此解决方案仅适用于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
,当我捕捉到事件时,我会依次失去焦点并重新获得当前活动控件的焦点。这模拟了我前面所说的,只有当我将焦点更改为另一个组件,然后在编辑模式下返回到上一个编辑器时,它才会显示正确的插入符号图标。

我真的不喜欢这个解决方案,因为它不能解决任何问题,但它适合我的需要。
欢迎您提出其他想法:)

Delphi 7或Delphi XE3中没有TTextEdit或TMultiEdit;是什么让你试着说“很好”的?你说的是“编辑模式”;你正在处理的控件中还有哪些其他模式?你是对的。我指的是Delphi VCL中的TEdit和DevExpress中的TTextEdit/TcxMemo。简言之,每个文本编辑器。首先,感谢您的回复:)我确实不得不努力寻找一种方法来捕捉WM_INPUTLANGCHANGE消息,但后来我发现CM_INPUTLANGCHANGE工作得很好。关于BiDiMode的更改-我已经尝试过预先使用它,但它不会更改插入符号的方向,只会更改编辑器的对齐方式。哇…CM_INPUTLANGCHANGE要容易得多。这似乎是VCL不会遗漏的东西,但这是我第一次听说。想想看。无论如何,在这一点上,当你说“它不会改变插入符号的方向”时,我不确定我是否理解了你的意思。你能说得更具体一点吗?是的,这有点难以解释。。。因此,我将使用图像重试:)从左到右(英语)插入符号图标:[,从右到左(希伯来语)插入符号图标:[.同样,问题是,当我更改语言时,插入符号图标不会立即更改,但只有当我将焦点更改为另一个控件,然后返回到上一个编辑器时才会更改。@Saurye可能会将这些图像包含在您的主要问题中。我以前从未见过这样的文本输入插入符号(通常只是垂直线)而且在切换到希伯来语时没有注意到它发生了变化。无论如何,我现在看到了-我的英语光标仍然只是一条垂直线,但使用聚焦编辑框上方的代码确实会切换对齐,并立即收到正确的RtL bidi插入符号(如第二幅图像中的-指向左侧).请注意,这是Delphi XE2。可能是XE3中的错误?
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;