コンポーネントの機能を変更する必要があります。 「これを上書きすることはできません」というメッセージが表示されたり、プライベートメソッド(「メソッドは基本クラスには存在しません」というメッセージ)を変更する必要があり、コンポーネントを下降させることはできません。VCLコンポーネントの変更コード
答えて
、
- 私は最初のコンポーネント、またはそのCustomXXXの祖先から継承し、それが問題を修正するかどうかを確認してみてください。そうでない場合は、
- 私は深く、つまり入ってくるメッセージを傍受しようとします。これは動的に行うことができます。それに基づいて構築する必要があるコードが広すぎるため、またはアクセスできないアイテムにアクセスする必要があるため、深すぎると判明した場合は、
- ハックしようとします。 1つのハックは、コンポーネントと依存コードを別の名前の新しいユニットにコピーし、コンポーネントの名前を変更し、変更する必要があるものを変更することです。
- 時々、新しい動作を可能にするために、1つまたは2つの方法をやり直す必要があります。
ユニットに別の名前と別の名前を付けることを忘れないでください(元のコンポーネントまたはその祖先を継承している可能性があるため、同じ階層に残ります)。 never元のソースを変更してから、VCLを再コンパイルしてください。それはメンテナンスの悪夢です。
私はインターポーザクラスのファンではありません。つまり、元のクラスと同じ名前を持ち、元のクラスとは異なる動作をし、元のクラスを継承しています。それらの機能はuses句に含まれる順番に依存し、それは私にとってはぼんやりとしたようです。私はそれをお勧めできません。
しかし、私は大きく問題に依存しています。私は、すべての状況を網羅する包括的なアドバイスを与えることはできないと思います。
しかし、私のメインのアドバイス:は常に新しいユニットに新しいコードを入れて、オリジナルのユニットを変更し、新しいクラス名を使用しないでください。そうすれば、元のバージョンと修正されたバージョンが平和的に共存することができます。
それは、その中にプライベートメソッド又は挙動を変更することになると、いくつかの(主にハック)のオプションがあります
- は、元のソースを変更するユニットを再コンパイルし、提案hereように変更DCUを使用します。これをしたことはありませんでしたが、コードで新しいdcuを使用すると頭がおかしくなることがありますが、他のVCLコードではそうではないと思われます。
- 多くの場合、コンポーネントの動作は多数のウィンドウメッセージによって制御されます。これらのメッセージのいくつかの反応。あなたは彼らがプライベート宣言されている場合でも、メッセージ処理メソッド(
message
キーワードを持つもの)をオーバーライドすることができます。また、 - あなたには、いくつかを使用することができ
- あなたは鋳造いじりされthisのようなハックを使用することができますWndProcメソッドを置き換えることができます回答に記載されている迂回メカニズムhere
また、別のコンポーネントを入手することもできます。私はその問題に直面した場合
私はむしろユニットをコピーし、名前を変更してクラスを変更し、必要でないものをすべて削除します(必要に応じて、定数、使用するタイプを定義する元のユニットを「含む」など)。 )。それは大部分の頭痛を避けます。元のソースを変更しないでください。それはメンテナンスの悪夢です。 –
私は同意します。これは "変更、コンパイル、使用dcu、取り消しの変更"の意味でより多くのものでした。しかし、あなたのアプローチはより良く聞こえます。ユニットをコピーし、必要に応じて変更してください。欠点は依然として頻繁に更新される第三者コンポーネントでは、メンテナンスが必要であることです。しかし、それがVCLならば、次のバグ修正/アップデートはDelphiの次のバージョンになりますので、心配する必要はありません。 –
ランタイムパッケージが無効で、 'interface'セクションに何も変更する必要がない限り、ユニットまたはそのクラスの名前を変更する必要はありません。プロジェクトにローカルなユニットのコピーを作成し、プロジェクトにコピーを追加し、必要に応じて 'implementation'セクションを修正してください。コンパイル中にVCLのネイティブコードを上書きします。 –
申し訳ありませんが、それはIMO、悪い習慣とメンテナンスの悪夢です。ユニットとクラスの名前の変更は、これを行うための唯一の優雅な方法です。技術的には必要ではないが、名前の変更はIMOの悪い習慣ではない。 –
ユニット名とクラス名を変更するには、それを参照するコードを変更する必要があります。オリジナルの名前を維持することは珍しくありません。既存のコードを変更する必要はありません。特に、内部動作の変更/修正(RTL/VCLバグの修正など)を目的としている場合には、変更する必要はありません。 –