この質問を読んだ後TCustomEdit
、すべての子孫も変更を継承するようにテキスト幅をチェックするように変更できるかどうか疑問に思いました。
2 に答える
加えたほとんどの変更はTCustomEdit
、子孫に継承されます。これが一般的に継承の仕組みです。ただし、具体的には、どのような変更を加えるかによって異なります。
StdCtrls.pasを編集すると、行った変更はすべて、新しくコンパイルされたコードに継承されます。この手法の障害の1つは、再コンパイルが困難または不可能なライブラリの他の部分を再コンパイルせずに、DelphiにStdCtrls.pasのバージョンへの変更を受け入れさせることです。
実行時にメソッドにパッチを
TCustomEdit
適用すると(メソッドの最初の数バイトを上書きして、制御を独自のメソッドに転送する通常の手法によって)、それらの変更は子孫にも継承されます。TCustomEdit
仮想メソッドテーブルにパッチを適用すると、一部の変更が継承されますが、すべてではありません。パッチが適用されたメソッドへの仮想呼び出しはカスタムバージョンを使用しますが、非仮想呼び出しは引き続き元のバージョンを使用します。子孫がを使用する場合inherited
、継承されたメソッドへのその呼び出しのディスパッチは仮想ではないため、VMTは関与せず、子孫は元のTCustomEdit
メソッドを呼び出すことになります。
TCustomEditはstdctrlsユニットにあります。継承される変更をテストするには、VCLパス上の変更を変更せずに、stdctrlsをメインプロジェクトフォルダーにコピーして、そこで変更します。Delphiは最初に変更されたユニットを見つけて、それを使用します。
これにより、元のユニットを使用/更新する他のすべてのプロジェクトとVCLパッチが残ります。パッチを適用したユニットは影響を受けません。
私が正しければ、新しい場所でも変更すると、関連するVCLユニットが再構築されます。したがって、他のプロジェクトに切り替えるときは、ビルドを実行して、元のユニットを実際に「元に戻す」ことを使用してVCLパーツで再コンパイルする必要があります。