いつも勉強させていただいています。
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
よろしくお願いします。
ユーザー定義型自体の宣言を
Private Type CONFIG
DATA(2) As String * 10
End Type
のようにしておけば、
For i = 0 To 2
Debug.Print IN_DATA.DATA(i)
Next
と書けますよ。
魔界の仮面弁士さま いつも拝見しております。
有名人にご回答頂き、緊張しております。
例が悪かったです。申し訳ありません。
実際の構造体は、
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)などという便利な方法は
ないのでしょうか。
よろしくお願いします。
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
とやると、いい感じだけど、そこまでは流石に変更は無理?
ゴメン、ちょいと変更
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
>.Controls("xxxxx" & i)などという便利な方法は
>ないのでしょうか。
>よろしくお願いします。
ないです。
皆さんのおっしゃるように自分で実装して下さい。
私ならクラスを作成し、そこに埋め込んでしまいますが。
> .Controls("xxxxx" & i)などという便利な方法は
> ないのでしょうか。
基本的にはできません。クラスなら、CallByNameが使えますけれどね。
一応、ユーザー定義型のメンバを、メンバ名(文字列)で指定する方法も、
あるにはあるのですが……使用条件がかなり限定されてしまいます。
http://www7.big.or.jp/~pinball/discus/vb/59197.html
# 将来バージョンの VB9 では、
# a = Person.Age
# というコードの代わりに
# s = "Age"
# a = Person.(s)
# という記述が可能になるという話ですけれどね…。
いなさま。ありがとうございます。
構造体の使い方、単純なものしかわかならかったのですが
勉強になりました。なんとなく雰囲気は予想していたので
すぐに理解できました。さっそく試して見ます。
030さま。
>ないです。
了解しました。別に楽しようと思ったわけではありませんの
で「ない」ことがわかって納得です。
残念ながら初心者でクラスの概念がいまだわかりません。
今回は、いなさまの方法に今からチャレンジします。
ありがとうございました。でもあちらこちらでクラスという
言葉がでてきますので、きっとこれから勉強する必要がある
と思っています。そのときはまた、お世話になると思います。
魔界の仮面弁士さま、いなさま、030さま 見事というほか
ないスピードと適確なご指導ありがとうございました。
チャレンジして結果報告時、解決とさせていただきます。
では、挑戦してきます。
結果報告します。
見事できました。みなさまには当たりまえでしょうが、私に
とっては感激です。ありがとうございます。
'構造体一部分
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なんてことも考えられるので・・・・。
心配でまたまた質問させていただきます。
>結果はOKでしたが、同名でも問題ないのでしょうか。
私なら、無智ゆえに、名前を変え同名を避けます。
了解です。いなさま。
※ Ref_CONFIG_Dtail(2) As CONFIG_Dtail
わかりやすく且つ違う名前にすることしました。
ありがとうございました。
ツイート | ![]() |