アプリ版:「スタンプのみでお礼する」機能のリリースについて

よろしくお願い致します。

継承の動作を勉強しております。動作自体は確認出来ました。
継承後のメソッドでフォーム上のコントロールにアクセスする方法はありますか?
例えば「label1.text = "~"」の様に動作させたいです。

現在、2つのファイルに3つのクラス(そもそもここが間違ってる?)を書いてあります。

----- 1つめのファイル(Formのクラス) -----
Public Class Form8
 Private Sub Button1_Click(~) Handles Button1.Click
  Dim c As New check1
  c.test()
 End Sub
End Class

Public Class check1
 Inherits Class1
 Public Overrides Sub test()
  Trace.WriteLine("Overrides")
  'label1.text = "動作OK"   ←こんな感じに実装したい
 End Sub
End Class

----- 2つめのファイル(クラス) -----
Public MustInherit Class Class1
 Public MustOverride Sub test()
End Class

フォームクラスの外で「label1.text = ""」のように書いてもアクセス出来ないのはわかります。
フォームクラスのファイル中にもうひとつクラスを書いてしまっているのが悪いのもわかります。

この辺りをどのように実装したらよいでしょうか。
わかりづらくて申し訳ありません。
ご指導よろしくお願い致します。

「継承後のメソッドでコントロールにアクセス」の質問画像

A 回答 (6件)

こんばんは




すいません、読解力不足で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


お手数おかけします、いろいろ詰めていくうちに、他の方が良い回答をしてくださると思います。(完全に他力本願)
「継承後のメソッドでコントロールにアクセス」の回答画像1

この回答への補足

bybalsendercase様ご回答有難うございます

>すいません、読解力不足でkutsusuzuさんの質問の内容を理解しておりません。

申し訳ありません。完全に私の文章力の無さが原因です。

目指すことは、
・Formの中からClass1の「あるメソッド」を置き換える。
・置き換え後のメソッドからフォーム上のコントロールにアクセスしたい。

そもそもこんな使い方は一般ではない、間違っている等の場合もありますが、
よろしくお願いいたします。

補足日時:2012/10/16 22:01
    • good
    • 0
この回答へのお礼

画像を貼り付けてみました。
ペイントで作ったので汚くて申し訳ありません。

Class1のMethod3を
FormのMethod3'で置き換えるような事をしたいです。

このMethod3'からForm上に置いたコントロールにアクセスしたいです。

ほんとに説明が下手くそで…。泣きたいです。

お礼日時:2012/10/16 22:10

すいません



1箇所変なものを付けてしまいました。
Me.Text &= txt & "動作OK"→ Me.Text = txt & "動作OK"

私の回答は役に立ちませんが一応訂正しておきます。

ご迷惑おかけしました。
    • good
    • 0

お返事有難うございます、画像も有難う御座います。

(綺麗ですよ)


他力本願作戦でしたが、どなたも回答してくださらないので、もう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
「継承後のメソッドでコントロールにアクセス」の回答画像3

この回答への補足

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

補足日時:2012/10/17 20:42
    • good
    • 0

すいません



またやっちゃいました。

オーバーライドするのを忘れました。

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

この回答への補足

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

補足日時:2012/10/17 20:44
    • good
    • 0

>お気遣いありがとうございます。




理解しづらいサンプルでした。
ごめんなさい。

この回答への補足

とんでもございません。サンプルありがとうございます。
私にはまだすぐに理解するほどの能力がありません…。

とりあえず!ですが、動作するものが出来ました。
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

こういう書き方をしていいものか…。したことがないので分かりません。
とりあえず希望する動作を確認できましたのでご報告致します。

補足日時:2012/10/18 02:29
    • good
    • 0

おはようございます



ご報告ありがとうございます。


頑張りましたね~


これで完成でしょうか?
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さんの目的の動作が達成されれば全く問題がないと思います。


あとは、他の方が良い回答をしてくださるのを期待しましょう。
(やっぱり他力本願です)

この回答への補足

bybalsendercase様、ありがとうございます。

アドバイス頂きました書き方でも実現できるのですね。
私の理解力不足で申し訳ありませんでした。

すでにバレてしまいましたが、10年以上前にVB6を触っておりました。
当時はクラスなどを使わずに作っておりましたのですべてが新鮮です。

ご指導有難うございました。

補足日時:2012/10/18 12:13
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/10/18 19:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!