1

Delphiのビジュアルコントロールの角を丸くするルーチンを作成しました。

ここで私がやりたいのは、フォームの作成時にすべてのビジュアルオブジェクトの関数を呼び出さなくても、のようなすべてのビジュアルオブジェクトが丸められるようTMemoにすることですTEditTPanel

コード(フォームユニット)からこれらの各クラスのcreateメソッドを拡張して、クラスの名前と他のユニットの通常の動作を維持するにはどうすればよいですか?

procedure RoundCornersOf(Control: TWinControl) ;
var
   R: TRect;
   Rgn: HRGN;
begin
   with Control do
   begin
     R := ClientRect;
     rgn := CreateRoundRectRgn(R.Left, R.Top, R.Right, R.Bottom, 20, 20) ;
     Perform(EM_GETRECT, 0, lParam(@r)) ;
     InflateRect(r, - 4, - 4) ;
     Perform(EM_SETRECTNP, 0, lParam(@r)) ;
     SetWindowRgn(Handle, rgn, True) ;
     Invalidate;
   end;
end;
4

1 に答える 1

2

実行時にクラスを変更するための構造またはハックが存在します。たとえば、デルファイでのコンポーネントクラスの置き換え、および実行時のオンデマンドでのコンポーネントクラスの変更を参照してください。ただし、私が理解しているように、発生するすべての制御タイプの個別のタイプを宣言する必要があります。

別の方法は、フォームの作成後に、ControlsおよびControlCountプロパティを使用してすべてのコントロールを横断することです。

  public
    procedure AfterConstruction; override;
  end;

procedure ModifyControls(Window: TWinControl);
var
  I: Integer;
begin
  for I := 0 to Window.ControlCount - 1 do
    if Window.Controls[I] is TWinControl then
    begin
      ModifyControls(TWinControl(Window.Controls[I]));
      RoundCorners(TWinControl(Window.Controls[I]));
    end;
end;

procedure TForm1.AfterConstruction;
begin
  inherited AfterConstruction;
  ModifyControls(Self);
end;

しかし、コントロールのレクリエーションには注意してください。これは、あなたが思っている以上に起こります。たとえば、編集のBorderStyleプロパティを変更すると、編集が再作成され、変更が取り消されます。それらすべてを追跡できる場合は、そのような場合に変更をやり直してください。

于 2012-06-29T23:04:56.397 に答える