问题描述
以下_isEdit
函数检测是否可以将输入应用于当前关注的控件:
class function TSpeedInput._getFocusedControlClassName(): WideString;
var
lpClassName: array[0..1000] of WideChar;
begin
FillChar(lpClassName,SizeOf(lpClassName),0);
Windows.GetClassNameW(GetFocus(),PWideChar(@lpClassName),999);
Result := lpClassName;
end;
class function TSpeedInput._isEdit(): Boolean;
const
CNAMES: array[0..3] of string = ('TEdit','TMemo','TTntMemo.UnicodeClass','TTntEdit.UnicodeClass');
var
cn: WideString;
i: Integer;
begin
Result := False;
cn := _getFocusedControlClassName();
for i := Low(CNAMES) to High(CNAMES) do
if cn = CNAMES[i] then begin
Result := True;
Exit;
end;
//MessageBoxW(0,PWideChar(cn),nil,0);
end;
我不喜欢的是类名称列表的硬编码。是否可以检测到当前聚焦的窗口属于编辑器家族,或者更确切地说,它具有活动的插入符号? (为了使_isEdit
返回False
处于只读模式的 WhatItItsControl )。
解决方法
如果您感兴趣的控件位于特定的表单上,并且属于该表单(并且是标准的Delphi控件),则可以使用以下命令:
function TFormML2.FocusIsEdit: boolean;
var
i : integer;
begin
Result := FALSE;
for i := 0 to ComponentCount - 1 do
begin
if Components[ i ] is TCustomEdit then
begin
if (Components[ i ] as TCustomEdit).Focused and not (Components[ i ] as TCustomEdit).ReadOnly then
begin
Result := TRUE;
break;
end;
end;
end;
end;
如果您知道表格并可以将其作为参数传递,则可以执行类似的操作。
TCustomEdit是所有编辑框,备忘录等的始祖。
,如果分配了控件的Handle
,则可以使用此技巧:
function IsEdit(AControl: TWinControl): boolean;
begin
if AControl.HandleAllocated then
begin
Result := SendMessage(AControl.Handle,EM_SETREADONLY,WPARAM(Ord(AControl.Enabled)),0) <> 0;
end
else
begin
Result := AControl is TCustomEdit;
end;
end;