如何测试控件是否是RichEdit控件

时间:2010-02-19 08:42:23

标签: delphi richedit

Delphi中的大多数TWinControl后代都有一个覆盖方法CreateParams来定义它的子类,例如:'EDIT','COMBOBOX','BUTTON','RICHEDIT'等。

CreateSubClass(Params, 'EDIT');
CreateSubClass(Params, 'COMBOBOX');
CreateSubClass(Params, 'BUTTON');

Delphi有很多丰富的编辑控件,包括来自第三方供应商的控件。所有这些控件都是RichEdit的子类。

我想知道是否有办法通过测试CreateParams中定义的SubClass来测试控件RichEdit而不管它是原始供应商吗?

4 个答案:

答案 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控件。