- PR -

クラス内でフォームのコントロールを参照する方法は?

投稿者投稿内容
moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 2005-08-10 15:37
お世話さまです。

初歩的な質問で恐縮なのですが、ここにきてようやくクラスを
使ったプログラミングなるものをVB.NETで始めまして
下記のような壁にぶつかりました。

複数のフォームで共通に使えるクラスとして
フォームのラベル(Nameプロパティは統一)に
値をセットするクラスを作りたいのですが、
そのラベルの参照のさせ方が解りません。

Public Class clsSetText
  Public FormId As Form

  Public Sub Show()
    FormId.LabelTest.Text = "テスト" ←この部分の指定の仕方が不明
  End Sub
End Class

フォームにて
Dim objSetText As New clsSetText
objSetText.FormId = Me
objSetText.Show()

各フォームのラベル名称は"LabelTest"に統一
してありますので、クラス内で参照さえさせられれば
使えるようになるものと考えています。

どなたかご教示のほど宜しくお願い致します。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-08-10 15:46
こんにちは、じゃんぬ です。
質問内容を全部理解しきれていませんが、

引用:

複数のフォームで共通に使えるクラスとして
フォームのラベル(Nameプロパティは統一)に
値をセットするクラスを作りたいのですが、


つまり、動的にコントロールを作成しているのですね?

引用:

そのラベルの参照のさせ方が解りません。


動的に作成する際に、参照用に変数で取っておきましょう。

引用:

各フォームのラベル名称は"LabelTest"に統一
してありますので、クラス内で参照さえさせられれば
使えるようになるものと考えています。


名前が統一されているのであれば、検索するという邪道な手もあります。

  フォーム内のコントロールを名前で探して取得する

リンク先は 1 つ取得した時点で返してしまうので、
複数返すように改造すれば、ForEach で Text をセットできるでしょう。



_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-08-10 15:55
「クラス」にフォームを渡すのではなく(あるいはフォームを渡すと共に)
ラベルを渡すようにすればいいのではないでしょうか。

そうすれば、Nameプロパティを統一するという制約もありませんから。
moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 2005-08-10 16:02
じゃんぬねっとさん、早速のレスありがとうございます。

>つまり、動的にコントロールを作成しているのですね?
いえ、コントロールそのものは各フォームの所定の位置に
貼り付けてあり、そのテキストプロパティを動的にセットしたいのです。

実は今回のクラスを作る前にクラス内でラベルコントロールを定義し
ラベル参照渡しを行って上手く動いていたのですが、
この動的に値をセットしたいラベルが十数個あったため、
フォームの参照のみを渡してクラス内でラベルのハンドリングを
行うように切り替えたかったんです。

貼り付けて頂いたコードのように関数をこしらえないと
参照できないのでしょうか?^^;
moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 2005-08-10 16:05
にしざきさん、早速のレスありがとうございます。

>ラベルを渡すようにすればいいのではないでしょうか。
はい、元々はそうしておりました。

ただ、ラベルの数が多いので見た目に美しくなく、
せっかくクラス化するのなら
もっと行数を圧縮できないものか?と考えて
リファクタリング?しようと思い立った次第でございます。^^;
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-08-10 16:56
こんにちは、じゃんぬ です。
まだ思い違いをしているかもしれません。

引用:

いえ、コントロールそのものは各フォームの所定の位置に
貼り付けてあり、そのテキストプロパティを動的にセットしたいのです。


そうでしたか、勘違いしていました。(_ _*)

引用:

貼り付けて頂いたコードのように関数をこしらえないと
参照できないのでしょうか?^^;


名前で探すのであれば、ですが...
元々、別の場所で管理されているのであれば、それを使いますよね?
それがなされていないのであれば、探すしかないとは思いました。

引用:

せっかくクラス化するのなら
もっと行数を圧縮できないものか?と考えて
リファクタリング?しようと思い立った次第でございます。^^;


コードの簡素化がリファクタリングじゃあないですよ。
オブジェクト指向言語であれば多少の冗長は気になりません。
というか、冗長になっても保守しやすいのがメリットですし。

# そもそも、設計に問題があるような気がしないまでもないです。



_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
きょろんた
会議室デビュー日: 2005/08/10
投稿数: 2
投稿日時: 2005-08-10 16:56
共通なラベル(Modifiers=Public)を貼り付けただけのフォームを作成して
複数フォームは、そのフォームを継承させたフォームで作成して、キャスト
するなり、継承元フォームで受け取る。なんてのはいかがでしょうか?

moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 2005-08-10 17:42
じゃんぬねっとさん、レスありがとうございます。

>それがなされていないのであれば、探すしかないとは思いました。
そもそも入れ物(クラス)の方でインスタンス化の前に
そのフォームのコントロールの振る舞いを実装すること自体
がムリなような気がおぼろげながらしてきました。^^;

>というか、冗長になっても保守しやすいのがメリットですし。
なるほど、肝に銘じておきます。

># そもそも、設計に問題があるような気がしないまでもないです。
恐らく、問題だらけだと思います。T-T

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