基本的な質問で申し訳ありませんが、DBGridを使って選択行の色表示を変える
ためのソースは見つけたのですが、
TExDBGrid = class(TDBGrid);
でTDBGridを継承したTExDBGridのプロパティでRowを使ってカレント行を獲得
していました。
TDBGridでは、Row が参照できないのに
TDBGridから継承されたTExGridには、Rowを参照できるのは何故でしょうか?
宜しくお願いします。
なんとなくですが・・・
フォームに貼り付けたDBGrid に対して
DBGrid1.Row と書くとコンパイルエラー。
でも、継承したTExGrid は、継承したクラス内から参照している
例えば、override した procedure DrawCell 内からRow を参照している。
これは、protected は、継承したクラス内からは見えますが、
利用する側からは見えないというスコープの違い。
ただし、同一ユニット内のクラス同士であれば、protectedでも見えます。
「delphi スコープ」で検索したら、もっといい解説ページみつかるかな?
ぽむぽむ様、回答ありがとうございます。
参考にしたソースは、
http://delfusa.main.jp/delfusafloor/archive/www.nifty.ne.jp_forum_fdelphi/samples/00130.html
なのですが、
If TExDBGrid(Sender).Row = GCoord.Y Then
DBGridでは、下記、
>これは、protected は、継承したクラス内からは見えますが、
>利用する側からは見えないというスコープの違い。
の理由で参照できないと思いますが、TExDBGridの場合に参照できる点が??です。
また、
https://www.petitmonte.com/bbs/answers?question_id=5267
では、コンポーネントを作成したら、Row がプロパティとして利用できました。
オブジェクトインスペクタにものっていました。
DBGridの継承のはずなのに??
質問がわかり難いとは思いますが宜しくお願いします。
>protected は、継承したクラス内からは見えます
これがすべてだよ。
これ以上説明のしようがないと思うけど。
質問者さんが疑問に思っているのは、
実際の継承クラスであるTExDBGridとは全然関係ないメソッドの中から
procedure TForm1.DBGrid1DrawColumnCell(...)
...
If TExDBGrid(Sender).Row = GCoord.Y Then
...
みたいに勝手にキャストしただけでなんでprotectedのメンバにアクセスできるのか、ということでしょう。
(ちなみにこのSenderは本当のTExDBGridではなく、
あくまでも基底クラスであるTDBGridのインスタンスです。)
確かに通常のオブジェクト指向の常識だとこれは理解できません。
実はDelphiの場合、「クラスが宣言されているunit内」であれば
誰でもそのクラスのprotectedメンバを参照できます。(C++でいうfriendのようなもの)
これを逆手にとって、ダミーの継承クラスを宣言してやることで
元のクラスのprotectedメンバにアクセスしてしまうことが可能です。
このテクニックは旧Delphi FAQでも(ちょっとだけですが)紹介されています。
http://support.codegear.com/article/37436 の「StringGrid で入力文字数の制限を行なう方法」
回答ありがとうございます。
tttさんのおっしゃるとおり、
>勝手にキャストしただけでなんでprotectedのメンバにアクセスできるのか
が分からなかったのですが
キャストしただけでも、、「クラスが宣言されているunit内」で
元のクラスのprotectedメンバにアクセス可能になった訳ですね。
ありがとうございました。
ツイート | ![]() |