C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: フォームのコントロールをクラスで操作


(過去ログ 122 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■73046 / inTopicNo.1)  フォームのコントロールをクラスで操作
  
□投稿者/ yama (6回)-(2014/08/13(Wed) 20:36:05)

分類:[.NET 全般] 

環境VB2013+Sqlserver

初心者です。クラスからフォームのコントロール方法を教えていただけますでしょうか?
同一のプロジェクト内
@Form1・・スタートアップのフォームです
AForm2・・Form1から
  Dim f As New メインメニュー()
f.ShowDialog(Me)
  で開かれます。

Bコントロールクラスを別に作成してます。
Public Class コントロール
Public Sub テキスト変更_ Form1()
Form1.TextBox1.txt = "こんにちは"
End Sub
  Public Sub テキスト変更 Form2()
Form2.TextBox1.txt = "こんにちは"
End Sub
end class

上記の状態で下記の処理をForm1のフォームロードで実行しますと
    Dim con As New コントロール
con.テキスト変更_ Form1()

問題なく.TextBox1.txt に "こんにちは"と表示されるのですが
Form2で 同様のクラスを使用しますとエラーになりませんが表示されません。
Dim con As New コントロール
con.テキスト変更_ Form2()
Form2をスタートアップのフォームに設定すると"こんにちは"と表示されます。
Form2の開き方が悪いのでしょうか?それともクラスの参照方法が間違えているのでしょうか?
自分としては同一のコントロールクラスからForm1、Form2、Form3(今後追加)のコントロールを操作したいです。
よろしくお願いします。


引用返信 編集キー/
■73047 / inTopicNo.2)  Re[1]: フォームのコントロールをクラスで操作
□投稿者/ Azulean (334回)-(2014/08/13(Wed) 21:16:12)
2014/08/13(Wed) 21:18:08 編集(投稿者)
VB.NET 特有の「既定のインスタンス」に惑わされているのかもしれません。

■No73046 (yama さん) に返信
>     Public Sub テキスト変更_ Form1()
>        Form1.TextBox1.txt = "こんにちは"
>     End Sub

ここで言う Form1 はすでに存在している Form1 と同じものを指すものとして扱ってくれます。


> AForm2・・Form1から
>   Dim f As New メインメニュー()
>     f.ShowDialog(Me)
>   で開かれます。

>   Public Sub テキスト変更 Form2()
>        Form2.TextBox1.txt = "こんにちは"
>     End Sub

しかし、ここで言う f と Form2 は外観が同じだけではまったく別のインスタンスになっています。
そのため、表示されていない Form2 に対してあなたは操作してしまっているわけです。

解決方法としては、f をクラスに渡すことです。(「コントロール」という名前の自作クラスなのでしょうか…?)
引数でも何でもよいので f を渡してあげて、「同じインスタンスに対する操作」として実現してください。

イメージ
Public Sub テキスト変更 Form2(ByVal f As Form2)
   f.TextBox1.txt = "こんにちは"
End Sub

con.テキスト変更_ Form2(f)

※注意※
ここの f は ShowDialog を呼び出したものと同じインスタンスである必要があります。
新しく New したり、Form2 の既定のインスタンスを使わないようにしてください。


あとは余計なお世話になってしまうかもしれません。
プログラミングで一般的な用語を自作クラスに命名しない方がよいと思います。
今回の「コントロール」は他の人にその名前を伝えると、自作クラスではなく、「Windows プログラミング一般におけるコントロール」と誤解します。
コミュニケーションのロスにつながる恐れがあります。

引用返信 編集キー/
■73048 / inTopicNo.3)  Re[2]: フォームのコントロールをクラスで操作
□投稿者/ Azulean (335回)-(2014/08/13(Wed) 21:23:04)
さらに方向性をアドバイスするとすれば、Form2 の生存期間と「コントロール」クラスの生存期間がうまくかみ合わないので、f として引数に渡すのが難しいかもしれません。
この場合、「コントロール」クラスの生存期間を長くする方法を考える必要があると考えられます。

安直に逃げるならグローバル変数のようなものを用意する。
もっときれいにするなら、「コントロール」クラスを Form1 や Form2 に依存しなくてよいように見直す、分割するでしょうか。
引用返信 編集キー/
■73065 / inTopicNo.4)  Re[3]: フォームのコントロールをクラスで操作
□投稿者/ yama (7回)-(2014/08/14(Thu) 23:55:56)
返信ありがとうございました。
ご指摘の方法でコントロール操作ができました。今後ともよろしくお願いします。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -