6

Delphiのヘルプによると、フォームのコンストラクターをオーバーライドするか、OnCreateイベントを使用します。ただし、両方を行わないでください。これの理由は何ですか?私が見ることができる唯一のことは、継承されたものが子孫のコンストラクターから除外されている場合、TCustomForm.Createは呼び出されないということです。したがって、その場合、OnCreateは呼び出されません。しかし、継承が省略されていなければ、問題はわかりません。

編集:質問の理由を追加する必要があります。私は実際に同じクラスで両方を使用することを計画していません。しかし、子孫がすでにOnCreateを使用している場合は、基本クラスのコンストラクターをオーバーライドすることを検討していました。ですから、気づかなかったような葛藤があるのではないかと思っていました。しかし、私は大丈夫なはずの印象を受けています。一貫性を保つために、基本クラスでOnCreateを使用することもできますが。

別の編集:助けてくれてありがとう。したがって、正しく実行すれば、両方の方法を使用しても実際には何も壊れないように見えます。しかし、それを行う際の問題は、コードが理解しにくくなることです。そして、私は最良の答えを選ぶことになっていると思いますが、誰もが同意しているようです。だから私は最初に投稿されたものを選びます。

4

5 に答える 5

4

両方が呼び出されます。両方を使用するとコードの読者が混乱するため、アドバイスは適切です。

于 2011-04-21T09:53:57.767 に答える
3

編集を考慮すると、両方を使用しても問題はありません。

オーバーライドされたコンストラクターを次のように記述してください。

constructor TMyForm.Create(AOwner: TControl);
begin
  inherited;
  ....
  your new code here
end;

また、追加したCreateコードの前にOnCreateハンドラーが呼び出されることに注意してください。これはすぐに混乱する可能性があるため、マニュアルではこれを推奨していません。

警告

クラスをオーバーライドする場合は、OnCreateを使用しないでください。OnCreateイベントのユーザーがそのクラスを操作できなくなる可能性があるため、オーバーライドされたコンストラクターで操作を行ってください。ルールは、TMyFormのすべてのインスタンスの作成で同じである必要があるものはオーバーライドコンストラクターに入る必要があるということです。

TMyFormが使用される場所に応じて異なる可能性のあるものを作成し、OnCreateハンドラーに入れる必要があります。

近くにある他のコンポーネントとの依存関係がある場合、コードは常にOnCreateハンドラーに入る必要があります。

于 2011-04-21T11:54:27.067 に答える
2

同一のコードまたは複雑なコードを2つの異なる場所に配置してしまう可能性があります。私はほとんどの場合、OnCreateイベントを自分で使用します。

于 2011-04-21T09:52:13.217 に答える
2

いくつかの場所がある場合は、何でもできます。ただ1つを選んでそれに固執してください。正当な理由がある場合にのみ、別の場所を使用してください。

主な理由は明快さです。同じパターンに従っているので、いくつかの間違いを避けます。

于 2011-04-21T09:55:56.437 に答える
0

私は必要に応じてonCreateイベントを使用します-TFormのデフォルトコンストラクターをオーバーライドするのは好きではありません-IMOは、後のある時点で常に複雑さと混乱に遭遇します。

これを処理する他の方法。可能な場合は次のようにします。

'initialize'メソッドをフォームに追加します-作成後、表示する前に呼び出します。これは、COMオブジェクトで発生することと似ています。コンストラクターにはパラメーターがなく、Initialize呼び出しでビジネスを行います。

また、Delphi自体が継続的に使用しているように、フォームユニットではフォームクラスの外部で変数と関数を使用することが適切な場合もあります。このアプローチと併せて、フォームユニットの初期化セクションとファイナライズセクションも使用することを検討してください。ただし、GREAT CAREでは、特に、クリーンアップにOwnerプロパティを使用しているCOMオブジェクトまたはコンポーネントでは、次の問題が発生する可能性があります。シャットダウン時のAVの問題-クリーンアップ。

于 2011-04-22T04:00:55.310 に答える