Delphi中的大多数TWinControl后代都有一个覆盖方法CreateParams来定义它的子类,例如:'EDIT','COMBOBOX','BUTTON','RICHEDIT'等。
CreateSubClass(Params, 'EDIT');
CreateSubClass(Params, 'COMBOBOX');
CreateSubClass(Params, 'BUTTON');
Delphi有很多丰富的编辑控件,包括来自第三方供应商的控件。所有这些控件都是RichEdit的子类。
我想知道是否有办法通过测试CreateParams中定义的SubClass来测试控件RichEdit而不管它是原始供应商吗?
答案 0 :(得分:2)
使用Win32 API GetClassName()
或RealGetWindowClass()
函数(请参阅What makes RealGetWindowClass so much more real than GetClassName?了解它们之间的区别),然后检查可用的各种RichEdit类名的结果:
'RICHEDIT'
(1.0)'RICHEDIT20A'
或'RICHEDIT20W'
(2.x +)'RICHEDIT50W'
(4.1)'TRichEdit'
(VCL包装)答案 1 :(得分:1)
感谢所有反馈。我认为没有办法获得TWinControl的Windows类名。
这是从JamesB的版本修改的另一个版本的IsRichEdit:
type TWinControlAccess = class(TWinControl);
function IsRichEdit(C: TWinControl): boolean;
const A: array[0..8] of string = (
'RICHEDIT',
'RICHEDIT20A', 'RICHEDIT20W',
'RICHEDIT30A', 'RICHEDIT30W',
'RICHEDIT41A', 'RICHEDIT41W',
'RICHEDIT50A', 'RICHEDIT50W'
);
var Info: TWNDClass;
p: pointer;
s: string;
begin
p := TWinControlAccess(C).DefWndProc;
Result := False;
for s in A do begin
if GetClassInfo(HInstance, PChar(s), Info) and (Info.lpfnWndProc = p) then begin
Result := True;
Break;
end;
end;
end;
如果Windows中有更新版本的RichEdit类,我们可能会修改数组A.
另一个可能但有风险的解决方案是我只检查控件的VCL类名是否包含'RichEdit'字符串,因为Delphi或第三方供应商提供的几乎丰富的编辑VCL类命名控件。
答案 2 :(得分:0)
我错过了什么吗?这不仅仅是一个测试案例:
if (MyControl is TRichEdit)
或
if (MyControl is TCustomRichEdit)
答案 3 :(得分:0)
您可以使用
function GetClassInfo(hInstance: HINST; lpClassName: PChar; var lpWndClass: TWndClass): BOOL;
我认为这就是雷米试图做的事情。
类似的东西:
Function IsRichEdit(MyControl : TWinControl):Boolean;
var
Info : TWNDClass;
begin
Result := False;
if GetClassInfo(HInstance,PCHAR('RICHEDIT'),Info) and (Info.lpfnWndProc = MyControl.DefWndProc) then
Result := True
else if GetClassInfo(HInstance,PCHAR('RICHEDIT20A'),Info) and (Info.lpfnWndProc = MyControl.DefWndProc) then
Result := True
else if GetClassInfo(HInstance,PCHAR('RICHEDIT30A'),Info) and (Info.lpfnWndProc = MyControl.DefWndProc) then
Result := True
else if GetClassInfo(HInstance,PCHAR('RICHEDIT41A'),Info) and (Info.lpfnWndProc = MyControl.DefWndProc) then
Result := True
else if GetClassInfo(HInstance,PCHAR('RICHEDIT50A'),Info) and (Info.lpfnWndProc = MyControl.DefWndProc) then
Result := True
end;
如果您使用的是Delphi> 2007年你可能需要测试'W'(unicode)版本,例如'RICHEDIT20W'
编辑:添加了Info.WndProc测试以匹配控件。
奇怪的是,这对cxControls不起作用,因为cxRichEdit不是使用富编辑窗口的控件(它是一个包含所以你需要传递cxControl.InnerControl才能返回true)。
编辑我无法让这个工作超过第一个创建的richedit控件。