4

クラスを作成しました

  FormInfo = class (TComponent)
  private
    FLeftValue : Integer;
    FTopValue : Integer;
    FHeightValue : Integer;
    FWidthValue : Integer;
  public
    constructor Create(
      AOwner : TComponent;
      leftvalue : integer;
      topvalue : integer;
      heightvalue : integer;
      widthvalue : integer);
  protected
    procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
    function  GetChildOwner: TComponent; override;
    //procedure SetParentComponent(Value : TComponent); override;
  published
    property LeftValue : Integer read FLeftValue write FLeftValue;
    property TopValue : Integer read FTopValue write FTopValue;
    property HeightValue : Integer read FHeightValue write FHeightValue;
    property WidthValue : Integer read FWidthValue write FWidthValue;
  end;

これは、フォームのシリアル化にさらに使用されます。Createメソッドには次の実装があります

constructor FormInfo.Create(AOwner: TComponent; leftvalue, topvalue, heightvalue,
  widthvalue: integer);
begin
  inherited Create(AOwner);

  FLeftValue := leftvalue;
  FTopValue := topvalue;
  FHeightValue := heightvalue;
  FWidthValue := widthvalue;
end;

組み立ての結果、警告が表示されます

[dcc32 Warning] SerialForms.pas(17): W1010 Method 'Create' hides virtual method of base type 'TComponent'

アプリケーションの機能を失うことなく、この警告を取り除くために何をする必要がありますか?

4

2 に答える 2

8

予約語を使用して、reintroduceクラスの基本クラス コンストラクターを意図的に非表示にするコンパイラーを示します。

TMyClass = class (TComponent)
public
  constructor Create(AOwner: TComponent; MyParam: Integer; Other: Boolean); reintroduce;

そうすれば、警告は表示されません。

つまり、TComponent.Create コンストラクターを非表示にすることを再考する必要があります。デフォルトの TComponent.Constructor は、設計時にフォーム/データ モジュールに追加されたときに、実行時にコンポーネント インスタンスを作成するために Delphi によって呼び出されるため、これは悪い考えです。

TComponent は、そのプロセス中にカスタム コードを実行できるようにコンストラクターを仮想化しますが、Create ファームに所有者のみを渡すことに固執し、作成が完了した後にストリーミング メカニズムがプロパティの保存された値を処理できるようにする必要があります。

その場合、コンポーネントは「未構成」であることをサポートする必要があります。または、このユニバーサルコンストラクターでそのプロパティのデフォルト値を設定する必要があります。

より多くのコンストラクターを別の名前で提供して、さまざまなプロパティの値を渡すコードから実行時にインスタンスを作成できるようにすることで、利便性を高めることができます。

于 2012-12-19T14:39:34.003 に答える
2

次のように、コンストラクターに別の名前を使用すると、より良く、読みやすくなる可能性があります。

constructor FormInfo.CreateWithSize(AOwner: TComponent; leftvalue, topvalue, heightvalue, widthvalue: integer);
于 2015-02-02T22:42:16.040 に答える