TYPEについて教えてください

解決


トラブル  2005-11-26 03:11:22  No: 128215

いつも勉強させていただいています。
Typeについて困っています。

Private Type CONFIG
    DATA0       As String * 10
    DATA1       As String * 10
    DATA2       As String * 10
End Type

Private IN_DATA As CONFIG

Private Sub Command1_Click()
    Open Me.CommonDialog1.FileName For Binary As #1
        Get #1, 1, IN_DATA
    Close #1
    
    Debug.Print IN_DATA.DATA0
    Debug.Print IN_DATA.DATA1
    Debug.Print IN_DATA.DATA2
End

 Debug.Print を3回次のようにForでまわすことはできないのでしょうか。
たとえば'Me.Controls("DATA" & i).Captionのような書き方
    For i = 0 To 2
            Debug.Print ???????? ←
    Next i
よろしくお願いします。


魔界の仮面弁士  2005-11-26 04:29:31  No: 128216

ユーザー定義型自体の宣言を
  Private Type CONFIG
    DATA(2)     As String * 10
  End Type
のようにしておけば、
  For i = 0 To 2
    Debug.Print IN_DATA.DATA(i)
  Next
と書けますよ。


トラブル  2005-11-26 06:33:22  No: 128217

魔界の仮面弁士さま  いつも拝見しております。
有名人にご回答頂き、緊張しております。
例が悪かったです。申し訳ありません。
実際の構造体は、
Private Type CONFIG
    Str_DATA0       As String * 10
    Long_DATA0      As Long
    Byte_DATA0      As Byte

    Str_DATA1       As String * 10
    Long_DATA1      As Long
    Byte_DATA1      As Byte

    Str_DATA2       As String * 10
    Long_DATA2      As Long
    Byte_DATA2      As Byte

End Type
などとなっており、ちょっと不規則なのです。
.Controls("xxxxx" & i)などという便利な方法は
ないのでしょうか。
よろしくお願いします。


いな  2005-11-26 06:45:11  No: 128218

Private Type CONFIG_Dtail
    Str_DATA       As String * 10
    Long_DATA      As Long
    Byte_DATA      As Byte
End Type

と定義して、

Private Type CONFIG
    Str_DATA0 As CONFIG_Dtail
    Str_DATA1 As CONFIG_Dtail
    Str_DATA2 As CONFIG_Dtail
End Type

とやると、いい感じだけど、そこまでは流石に変更は無理?


いな  2005-11-26 06:48:21  No: 128219

ゴメン、ちょいと変更

  Private Type CONFIG
    DATA(2)     As CONFIG_Dtail
  End Type

とやると、

  For i = 0 To 2
    Debug.Print IN_DATA.DATA(i).Str_DATA 
    Debug.Print IN_DATA.DATA(i).Long_DATA
    Debug.Print IN_DATA.DATA(i).Byte_DATA 
  Next


030  2005-11-26 07:11:58  No: 128220

>.Controls("xxxxx" & i)などという便利な方法は
>ないのでしょうか。
>よろしくお願いします。
ないです。
皆さんのおっしゃるように自分で実装して下さい。
私ならクラスを作成し、そこに埋め込んでしまいますが。


魔界の仮面弁士  2005-11-26 07:32:33  No: 128221

> .Controls("xxxxx" & i)などという便利な方法は
> ないのでしょうか。

基本的にはできません。クラスなら、CallByNameが使えますけれどね。

一応、ユーザー定義型のメンバを、メンバ名(文字列)で指定する方法も、
あるにはあるのですが……使用条件がかなり限定されてしまいます。
http://www7.big.or.jp/~pinball/discus/vb/59197.html

# 将来バージョンの VB9 では、
#   a = Person.Age
# というコードの代わりに
#   s = "Age"
#   a = Person.(s)
# という記述が可能になるという話ですけれどね…。


トラブル  2005-11-26 07:34:53  No: 128222

いなさま。ありがとうございます。
構造体の使い方、単純なものしかわかならかったのですが
勉強になりました。なんとなく雰囲気は予想していたので
すぐに理解できました。さっそく試して見ます。

030さま。
>ないです。
了解しました。別に楽しようと思ったわけではありませんの
で「ない」ことがわかって納得です。
残念ながら初心者でクラスの概念がいまだわかりません。
今回は、いなさまの方法に今からチャレンジします。
ありがとうございました。でもあちらこちらでクラスという
言葉がでてきますので、きっとこれから勉強する必要がある
と思っています。そのときはまた、お世話になると思います。

魔界の仮面弁士さま、いなさま、030さま  見事というほか
ないスピードと適確なご指導ありがとうございました。

チャレンジして結果報告時、解決とさせていただきます。
では、挑戦してきます。


トラブル  2005-11-26 09:19:14  No: 128223

結果報告します。
見事できました。みなさまには当たりまえでしょうが、私に
とっては感激です。ありがとうございます。

'構造体一部分
Private Type CONFIG_Dtail
    Str_DATA       As String * 10
    Long_DATA      As Long
    Byte_DATA      As Byte
End Type

'構造体全体
Private Type CONFIG
    CONFIG_Dtail(2)     As CONFIG_Dtail  ←※
End Type

  For i = 0 To 2
    Debug.Print IN_DATA.CONFIG_Dtail(i).Str_DATA 
    Debug.Print IN_DATA.CONFIG_Dtail(i).Long_DATA
    Debug.Print IN_DATA.CONFIG_Dtail(i).Byte_DATA 
  Next

ただ・・・
構造体全体がかなり長く、(構造体一部)が多数の種類
存在するために、わかりやすく次のように同名で宣言し
てみました。

※  CONFIG_Dtail(2)     As CONFIG_Dtail

結果はOKでしたが、同名でも問題ないのでしょうか。
たまたまOKなんてことも考えられるので・・・・。
心配でまたまた質問させていただきます。


いな  2005-11-26 12:59:14  No: 128224

>結果はOKでしたが、同名でも問題ないのでしょうか。

私なら、無智ゆえに、名前を変え同名を避けます。


トラブル  2005-11-26 19:55:07  No: 128225

了解です。いなさま。
※  Ref_CONFIG_Dtail(2)     As CONFIG_Dtail
わかりやすく且つ違う名前にすることしました。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加