首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何测试控件是否为RichEdit控件

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

Stack Overflow用户
提问于 2010-02-19 16:42:23
回答 4查看 2.6K关注 0票数 2

在Delphi语言中,大多数TWinControl的后代都有一个重写方法CreateParams来定义它的子类,比如:'EDIT','COMBOBOX','BUTTON','RICHEDIT‘等等。

代码语言:javascript
复制
CreateSubClass(Params, 'EDIT');
CreateSubClass(Params, 'COMBOBOX');
CreateSubClass(Params, 'BUTTON');

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

我想知道是否有一种方法可以通过测试在RichEdit中定义的SubClass来测试控件是否为CreateParams,而不管它的原始供应商是什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-02-20 09:38:01

感谢所有的反馈。我认为没有办法获得TWinControl的windows类名。

以下是从JamesB的版本修改而来的另一个版本的IsRichEdit:

代码语言:javascript
复制
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类都是这样命名控件的。

票数 1
EN

Stack Overflow用户

发布于 2010-02-19 16:56:33

使用Win32接口GetClassName()RealGetWindowClass()函数(请参阅What makes RealGetWindowClass so much more real than GetClassName?了解它们之间的区别),然后检查结果中是否有可用的各种RichEdit类名:

用于其他第三方包装的

  • 'RICHEDIT' (1.0)
  • 'RICHEDIT20A''RICHEDIT20W' (2.x+)
  • 'RICHEDIT50W' (4.1)
  • 'TRichEdit' (VCL包装)
票数 2
EN

Stack Overflow用户

发布于 2010-02-19 16:48:46

我是不是遗漏了什么?这不是一个简单的测试案例:

代码语言:javascript
复制
if (MyControl is TRichEdit)

代码语言:javascript
复制
if (MyControl is TCustomRichEdit)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2294962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档