[最終更新日 1999/03/23]

作ろう!コンポーネント


メソッドのオーバーライド

上位クラスの既存処理の動作を変更することをオーバーライドoverride)すると言います。オーバーライドにより新しい機能を追加することができます。

ここではオーバーライドを利用してキー入力処理を変更して、数値のみを受け付けるようにします。


  1. オーバーライド可能な処理を探す

    TEdit でキー入力の制限を行う場合、どのようにするのでしょうか。普通は OnKeyPress イベントで無視したいキーが入力された場合、 Key コードを無効(0)にしますね。ということは OnKeyPress を呼び出す元のメソッドをオーバーライドできれば良いわけです。

    (ここで TUIntEdit コンポーネントの OnKeyPress イベントハンドラで入力制限を行えば良いのでは?という疑問が出てきますが、これでは残念ながら問題が起きてしまいます。コンポーネントを利用するアプリケーションはイベントハンドラを自由に変更できるので、コンポーネントがコンストラクタで自分のイベントハンドラをセットしても、後からアプリケーション側で変更される恐れがあります。)

    実際に探してみると TEdit のメソッドにはオーバーライドできそうなものがありません。この場合はTEditのヘルプを開き、継承のところから一つ上のクラスを探してみます。TEdit → TCustomEdit → TWinControl の順で探すと TWinControl の KeyPress メソッドが OnKeyPress を呼び出し、オーバーライド出来るとヘルプに書いてあります

    これでオーバーライドするメソッドは見つかりました。

    メモ
    オーバーライド可能なメソッドは仮想メソッド(Delphi:virtual、C++Builder:virtual)、動的メソッド(Delphi:dynamic、C++Builder:DYNAMIC)のどちらかです。静的メソッド(C++Builder:レギュラーメソッド)はオーバーライドできませんので注意してください。

  2. 上位メソッドを呼び出す

    上位クラスの KeyPress をオーバーライドして独自の処理を追加するわけですが、オーバーライドしたままでは上位クラスの処理が呼び出されず、こちらで書いたコードの部分だけが動作します。今回オーバーライドした KeyPress は OnKeyPress を呼び出す処理を行っているので、その部分を呼び出す必要性があります。

    そこでオーバーライドした上位メソッドを呼び出す記述を書いておけば、機能を追加しても正しく OnKeyPress が呼び出されます。


    メモ
    Pro版やCSS版、ENT版を持っている場合、VCLのソースを覗いてみましょう。
    Pascalで記述してあるのでC++Builderユーザには辛いかもしれませんが、まったく読めないこともないはずなので処理を見て大体の内容を理解すればオーバーライドの記述も簡略化できるかもしれません。

  3. KeyPressのオーバーライド処理の実装

    では実際に6桁までの数値('0'〜'9')入力機能を、オーバーライドしたKeyPressに実装してみましょう。

    ここで大切なのは、いつ上位処理を呼び出すかということです。最初に上位処理を呼び出す場合もありますが、今回は入力されたキーをあらかじめ処理した上で、上位処理を呼び出すようにします。


  4. 実際に動かしてみる

    今回はテストコードは不要です。そのまま実行して色々キーを押してみましょう。



まとめ

さてここまでやってみてどうでしょうか?
オーバーライドを使うと、少しのコード追加で機能を変更することができますね。

さて次はメソッドの追加にチャレンジです。
レッツ、トライ!コンポーネント


戻る