タイトル通りです。
テキストボックスなどをコントロール配列で持つときに二次元配列で持つ方法はないでしょうか?

ご回答の方、宜しくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

コントロールのIndexプロパティを利用する方法では二次元配列はできません。


しかし、変数としての二次元配列ならできます。

Dim TextBoxes(3, 10) As TextBox

などとすると、テキストボックスの多次元配列ができます。
ただし、この変数にはインスタンスがないので、インスタンスは別に作成してやる必要があります。

以下に例を示します。

名前がTexts、Indexが0のTextBoxを配置します。
フォームモジュールに以下を貼り付けます。

Option Explicit

Private TextBoxes(3, 10) As TextBox

Private Sub Form_Load()

On Error Resume Next
Dim N As Long, M As Long, T As Long

For N = 0 To 2

For M = 0 To 9

T = N * 10 + M
Load Texts(T) 'Load Texts(0)はエラーだが無視される
Set TextBoxes(N, M) = Texts(T)
TextBoxes(N, M).Left = N * 1320
TextBoxes(N, M).Top = M * 300
TextBoxes(N, M).Visible = True

Next M

Next N

End Sub

Private Sub Texts_Click(Index As Integer)

MsgBox "これは(" & (Index \ 10) & ", " & (Index Mod 10) & ")です"

End Sub

この方法を使う場合、TextBoxes(N, M)のIndexプロパティはN * 10 + Mを示すので、注意が必要です。
    • good
    • 0
この回答へのお礼

ありがとうございます。これが知りたかったのです。
Dimで宣言すれば二次元配列にできそうだ、ということには気づいていたのですが。
インスタンスの生成が足りなかったのですね。ありがとうございました。

お礼日時:2002/02/12 10:15

Mizyuさん、こんにちは。



コントロールを二次元配列にする方法は知りません。
ただ、二次元配列を添え字につかったらにた処理が出来ると思います。

dim iArry(10,10) as integer

iArry(1,1)=1
iArry(2,1)=2
...

TEXT(iArry(1,1)).TEXT = "AAAAA"
TEXT(iArry(2,1)).TEXT = "BBBBB"
    • good
    • 0

Mizyuさん、こんにちは。


コントロール配列を二次元にする方法はありません!かな?
調べ切っていないのかも知れませんが、僕は知りません。

仮想二次元にして、その都度計算されたらいかがでしょうか。

例えば 5×8 の二次元とします。
DIM TBL(40) as string
for i=1 to 5
for j=1 to 8
TBL((i-1)*8 + j)="テスト"
next j
next i
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qコントロール配列のテキストボックスの大きさの自動調整

日本語に対して英訳を入力し正誤を判定するプログラムを作っています。
答えの英文(1文ずつ)を入力するテキストボックスを、単語数分だけコントロール配列で自動表示したいのですが、その際にテキストボックスを単語の文字数に適した大きさにするやり方がわかりません。
(例 I am a girl.が答えなら、テキストボックスを4つ表示し、
「I」に該当するテキストボックスは1文字分の大きさで表示)
英文から単語数、単語の文字数を計算する部分はだいたいわかりますが、親切な方がいらっしゃいましたらその部分もお願いいたします。
初心者なので簡単な質問かもしれませんが、宜しくお願いします。

Aベストアンサー

Option Explicit

Dim Rdata As String
Dim Moj_A As String
Dim Dummy As Integer
Dim Mojsuu As Integer
Dim Sw As Integer
Dim Moj As String
Dim N As Integer
Dim my_Range As Integer

'
'これを テストするには、テキストボックスを6個 配列にして

'コマンドボタンを 1個 配置する必要が、あります。
'


Private Sub Command1_Click()
Mojsuu = Len(Rdata)
N = 0
Moj = Rdata
Dummy = 1
Sw = 1

Do
If Dummy = Mojsuu Then
N = N + 1
Moj_A = Mid(Rdata, Sw, Dummy - (Sw - 1))
Call Txit_c(Moj_A, N)
Exit Do
End If

If Moj = " " Then
If Sw = 1 Then
N = N + 1
Moj_A = Left(Rdata, Dummy - 2)
Sw = Dummy
Call Txit_c(Moj_A, N)
ElseIf Sw <> Mojsuu Then
N = N + 1
Moj_A = Mid(Rdata, Sw, Dummy - (Sw + 1))
Sw = Dummy
Call Txit_c(Moj_A, N)
End If

End If

Moj = Mid(Rdata, Dummy, 1)
Dummy = Dummy + 1

Loop

End Sub

Sub Txit_c(Moj_A As String, N As Integer)
my_Range = Len(Moj_A)

Form1.ScaleMode = vbCharacters

Text1(N - 1).Text = Moj_A
Text1(N - 1).Width = my_Range + 0.5 'my_Range + 1の 1 は、Widthのoffsetで 微調整(工夫)が必要です。

Form1.ScaleMode = vbPixels

For N = 0 To N - 1
Text1(N + 1).Left = Text1(N).Left + Text1(N).Width + 10 'Text Box間の間隔を設定 現在は、Offset=10
Next

End Sub


Private Sub Form_Load()
Rdata = "Antonio Pantoja, Domingo Cura & Jorga" ' TEST用文字列です。
End Sub

Option Explicit

Dim Rdata As String
Dim Moj_A As String
Dim Dummy As Integer
Dim Mojsuu As Integer
Dim Sw As Integer
Dim Moj As String
Dim N As Integer
Dim my_Range As Integer

'
'これを テストするには、テキストボックスを6個 配列にして

'コマンドボタンを 1個 配置する必要が、あります。
'


Private Sub Command1_Click()
Mojsuu = Len(Rdata)
N = 0
Moj = Rdata
Dummy = 1
Sw = 1

Do
If Dummy = Mojsuu Then
N = N + ...続きを読む

QVB.NETでテキストボックスをコントロール配列のように扱いたいんですが

VB.NETではコントロール配列はサポートされていませんが、TextBox1~TextBox10を配列のように扱う方法はありますか?ちなみに、以下の方法ではエラーとなりました。

Controls("TextBox" & i).Text でTextの内容を取得しようとした

よろしくお願いします。

Aベストアンサー

こんな感じでいかがでしょうか。

Dim i As Long
Dim s As String
Dim Ctl As Control
Dim CtlName As String
For i = 1 To 2
  CtlName = "TB" & i.ToString
  For Each Ctl In Me.Controls
    If Ctl.Name = CtlName Then
      s = s & Ctl.Text
    End If
  Next Ctl
Next i
MsgBox(s)

こんな感じでいかがでしょうか。
.Netはまだ勉強途中なんで、もしかしたら他のやり方があるかも~

QVB6で、一次元配列と二次元配列の相互コピー

VB6で、一次元配列と二次元配列の相互コピーをしたいです。

(1)元々下記のような宣言をもつ配列がありました。
Public Type TKey
no As String
id As String
code As String
atr() As String
End Type

Public Type tr
Key As TKey
atr() As String
abc As Boolean
End Type

Public gtr() As tr


(2)コピー用に、下記のような二次元配列用宣言をつくりました。
Public Type TKey2
2no As String
2id As String
2code As String
a2tr() As String
End Type

Public Type 2tr
Key22 As TKey2
atr22() As String
abc22 As Boolean
End Type

Public g2tr() As 2tr


(3)  (1)から(2)にデータを複製したり、
(4)  (2)から(1)にデータを複製したいです。

今は、下記のように面倒くさいことをしています。
dim gtr(maxcnt)
ReDim Preserve g2tr(500, maxcnt)

ループ
g2tr(cnt, i).Key22.2code = gtr(i).Key.code ・・・(3)
gtr(i).Key.code = g2tr(j, i).Key22.2code ・・・(4)
      今は上記を全ての宣言の配列に実行しています。

なにかもっと効率のよい方法はないでしょうか。
(1)の配列は、1~500くらいはあり、不定です。

VB6で、一次元配列と二次元配列の相互コピーをしたいです。

(1)元々下記のような宣言をもつ配列がありました。
Public Type TKey
no As String
id As String
code As String
atr() As String
End Type

Public Type tr
Key As TKey
atr() As String
abc As Boolean
End Type

Public gtr() As tr


(2)コピー用に、下記のような二次元配列用宣言をつくりました。
Public Type TKey2
2no As String
2id As String
2code As String
a2tr() As String
End Type

Public...続きを読む

Aベストアンサー

構造体のメンバーが同じ構成ならばランダムアクセスファイルを使ってベタに流してやればいいのでは

' ファイル番号は FreeFileで取得したほうがいいかも
Open "sample.bin" for random as #1
' 書き出す位置は適宜修正してください
for n = 0 to 20
  ' レコード番号を省略すると 1番から順に出力します
  put #1,,g2tr(n,1)
next
' 読み出す位置の修正も ・・・
for n = 0 to 20
  ' レコード番号は1番からなので n+1で指示
  Get #1, n+1, gtr(n)
next
close

QVB2010でのコントロール多次元配列について

教えてください。
実行中にコントロールを生成したいのですが、

Public Class Form1
 Private myTxt(,) As System.Windows.Forms.TextBox

 Me.myTxt = New System.Windows.Forms.TextBox(59, 2) {}
 Dim i As Integer
 Dim j As Integer
 Dim h As Integer
 Dim p As Integer

 h = 10
 p = 100
 For i = 0 To Me.myTxt.GetLength(0) - 1
  For j = 0 To Me.myTxt.GetLength(1) - 1
   Me.myTxt(i, j) = New System.Windows.Forms.TextBox
   Me.myTxt(i, j).Name = "myTxt" + i.ToString() + j.ToString()
   Me.myTxt(i, j).Size = New Size(100, 30)
   Me.myTxt(i, j).Location = New Point(p, h)
   p = p + 100
  Next j
  h = h + 30
 Next i

 Me.myPnl.Controls.AddRange(Me.myTxt)

と書くと最後の行が波線になり、
“型 'System.Windows.Forms.TextBox の 2 次元配列' の値を
'System.Windows.Forms.Control' に変換できません。”とエラーになります。

これはAddRangeは多次元配列に使用できないということなのでしょうか?
色々検索してみましたが、コントロールの生成に関する多次元配列が見つけられずに
困っていました。

最後のAddRange(Me.myTxt)をAdd(Me.myTxt(i,j))などと変えたりしても別のエラーになり、
基本的に間違っている気がしますがどこだかがわかりません。

詳しい方、宜しくお願い致します。

教えてください。
実行中にコントロールを生成したいのですが、

Public Class Form1
 Private myTxt(,) As System.Windows.Forms.TextBox

 Me.myTxt = New System.Windows.Forms.TextBox(59, 2) {}
 Dim i As Integer
 Dim j As Integer
 Dim h As Integer
 Dim p As Integer

 h = 10
 p = 100
 For i = 0 To Me.myTxt.GetLength(0) - 1
  For j = 0 To Me.myTxt.GetLength(1) - 1
   Me.myTxt(i, j) = New System.Windows.Forms.TextBox
   Me.myTxt(i, j).Name = "myTxt" + i.ToString() + ...続きを読む

Aベストアンサー

Control.ControlCollection.AddRangeはControlの一次元配列を引数にとります。
ref) http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.controlcollection.addrange.aspx

このため,二次元配列を直接引数に渡すことはできません。
一次元配列にすれば良いのですが,配列はIEnumerable(Of T)を一次元配列の時のみ実装するため,
myTxt.Cast(Of Control).ToArray()
のようにIEnumerable(Of Control)を経由して一次元配列にすればよいでしょう。
# IE(Of T)を二次元配列も実装してくれればToArray()一発だったのですが……。

Qリッチテキストボックスとテキストボックスの違い

VB6のリッチテキストボックスとテキストボックス
の違いは何なんでしょうか?

Aベストアンサー

RichTextだと扱えるファイルサイズが大きくなり
プロパティの指定が可能になります。

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformsrichtextboxclasstopic.asp


このカテゴリの人気Q&Aランキング

おすすめ情報