- PR -

カスタムコントロールの独自定義プロパティへのアクセス方法

1
投稿者投稿内容
Strada
会議室デビュー日: 2006/09/28
投稿数: 4
投稿日時: 2007-04-22 18:25
C経験は長いものの、.NETは初めて、Windows Formアプリの開発も初めての私が、前任者のVS2005でC++/CLI(一部C#)によるWinアプリの開発を仕事を引き継ぐことになり勉強することが多く苦労しております。何卒ご指導のほどお願い申し上げます。

【処理内容】
1. RichTextBox, Label, PictureBoxなどを組み合わせたカスタムコントロール数十種のdllが既に存在します。これらはすべてUserControlクラスを継承して作成されています。
2. これらのコントロールは、Formが生成された時点では一つも画面に存在しません。すべて実行時にFormから動的に発生されます。
3. これらコントロールのMove, Resize, Enterなどのイベントを受け、Form側から各コントロールの配置を制御します。
4. Form側でコントロールが追加された際には、
e->Control->Enter += gcnew EventHandler(this, &FormA::Controls_Enter);
e->Control->Resize += gcnew EventHandler(this, &FormA::Controls_Resized);
e->Control->Move += gcnew EventHandler(this, &FormA::Controls_Moved);
などのようにイベントを定義しており、これらのイベントを元にForm側でコントロールの配置を制御することに問題はありません。
5. しかし凝った表示仕様を実現するため、一部のコントロールには、自分自身の表示基準位置を示す独自定義のプロパティが存在します。これらのプロパティは「コントロール内部で子コントロールの配置やサイズを更新した後、Form側がコントロールを配置するための基準位置を返す」ために設けられています。比喩的に言えば「欧文文字列処理におけるアルファベットのベースライン位置を各文字がプロパティとして返す」というような仕組みです。

【質問事項】
コントロールからイベントが発生したとき、e->Controlは、上記5のような独自定義プロパティ(例えばBaseLine)を持っていないため、TagやNameプロパティなどで種別が判定できても、
y = e->Control->BaseLine;
のような形でプロパティにアクセスができません。

このような場合、.NETやC++/CLIやC#のどのような機能を使い、どうやって実装するのが一番適切なのか判断が付きません。私の現在の知識では、「UserControlクラスを継承し、必要な独自プロパティを追加したControlクラス」を作り、各カスタムコントロールをこれを継承して作り直すという方法しか思い付きませんが、これが一番適切な方法でしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-04-22 20:02
引用:

Stradaさんの書き込み (2007-04-22 18:25) より:

コントロールからイベントが発生したとき、e->Controlは、上記5のような独自定義プロパティ(例えばBaseLine)を持っていないため、TagやNameプロパティなどで種別が判定できても、
y = e->Control->BaseLine;
のような形でプロパティにアクセスができません。


変数の型に注目するのではなく、変数の中に入っているインスタンスの型に注目します。
型を調べてその独自定義プロパティをメンバに持つ型であれば、キャストしてアクセスできますよね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Strada
会議室デビュー日: 2006/09/28
投稿数: 4
投稿日時: 2007-04-23 02:08
じゃんぬねっとさん、御回答大変ありがとうございました。

未熟故の固定観念とは恐ろしいもので、ControlEventArgsには継承元のControlの型しか入っていないものだとばかり思い、大げさな方法を考えていました。教えて頂いた通り、e->Controlを独自定義プロパティを持つコントロールの型にdynamic_castしたところ、簡単にプロパティにアクセスできてしまったので、些か拍子抜け致しました。

今後とも宜しくお願い致します。
1

スキルアップ/キャリアアップ(JOB@IT)