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

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

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

Re[10]: 派生コントロールの型


(過去ログ 82 を表示中)

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

■48449 / inTopicNo.1)  派生コントロールの型
  
□投稿者/ うれ (1回)-(2010/04/06(Tue) 18:31:52)

分類:[VB.NET/VB2005 以降] 

TextBoxから派生させたTextBoxAがあります。

さらにTextBoxAから派生させたTextBoxBがあります。

それらをフォーム上に置いたとしてTextBoxAのみ未入力を禁止したいです。
その場合、Type Ofで型をみて判定できると思いますが、

(コントロールをCtrlとして)
If Type Of Ctrl Is TextBox・・・ではFalseになります。

If Type Of Ctrl Is TextBoxA としなければならないのでしょうか。
引用返信 編集キー/
■48450 / inTopicNo.2)  Re[1]: 派生コントロールの型
□投稿者/ 魔界の仮面弁士 (1599回)-(2010/04/06(Tue) 18:47:55)
No48449 (うれ さん) に返信
> それらをフォーム上に置いたとしてTextBoxAのみ未入力を禁止したいです。
> その場合、Type Ofで型をみて判定できると思いますが、

If 変数.GetType() Is GetType(TextBoxA) Then でどうでしょうか。
引用返信 編集キー/
■48469 / inTopicNo.3)  Re[2]: 派生コントロールの型
□投稿者/ うれ (2回)-(2010/04/07(Wed) 13:07:46)
No48450 (魔界の仮面弁士 さん) に返信
> ■No48449 (うれ さん) に返信
>>それらをフォーム上に置いたとしてTextBoxAのみ未入力を禁止したいです。
>>その場合、Type Ofで型をみて判定できると思いますが、
>
> If 変数.GetType() Is GetType(TextBoxA) Then でどうでしょうか。

If 変数.GetType() Is GetType(TextBoxA) Then でも同じ結果でした。
引用返信 編集キー/
■48472 / inTopicNo.4)  Re[1]: 派生コントロールの型
□投稿者/ よねKEN (453回)-(2010/04/07(Wed) 14:06:14)
No48449 (うれ さん) に返信
> TextBoxから派生させたTextBoxAがあります。
>
> さらにTextBoxAから派生させたTextBoxBがあります。
>
> それらをフォーム上に置いたとしてTextBoxAのみ未入力を禁止したいです。

現在はTextBoxAもTextBoxBも「未入力禁止」にはなっていない状態、
という理解であってますか?
(実は既にTextBoxAクラスに未入力禁止機能があって、
それが派生したTextBoxBクラスでは邪魔なのかな?という可能性を考えました)

ここまでの説明は大枠は理解できますが、以降の説明が前半の説明と
どのようにつながるのかがよくわかりません。

> その場合、Type Ofで型をみて判定できると思いますが、
>
> (コントロールをCtrlとして)
> If Type Of Ctrl Is TextBox・・・ではFalseになります。
>
> If Type Of Ctrl Is TextBoxA としなければならないのでしょうか。

(1) ここの説明はどのクラスのどのメンバで書いている(もしくは書こうとしている)
  コードについての話なんでしょうか?
  →前半の説明で明らかになっていないこととして、
  「TextBoxAのみ未入力を禁止」とするために、どのクラスを修正しようとしているのか?
  (あるいは、その辺の方針は決めることができていないのか?)、ということが挙げられます。

   (a) TextBoxAだけで何とかしたい
   (b) TextBoxAやTextBoxBを配置する側のフォームなどで対処する
   (c) その他

(2) また、このIf文で何を判断しようとしているのでしょうか?
  (コードの意味はわかります。その用途がわからない、ということです。
  用途がわからないと答えられないので)

  このコードを書いている場所は、TextBoxAクラスやTextBoxBクラス内のコードではなく、
  例えば、どこか(フォームだったり標準モジュールだったり)に用意しようとしている
  共通処理のメソッドの中で、テキストボックスのインスタンスが、
  TextBoxAのインスタンスか、TextBoxBのインスタンスなのか?という判断をしたい、
  という意味なのでしょうか?
  # でも、そうだとすると、魔界の仮面弁士さんのNo48450の回答がズバリなので
  # 違う意図なのかなぁと想像しています

---
以下、想像を膨らませて考えてみました。
例えば、フォームに配置してある”登録”ボタンのような
ボタンのClickイベントで、フォーム上のコントロールをすべて列挙して、
その上で、TextBoxA型のものだけに対して、”未入力禁止チェック”を行おうとしていますか?
→ 魔界の仮面弁士さんのNo48450の回答でTextBoxAだけを判別できます。

引用返信 編集キー/
■48477 / inTopicNo.5)  Re[2]: 派生コントロールの型
□投稿者/ うれ (3回)-(2010/04/07(Wed) 15:20:09)
> 現在はTextBoxAもTextBoxBも「未入力禁止」にはなっていない状態、
> という理解であってますか?
> (実は既にTextBoxAクラスに未入力禁止機能があって、
>  それが派生したTextBoxBクラスでは邪魔なのかな?という可能性を考えました)
その通りです。未入力禁止機能はありません。

> 
> 
> (1) ここの説明はどのクラスのどのメンバで書いている(もしくは書こうとしている)
>   コードについての話なんでしょうか?
>   →前半の説明で明らかになっていないこととして、
>   「TextBoxAのみ未入力を禁止」とするために、どのクラスを修正しようとしているのか?
>   (あるいは、その辺の方針は決めることができていないのか?)、ということが挙げられます。
> 
>    (a) TextBoxAだけで何とかしたい
>    (b) TextBoxAやTextBoxBを配置する側のフォームなどで対処する
>    (c) その他
フォームのクラスで行います。 


> (2) また、このIf文で何を判断しようとしているのでしょうか?
>   (コードの意味はわかります。その用途がわからない、ということです。
>   用途がわからないと答えられないので)
> 
>   このコードを書いている場所は、TextBoxAクラスやTextBoxBクラス内のコードではなく、
>   例えば、どこか(フォームだったり標準モジュールだったり)に用意しようとしている
>   共通処理のメソッドの中で、テキストボックスのインスタンスが、
>   TextBoxAのインスタンスか、TextBoxBのインスタンスなのか?という判断をしたい、
>   という意味なのでしょうか?
>   # でも、そうだとすると、魔界の仮面弁士さんのNo48450の回答がズバリなので
>   # 違う意図なのかなぁと想像しています
フォーム上に未入力のテキストボックスがないかチェックするためです。
フォームクラスでPrivate Functionの中で行います。未入力がなければTrueが返り、未入力があればFalseが返ります。
具体的なコードは以下の通り

Private Class Frm_Hoge

Private Function TextBoxCheck(Ctrl As Contorl) As Boolean
    For Each CtrlItem As Control In Ctrl.Controls
       If TypeOf CtrlItem Is TextBox Then

           '未入力チェック
           If DirectCast(CtrlItem, TextBox).Text = String.Empty Then
                  Return False
                  Exit Function
           End If
        End If

        '内包されているコントロールがないか
        If CtrlItem.Control.Count > 0 Then
            TextBoxCheck(CtrlItem)
        End If
     Next

     Return True

End Function

End Class 

引用返信 編集キー/
■48485 / inTopicNo.6)  Re[3]: 派生コントロールの型
□投稿者/ よねKEN (455回)-(2010/04/07(Wed) 16:13:09)
No48477 (うれ さん) に返信
コメント頂いた内容でやりたいこと・今やっていることの全体像は理解できました。

>>>  このコードを書いている場所は、TextBoxAクラスやTextBoxBクラス内のコードではなく、
>>  例えば、どこか(フォームだったり標準モジュールだったり)に用意しようとしている
>>  共通処理のメソッドの中で、テキストボックスのインスタンスが、
>>  TextBoxAのインスタンスか、TextBoxBのインスタンスなのか?という判断をしたい、
>>  という意味なのでしょうか?
>>  # でも、そうだとすると、魔界の仮面弁士さんのNo48450の回答がズバリなので
>>  # 違う意図なのかなぁと想像しています
> フォーム上に未入力のテキストボックスがないかチェックするためです。

TextBoxAは必須(未入力禁止)、TextBoxBは未入力OKでいいんですよね?
魔界の仮面弁士さんの回答通り

>        If TypeOf CtrlItem Is TextBox Then

If CtrlItem .GetType() Is GetType(TextBoxA) Then 

のようにすればTextBoxAだけが条件に合致する(TextBoxBに対しては処理されない)
と思いますが、うまく行かないのであれば、どのような結果になるのでしょうか?

--
GeTypeメソッドとGetTypeキーワードを使う方式でうまく行くだろうというのは
以下の実験コードで検証しました。”変数”の中身がクラスAのインスタンスであるパターンの
「1:表示される」という文言のみが表示されます。

Imports System

Class O     ' TextBox/Controlの代わり
End Class

Class A     ' TextBoxAの代わり
    Inherits O
End Class

Class B     ' TextBoxBの代わり
    Inherits A
End Class

Module X
    Sub Main()
        Dim 変数 As O
        変数 = New A()
        If 変数.GetType() Is GetType(A) Then
            Console.WriteLine("1:表示される")
        End If
        変数 = New B()
        If 変数.GetType() Is GetType(A) Then
            Console.WriteLine("2:表示されない")
        End If
    End Sub
End Module

引用返信 編集キー/
■48494 / inTopicNo.7)  Re[4]: 派生コントロールの型
□投稿者/ うれ (4回)-(2010/04/07(Wed) 18:36:34)
ありがとうございます。

TextBoxA、TextBoxBが存在する上では
>If CtrlItem .GetType() Is GetType(TextBoxA) Then
でいいかと思いますが、TextBoxからは派生したコントロールが複数あったとして(例:TextBoxA〜TextBoxZ)、TextBoxにはすべて未入力禁止する場合は、TextBoxA〜TextBoxZまで列挙しなければなりませんか?
引用返信 編集キー/
■48495 / inTopicNo.8)  Re[5]: 派生コントロールの型
□投稿者/ よねKEN (457回)-(2010/04/07(Wed) 19:09:08)
No48494 (うれ さん) に返信
> ありがとうございます。
>
> TextBoxA、TextBoxBが存在する上では
> >If CtrlItem .GetType() Is GetType(TextBoxA) Then
> でいいかと思いますが、TextBoxからは派生したコントロールが複数あったとして(例:TextBoxA〜TextBoxZ)、TextBoxにはすべて未入力禁止する場合は、TextBoxA〜TextBoxZまで列挙しなければなりませんか?

今の設計では必要な分だけ列挙する必要があると思います。

条件式をOrでずらずら並べて記述する代わりにループ処理で記述する手ならあります。
GetTypeキーワードで返されるのはTypeオブジェクトですので、
Type型の配列に予め未入力禁止テキストボックスの型を準備しておいて、
CtrlItem .GetType()とその配列のそれぞれとをIsで比較するループを書けばよいでしょう。


引用返信 編集キー/
■48498 / inTopicNo.9)  Re[5]: 派生コントロールの型
□投稿者/ よねKEN (458回)-(2010/04/07(Wed) 19:12:49)
No48494 (うれ さん) に返信
> TextBoxA、TextBoxBが存在する上では
> >If CtrlItem .GetType() Is GetType(TextBoxA) Then
> でいいかと思いますが、TextBoxからは派生したコントロールが複数あったとして(例:TextBoxA〜TextBoxZ)、TextBoxにはすべて未入力禁止する場合は、TextBoxA〜TextBoxZまで列挙しなければなりませんか?

あれれ?TextBox全部で未入力禁止でよいのですか?その場合は、
質問の最初の投稿で書かれている以下の条件でTextBox及びTextBoxから派生したクラスすべてを引っ掛けられますよ?

> If TypeOf Ctrl Is TextBox Then

引用返信 編集キー/
■48505 / inTopicNo.10)  Re[6]: 派生コントロールの型
□投稿者/ 渋木宏明(ひどり) (1300回)-(2010/04/07(Wed) 21:04:48)
渋木宏明(ひどり) さんの Web サイト
直接の回答じゃないですが

>> (1) ここの説明はどのクラスのどのメンバで書いている(もしくは書こうとしている)
(略)
>フォームのクラスで行います。

フォームに直接実装を埋め込むんじゃなくて、そーうー拡張プロバイダ作った方がツブシ利いていいと思いますよ。
引用返信 編集キー/
■48535 / inTopicNo.11)  Re[6]: 派生コントロールの型
□投稿者/ うれ (5回)-(2010/04/08(Thu) 14:08:41)
No48498 (よねKEN さん) に返信
> ■No48494 (うれ さん) に返信
>>TextBoxA、TextBoxBが存在する上では
>>>If CtrlItem .GetType() Is GetType(TextBoxA) Then
>>でいいかと思いますが、TextBoxからは派生したコントロールが複数あったとして(例:TextBoxA〜TextBoxZ)、TextBoxにはすべて未入力禁止する場合は、TextBoxA〜TextBoxZまで列挙しなければなりませんか?
>
> あれれ?TextBox全部で未入力禁止でよいのですか?その場合は、
> 質問の最初の投稿で書かれている以下の条件でTextBox及びTextBoxから派生したクラスすべてを引っ掛けられますよ?
>
>>If TypeOf Ctrl Is TextBox Then
>

If TypeOf Ctrl Is TextBox Then
だと派生したコントロールはFalseになります。
引用返信 編集キー/
■48537 / inTopicNo.12)  Re[7]: 派生コントロールの型
□投稿者/ よねKEN (461回)-(2010/04/08(Thu) 14:33:07)
2010/04/08(Thu) 14:33:20 編集(投稿者)
No48535 (うれ さん) に返信
> If TypeOf Ctrl Is TextBox Then
> だと派生したコントロールはFalseになります。

ステップ実行などを行って変数Ctrlの中身がTextBoxA〜TextBoxZのインスタンスだった場合でも、
If文の条件が成立しないということですか?
ソースコードはNo48477 のコードなんですよね??

そんなはずはないのですけどね・・・昨日の実験コードは以下のコードの抜粋&改変版で、
「If TypeOf Ctrl Is TextBox Then」のパターンについても検証済みです。

--
◇実験コード
' VB8.0/VB9.0のコンパイラで検証
'コンパイル方法:vbc /out:test.exe test.vb
Imports System

Class O
End Class

Class A
    Inherits O
End Class

Class B
    Inherits A
End Class

Module X
    Sub Main()
        Dim 変数 As O
        変数 = New A()
        If 変数.GetType() Is GetType(A) Then
            Console.WriteLine("1:表示される")
        End If
        If TypeOf 変数 Is A Then
            Console.WriteLine("2:表示される")
        End If
        変数 = New B()
        If 変数.GetType() Is GetType(A) Then
            Console.WriteLine("3:表示されない")
        End If
        If TypeOf 変数 Is A Then
            Console.WriteLine("4:表示される")
        End If
    End Sub
End Module

◇実行結果
1:表示される
2:表示される
4:表示される

--
O型の変数にAクラスを継承したBクラスのインスタンスが設定されている場合に
A型かどうかをチェックして、A型だと判定されているので「4:表示される」と表示されています。


引用返信 編集キー/
■48544 / inTopicNo.13)  Re[8]: 派生コントロールの型
□投稿者/ うれ (6回)-(2010/04/08(Thu) 15:27:17)
2010/04/08(Thu) 15:31:37 編集(投稿者)
2010/04/08(Thu) 15:31:35 編集(投稿者)

一つずつ型を確認してみたんですが、例えばClass AだったらClass 0 と出てきてほしいんですがClass Aとなってます。

判定はClass 0だったら という判定です。
引用返信 編集キー/
■48548 / inTopicNo.14)  Re[9]: 派生コントロールの型
□投稿者/ よねKEN (463回)-(2010/04/08(Thu) 15:38:54)
> Class O
> End Class
>
> Class A
> Inherits O
> End Class
>
> Class B
> Inherits 0
> End Class
>
> です。

「TextBoxから派生させたTextBoxAがあります。
 さらにTextBoxAから派生させたTextBoxBがあります。」
と最初に書かれていますが・・・

途中で「TextBoxからは派生したコントロールが複数あったとして(例:TextBoxA〜TextBoxZ)」
という話も出てきていますが、結局のところどうなっているのですか?
前提をコロコロ変えられても困ります。

ちなみに上記の新情報での場合、O=TextBox、A=TextBoxA、B=TextBoxBという認識で問題なければ、やはり
「If TypeOf Ctrl Is TextBox Then」の式で問題ありません。
TextBoxAだろうがTextBoxBだろうがTextBoxを継承したクラスのインスタンスが変数Ctrlに入っていれば、
条件が成立します。

> 一つずつ型を確認してみたんですが、例えばClass AだったらClass 0 と出てきてほしいんですがClass Aとなってます。

「例えばClass AだったらClass 0 と出てきてほしいんですが」の部分が
意味がさっぱりわかりません。

なんか根本的な部分で認識のズレがあるようですorz
念のための確認ですが、”クラス”と”インスタンス”と”(インスタンスの参照を保持する)変数”
の三者は区別できてますか?
引用返信 編集キー/
■48554 / inTopicNo.15)  Re[9]: 派生コントロールの型
□投稿者/ 魔界の仮面弁士 (1604回)-(2010/04/08(Thu) 17:19:08)
No48544 (うれ さん) に返信
>例えばClass AだったらClass 0 と出てきてほしいんですがClass Aとなってます。

クラス零?
唐突に Class 0 なるものが登場しましたが、どういう意味でしょうか。


質問内容がいまひとつ読みきれませんが、型の『名前』だけで判定したいという意味なら、
「TypeName(変数)」や「変数.GetType().FullName」等を使うことができます。たとえば、
 If TypeName(変数名) Like "TextBox[A-Z]" Then
などのような判定ですね。(もちろん、Like 以外の方法で判定しても OK です)


一方、『名前』ではなく『型』で判定したいのであれば、調べたい型というのが
「継承関係にある型」「インスタンスの型」「変数の型」のいずれかなのかで異なります。
--------------------

独自作成の TextBoxA や Class A だと、誤解があるといけないので、下記では
標準の TextBox クラスおよび RichTextBox クラスを使って説明していきます。


まず、TextBox および RichTextBox については、
 Control
 └TextBoxBase
  ├TextBox
  └RichTextBox
という継承関係にあります。そのため、これらは、
 Dim C1 As New TextBox()
 Dim C2 As New RichTextBox()
 Dim C3 As Control = New TextBox()
 Dim C4 As Control = New RichTextBox()
のように宣言することができます。


この時、これらの変数 について『TypeOf 演算子』で
 If TypeOf 変数 Is 型 Then
と判定した場合、その結果は以下のようになります。

          ※ ○ = True、× = False ※
              ┏━┳━┳━┳━┓
  TypeOf 判定 ┃C1┃C2┃C3┃C4┃
┏━━━━━━╋━╋━╋━╋━┫
┃     Control┃○┃○┃○┃○┃
┣━━━━━━╋━╋━╋━╋━┫
┃ TextBoxBase┃○┃○┃○┃○┃
┣━━━━━━╋━╋━╋━╋━┫
┃     TextBox┃○┃×┃○┃×┃
┣━━━━━━╋━╋━╋━╋━┫
┃ RichTextBox┃×┃○┃×┃○┃
┗━━━━━━┻━┻━┻━┻━┛
つまり TypeOf 演算子では、クラスの継承元に対しても一致することになります。



一方、先の No48450 で回答した
 If 変数.GetType() Is GetType(型) Then
の方法を使った場合、以下のように判定されます。

              ┏━┳━┳━┳━┓
  GetType判定 ┃C1┃C2┃C3┃C4┃
┏━━━━━━╋━╋━╋━╋━┫
┃     Control┃×┃×┃×┃×┃
┣━━━━━━╋━╋━╋━╋━┫
┃ TextBoxBase┃×┃×┃×┃×┃
┣━━━━━━╋━╋━╋━╋━┫
┃     TextBox┃○┃×┃○┃×┃
┣━━━━━━╋━╋━╋━╋━┫
┃ RichTextBox┃×┃○┃×┃○┃
┗━━━━━━┻━┻━┻━┻━┛
この場合、インスタンスの型のみが調査対象です。変数の型は不問です。


その逆に、インスタンスではなく変数の型のみに着目して
              ┏━┳━┳━┳━┓
              ┃C1┃C2┃C3┃C4┃
┏━━━━━━╋━╋━╋━╋━┫
┃     Control┃×┃×┃○┃○┃
┣━━━━━━╋━╋━╋━╋━┫
┃ TextBoxBase┃×┃×┃×┃×┃
┣━━━━━━╋━╋━╋━╋━┫
┃     TextBox┃○┃×┃×┃×┃
┣━━━━━━╋━╋━╋━╋━┫
┃ RichTextBox┃×┃○┃×┃×┃
┗━━━━━━┻━┻━┻━┻━┛
のような判定結果を得たい場合には、このような方法があります。
 If GetVariableType(変数) Is GetType(型) Then

上記 GetVariableType は、下記のように記述してください。

Function GetVariableType(Of T)(ByVal obj As T) As Type
    Return GetType(T)
End Function

引用返信 編集キー/
■48597 / inTopicNo.16)  Re[10]: 派生コントロールの型
□投稿者/ うれ (8回)-(2010/04/09(Fri) 11:58:58)
No48554 (魔界の仮面弁士 さん) に返信
大変ご丁寧にご説明ありがとうございます。

テストプロジェクトを作成し、検証してみたところ、TypeOf 変数 Is TextBox で動作しています。

更に全体的なことも含め、検証してみたいと思います。

その後ご質問させていただくかもしれませんが、その際はよろしくお願い致します。
とりあえず解決とさせていただきます。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -