2

DelphiのほとんどのTWinControlの子孫には、「EDIT」、「COMBOBOX」、「BUTTON」、「RICHEDIT」などのサブクラスを定義するためのオーバーライドメソッドCreateParamsがあります。

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

サードパーティベンダーからのコントロールを含む、Delphiにはかなりの数の豊富な編集コントロールがあります。これらのコントロールはすべて、RichEditのサブクラスです。

CreateParamsで定義されたサブクラスをテストすることにより、元のベンダーに関係なく、コントロールがRichEditであるかどうかをテストする方法があるかどうか疑問に思っていますか?

4

4 に答える 4

2

Win32 APIGetClassName()またはRealGetWindowClass()関数を使用して(両者の違いについては、RealGetWindowClassがGetClassNameよりもはるかにリアルになる理由を参照)、使用可能なさまざまなRichEditクラス名の結果を確認します。

  • 'RICHEDIT'(1.0)
  • 'RICHEDIT20A'または'RICHEDIT20W'(2.x +)
  • 'RICHEDIT50W'(4.1)
  • 'TRichEdit'(VCLラッパー)
  • 他のサードパーティラッパーについても同様です。
于 2010-02-19T08:56:33.327 に答える
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を変更することがあります。

もう1つの考えられるが危険な解決策は、Delphiまたはサードパーティベンダーのほぼリッチな編集VCLクラスがコントロールにそのように名前を付けているため、コントロールのVCLクラス名に「RichEdit」文字列が含まれているかどうかを確認することです。

于 2010-02-20T01:38:00.607 に答える
0

私は何かが足りないのですか?それは単にテストの場合ではありません:

if (MyControl is TRichEdit)

また

if (MyControl is TCustomRichEdit)
于 2010-02-19T08:48:46.400 に答える
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」(ユニコード)バージョンもテストする必要がある場合があります(例:「RICHEDIT20W」)。

編集:コントロールに一致するようにInfo.WndProcテストを追加しました。

奇妙なことに、cxRichEditはリッチエディットウィンドウを使用するコントロールではないため、これはcxControlsでは機能しません(これは含まれているため、trueを返すにはcxControl.InnerControlを渡す必要があります)。

編集最初に作成したリッチエディットコントロール以上でこれを機能させることができませんでした。

于 2010-02-19T10:20:20.217 に答える