- PR -

VS2005でのデザインモードで

1
投稿者投稿内容
ノブト
会議室デビュー日: 2006/11/24
投稿数: 4
投稿日時: 2006-11-24 13:27
はじめまして。

現在VS2005でWindowsアプリケーションを開発しています。
言語はVB.NETです。

ボタンが複数あるユーザーコントロールを作成し、
各ボタンのフォントを設定できるようにFontクラスの配列をプロパティとして用意したのですが、
(各ボタンのフォントを配列にセットしています。)
そのユーザーコントロールをフォームに貼り付け、
デザインモードでそのプロパティを操作すると、コレクションエディタという
フォームが出てくるのですが、
エラーが発生しているようで各ボタンのプロパティが取得・変更できません。

原因がわからず対処のしようがなく困っています。
どなたかご教授願えませんでしょうか?
よろしくお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-11-24 15:11
引用:

ノブトさんの書き込み (2006-11-24 13:27) より:

ボタンが複数あるユーザーコントロールを作成し、各ボタンのフォントを設定できるようにFontクラスの配列をプロパティとして用意したのですが、(各ボタンのフォントを配列にセットしています。)そのユーザーコントロールをフォームに貼り付け、デザインモードでそのプロパティを操作すると、コレクションエディタというフォームが出てくるのですが、エラーが発生しているようで各ボタンのプロパティが取得・変更できません。


どのようなエラーが発生しますか?
おそらく、配列のインスタンスがらみの例外かと思いますが。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ノブト
会議室デビュー日: 2006/11/24
投稿数: 4
投稿日時: 2006-11-24 15:48
"オブジェクトがターゲットの型と一致しません。"と表示されます。

コードを交えてもう少し詳しく説明しますと。

ユーザーコントロールにはボタンを複数配置してあります。
そのボタンを初期化時にSystem.Windows.Forms.Buttonクラスの配列にセット(cmdArray)しています。

プロパティaryFont取得時はワーク変数のFontクラスの配列(ary_font)にcmdArrayの各要素のFontをセットして、その配列を返すようにコーディングしています。

Private cmdArray(cnt) As System.Windows.Forms.Button
Private ary_font(cnt) As System.Drawing.Font

Public Property aryFont() As Font()
Get
For i = 0 To cnt
ary_font(i) = Me.cmdArray(i).Font
Next
Return ary_font
End Get
Set(ByVal value As Font())
For i = 0 To cnt
Me.cmdArray(i).Font = value(i)
Next
End Set
End Property

このようにコーディングしたユーザーコントロールをフォームに配置すると、
プロパティが配列なので(?)コレクションエディタというフォームで編集が行えるようになります。
そのエディタ上では、配列の要素は正常に入っていると思うのですが、
FontのNameやSizeなどのプロパティには全て、
"オブジェクトがターゲットの型と一致しません。"と表示されており、設定することができません。
プロパティウィンドウの「+」の部分を展開すると、正常に値が入っています。


[ メッセージ編集済み 編集者: ノブト 編集日時 2006-11-24 15:51 ]

[ メッセージ編集済み 編集者: ノブト 編集日時 2006-11-24 15:51 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-11-24 21:56
ん。。。なんというか。。。もうちょっと、こう。。。考えようよ。。。
引用:

コード:
Private cmdArray(cnt) As System.Windows.Forms.Button
Private ary_font(cnt) As System.Drawing.Font

Public Property aryFont() As Font()
    Get
        For i = 0 To cnt
            ary_font(i) = Me.cmdArray(i).Font
        Next
        Return ary_font
    End Get
    Set(ByVal value As Font())
        For i = 0 To cnt
            Me.cmdArray(i).Font = value(i)
        Next
    End Set
End Property




cmdArray(cnt) の、cnt は、どこから出てくるのでしょう?
なにも aryFont のゲッターで、ary_font を作成しなくてもいいですよね?
cmdArray と ary_font の順序が一致していることは、誰が保証するのですか?あるいは。デザイン時に、1番目のフォントがどのボタンに対応しているか、どうやったらわかるんですか?


 属性を使って、デザイン時エディタを指定するんだけど。詳しいことはわからない。

_________________
ノブト
会議室デビュー日: 2006/11/24
投稿数: 4
投稿日時: 2006-11-26 12:09
説明不足で申し訳ありません。

>cmdArray(cnt) の、cnt は、どこから出てくるのでしょう?
>なにも aryFont のゲッターで、ary_font を作成しなくてもいいですよね?
>cmdArray と ary_font の順序が一致していることは、誰が保証するのですか?あるいは。デザイン時に、1番目のフォントがどのボタンに対応しているか、どうやったらわかるんですか?

コードの一部を抜粋したので必要な情報が欠けてしまいました。
cntは定数で、ボタンの個数です。
フォームの初期化時にボタンをひとつずつcmdArrayにセットしており、for文でary_fontに格納しているので、順序は一致していると思っておりました。
また、ボタンのフォントをひとつずつ変更し、デザインのプロパティウィンドウで表示した時は、順序が合っていたので問題ないと思っておりした。

>属性を使って、デザイン時エディタを指定するんだけど。詳しいことはわからない。
ary_font配列を自分で初期化しても同様の現象となったので、配列に格納されているFontとコレクションエディタで表示するFontの照合順序的なもの(?)がうまくいっていないんじゃないかと思い、上記のやり方も考えたんですが、勉強不足のようで・・・。

もう少し属性の方を調査してみます。
何か情報があればよろしくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-11-26 22:46
引用:

ノブトさんの書き込み (2006-11-26 12:09) より:

cntは定数で、ボタンの個数です。


 うん、それは、宣言に使用しているのでわかるのですが、反対に、宣言を見るから定数だとわかるのです。
 変数"だけ"を見て、それが何を表しているのかわかること。理想論ですが。

引用:

フォームの初期化時にボタンをひとつずつcmdArrayにセットしており、for文でary_fontに格納しているので、順序は一致していると思っておりました。
また、ボタンのフォントをひとつずつ変更し、デザインのプロパティウィンドウで表示した時は、順序が合っていたので問題ないと思っておりした。


"配列なので"、順序は保証されると思います。
保証されない場合もあるので、過信は禁物です。

引用:

>属性を使って、デザイン時エディタを指定するんだけど。詳しいことはわからない。
ary_font配列を自分で初期化しても同様の現象となったので、配列に格納されているFontとコレクションエディタで表示するFontの照合順序的なもの(?)がうまくいっていないんじゃないかと思い、上記のやり方も考えたんですが、勉強不足のようで・・・。


おそらく、標準のコレクション エディタは、文字列に過対応していないと思います。Font から文字列に変換できないのでエラー。

 おそらく、型コンバーターを作って、それを指定するか。
 または、
コード:
Public Property Font(ByVal Index As Integer) As Font
    Get
        Return ary_font(Index)
    End Get
    Set(ByVal value As Font)
        Me.cmdArray(Index).Font = value(Index)
    End Set
End Property


宣言は、自信なし。確認してください。
要は、添え字を受け取るプロパティです。

こんな感じで行けるんじゃないかと思う。
_________________
ノブト
会議室デビュー日: 2006/11/24
投稿数: 4
投稿日時: 2006-11-27 17:44
上記のサンプルのように配列のインデックスを渡して、
そのプロパティを設定するようにしました。

Jitta様、じゃんぬねっと様、
ご教授ありがとうございました。
1

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