• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:継承後のメソッドでコントロールにアクセスする方法)

継承後のメソッドでコントロールにアクセスする方法

このQ&Aのポイント
  • 継承後のメソッドでフォーム上のコントロールにアクセスする方法はありますか?
  • フォームクラスの外で「label1.text = ''」のように書いてもアクセス出来ないのはわかります。
  • フォームクラスのファイル中にもうひとつクラスを書いてしまっているのが悪いのもわかります。この辺りをどのように実装したらよいでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.6

おはようございます ご報告ありがとうございます。 頑張りましたね~ これで完成でしょうか? kutsusuzuさんがぜ~んぶご自分で考えて、ぜ~んぶご自分で書いてしまいましたね。 スゴ~い >継承したクラスをフォーム内に入れてみました。 クラスを入れ子にしたかったんんですね。 蛇足です。 1番目 Form8.Label1.text = "動作OK"  と記入する方法と 2番目 Dim f As New Form8 '新しいオブジェクトを作成する f.Label1.Text = "動作OK" '新しいオブジェクトのLabel1に"動作OK"を記入する f.Show() '新しいオブジェクトを表示 上記のように書く方法の2種類があります、VB.NETから始めた人はFormもクラスとして(Class Form8と書かれているため)扱うため、2番目のようにクラスを呼び出す方法を使いますが、VB6から移行した人には、1番目の方法を使うようです。 私は、VBははじめて1年そこそこですので昔のことはわかりませんが、2番目の方法を使っています。 また、1番目の方法では内部で、Newしているらしいですが、フォームの表示の仕方から内部処理では何か特別な方法を使っているように感じます。 >こういう書き方をしていいものか…。したことがないので分かりません。 クラスを入れ子にすることや、Form8.Label1.text = "動作OK" のように書くことはkutsusuzuさんの目的の動作が達成されれば全く問題がないと思います。 あとは、他の方が良い回答をしてくださるのを期待しましょう。 (やっぱり他力本願です)

kutsusuzu
質問者

お礼

ありがとうございました。勉強になりました。 お陰様ですべて解決です。

kutsusuzu
質問者

補足

bybalsendercase様、ありがとうございます。 アドバイス頂きました書き方でも実現できるのですね。 私の理解力不足で申し訳ありませんでした。 すでにバレてしまいましたが、10年以上前にVB6を触っておりました。 当時はクラスなどを使わずに作っておりましたのですべてが新鮮です。 ご指導有難うございました。

その他の回答 (5)

回答No.5

>お気遣いありがとうございます。 理解しづらいサンプルでした。 ごめんなさい。

kutsusuzu
質問者

補足

とんでもございません。サンプルありがとうございます。 私にはまだすぐに理解するほどの能力がありません…。 とりあえず!ですが、動作するものが出来ました。 No.3の補足より、継承したクラスをフォーム内に入れてみました。 ----- 1つめのファイル(Formのクラス) ----- Public Class Form8  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click   Dim c As New check1   c.Method1()  End Sub  Public Class check1   Inherits Class1   Public Overrides Sub Method3()    Trace.WriteLine("動作OK")    Form8.Label1.text = "動作OK"    ←動作しました!   End Sub  End Class End Class こういう書き方をしていいものか…。したことがないので分かりません。 とりあえず希望する動作を確認できましたのでご報告致します。

回答No.4

すいません またやっちゃいました。 オーバーライドするのを忘れました。 Class Form8側を変更してください。 Public Class Form8 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim c As New check1 c.Method3() Me.Close() End Sub End Class Public Class check1 Inherits Class1 Public Overrides Sub Method3() '継承の部分は何も機能の追加等はしてません '基底クラスのメソッドを呼び出しているだけです MyBase.Method3() End Sub End Class Public Class Class1 Public Sub Method1() '何も書いてません。 End Sub Public Sub Method2() '何も書いてません。 End Sub Public Overridable Sub Method3() Dim f8 As New Form8 f8.Label1.Text = "動作OK" f8.Button1.Text = "表示" f8.Show() End Sub End Class

kutsusuzu
質問者

補足

動作確認に時間をとってしまい申し訳ありません。 ご指導頂きましたコードを必死に理解しようとしております。

回答No.3

お返事有難うございます、画像も有難う御座います。(綺麗ですよ) 他力本願作戦でしたが、どなたも回答してくださらないので、もう1度投稿させて頂きました。 >申し訳ありません。完全に私の文章力の無さが原因です。 それはないと思います。以前にも質問の内容がわからず、他の方が回答してくださった後「そ~ゆ~ことね」見たいな事がたびたびありました。 >Formの中からClass1の「あるメソッド」を置き換える。 ごめんなさい、”「あるメソッド」を置き換える。”の意味がわかりません。 Formの中からClass1の「あるメソッド」を呼び出すという意味でいいでしょうか? >置き換え後のメソッドからフォーム上のコントロールにアクセスしたい。 この意味は お礼欄の「このMethod3'からForm上に置いたコントロールにアクセスしたいです。」と同じ意味でいいですか? >泣きたいです。 がんばって~ >2つのファイルに3つのクラス(そもそもここが間違ってる?) いいと思いますよ、私はインテリセンスを表示したいだけのクラスはいつも、どこかのクラスの下に書いてます、小さいクラスを全部別ファイルにすると、収集がつかなくなりますね。 継承でMustInheritは必須ですか? メソッド名は全てtest(同じ名前)にする必要がありますか? Public Overrides Sub test() Public MustOverride Sub test() 上記は、同一名のメソッドですね。 画像のMethod1とMethod2は無視でも構いませんか? Method3'からForm8のラベルとボタンの表示を変更する、単純なサンプルを掲載しますので、できる範囲で結構ですので、kutsusuzuさんの目的の動作とどのように違うのか、教えて頂けるとうれしいです。 このようなやり取りをしているうちに、他の方が良い回答をしてくださると思います。 Public Class Form1 'シャットダウンモードを「最後のフォームが閉じるとき」にしてあります Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Shown Dim f8 As New Form8 f8.Show() Me.Close() End Sub End Class Public Class Form8 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim c As New check1 c.test() Me.Close() End Sub End Class Public Class check1 Inherits Class1 Public Sub test() '継承の部分は何も機能の追加等はしてません '基底クラスのメソッドを呼び出しているだけです MyBase.Method3() End Sub End Class Public Class Class1 Public Sub Method1() '何も書いてません。 End Sub Public Sub Method2() '何も書いてません。 End Sub Public Sub Method3() Dim f8 As New Form8 f8.Label1.Text = "動作OK" f8.Button1.Text = "表示" f8.Show() End Sub End Class

kutsusuzu
質問者

補足

bybalsendercase様、何度もすみません。 お時間をお取り頂き申し訳なく思います。 >ごめんなさい、”「あるメソッド」を置き換える。”の意味がわかりません。 Formの中からClass1の「あるメソッド」を呼び出すという意味でいいでしょうか? はい。その意味です。 Form上で「Class1のMethod3」を「Class1のMethod3’」に置き換えて使いたいです。 >この意味は お礼欄の「このMethod3'からForm上に置いたコントロールにアクセスしたいです。」と同じ意味でいいですか? はい。その意味です。 >いいと思いますよ、私はインテリセンスを表示したいだけのクラスはいつも、どこかのクラスの下に書いてます、小さいクラスを全部別ファイルにすると、収集がつかなくなりますね。 問題の1つが解決しました。有難うございます。 >継承でMustInheritは必須ですか? はい。そうしたく思います。 >メソッド名は全てtest(同じ名前)にする必要がありますか? Public Overrides Sub test() Public MustOverride Sub test() 上記は、同一名のメソッドですね。 継承する場合は「同じメソッド名+同じ引数」にしなければならないと書いてありました。 メソッドをごっそり入れ替えたいので同じ名前にしました。 >画像のMethod1とMethod2は無視でも構いませんか? 1つだけ欲しいです…。実はMethod1中でMethod3(実運用はMethod3’)を呼ぶからです。 ご指導いただきましたコードの Public Sub Method3()  Dim f8 As New Form8  f8.Label1.Text = "動作OK"  f8.Button1.Text = "表示"  f8.Show() End Sub ↑コントロールにアクセスする部分を、Class1内ではなく、Formの方へ持って行きたいです。 少し書きなおしてみました。 Class1を継承したcheck1の中からコントロールにアクセスすることが目的です。 ----- 1つめのファイル(Formのクラス) ----- Public Class Form8  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click   Dim c As New check1   c.Method1()  End Sub End Class Public Class check1  Inherits Class1  Public Overrides Sub Method3()   Trace.WriteLine("動作OK")   'Label1.text = "動作OK"    ←こんな感じに実装したい  End Sub End Class ----- 2つめのファイル(クラス) ----- Public MustInherit Class Class1  Public Sub Method1()   Call Method3()  End Sub  Public MustOverride Sub Method3()  ' 置き換え専用 End Class

回答No.2

すいません 1箇所変なものを付けてしまいました。 Me.Text &= txt & "動作OK"→ Me.Text = txt & "動作OK" 私の回答は役に立ちませんが一応訂正しておきます。 ご迷惑おかけしました。

回答No.1

こんばんは すいません、読解力不足でkutsusuzuさんの質問の内容を理解しておりません。 単純なサンプルを掲載しますので、どこがどのようにkutsusuzuさんの目的と違うのか教えてください。 単純にlabelをクラスとして継承しているだけです。 Public Class splabel Inherits Label Public Sub addtxt(ByVal txt As String) Me.Text &= txt & "動作OK" End Sub End Class Public Class Form1 Private Sub f1() Handles MyBase.Shown Button1.Text = "表示" Splabel1.Text = "" End Sub Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Dim st As String st = TextBox1.Text Splabel1.addtxt(st) End Sub End Class お手数おかけします、いろいろ詰めていくうちに、他の方が良い回答をしてくださると思います。(完全に他力本願)

kutsusuzu
質問者

お礼

画像を貼り付けてみました。 ペイントで作ったので汚くて申し訳ありません。 Class1のMethod3を FormのMethod3'で置き換えるような事をしたいです。 このMethod3'からForm上に置いたコントロールにアクセスしたいです。 ほんとに説明が下手くそで…。泣きたいです。

kutsusuzu
質問者

補足

bybalsendercase様ご回答有難うございます >すいません、読解力不足でkutsusuzuさんの質問の内容を理解しておりません。 申し訳ありません。完全に私の文章力の無さが原因です。 目指すことは、 ・Formの中からClass1の「あるメソッド」を置き換える。 ・置き換え後のメソッドからフォーム上のコントロールにアクセスしたい。 そもそもこんな使い方は一般ではない、間違っている等の場合もありますが、 よろしくお願いいたします。

関連するQ&A