ソース上でコントロール配列を動的に配置する場合の手法が解りません。
フォーム上に貼り付けられたコントロール配列を、動的に可変させるにはLOAD/UNLOADなどで良いようですが、1つめの要素(0)から動的に生成させる事は出来ないものでしょうか?
ご存知の方いらっしゃいましたら、よろしく手ほどきのほどお願いいたします。

A 回答 (5件)

試していませんが、これででょうでしょうか?


---
Private myBtn(9) As VB.CommandButton

Private Sub Form_Load()

Dim i As Integer

For i = 0 To 9
Set myBtn(i) = Form1.Controls.Add("VB.CommandButton", "cmdBtn" & i)
Next
End Sub
    • good
    • 0
この回答へのお礼

完璧に動作確認できました。
発想の転換ですね~。
後はReDim preserve あたりでいけそうですね。
本当に助かりました、ありがとうございます!

お礼日時:2001/06/13 15:21

確認しました。


やはり、起動後は、Indexはさわれませんね。

todo36さんの方法が最適のようです。

セットしておく先は、配列の変わりにCollectionを
使う手もありますね。
    • good
    • 0
この回答へのお礼

わざわざ確認して頂き、ありがとうございます。
Collectionも追々使用していくつもりです。
しかし、いろんな切り口があるんですね~。
VBも奥が深いと痛感してます。
ありがとうございました。

お礼日時:2001/06/14 11:27

現在VB6がさわれない環境にあるので、確認できないのですが(夜まで待っていただければ、自宅でチェックします)、



Dim objBtn As Object

set objBtn = Form1.Controls.Add "VB.CommandButton", "cmdBtn"
objBtn.Index = 0

として、objBtn.Index=0がエラーにならなければ、

Load cmdBtn(1)

が通りそうな気がするのですが。
objBtn.Index=0がエラーになるのであれば、当然cmdBtn(0)がないので、Loadも出来ないと思います。
    • good
    • 0
この回答へのお礼

何回もありがとうございます。書き忘れましたがVB6です。
とりあえずTodo36さんのお答えで壁は越えられましたが、arataさん式の別なアプローチもありそうなので、締め切りは明日にしたいと思います。
このままだと、Set は通りましたが、やはり Load でエラーが出てしまいました。

お礼日時:2001/06/13 15:34

VB6では、Indexが0のコントロールを用意しなくても、動的にコントロールを追加することができます。



Controls.Add

を調べてみて下さい。
これで追加したコントロールのIndexを0に設定することが出来るかどうかは、やってみてないので、わかりません。

VB5以前では、Indexが0のコントロールを用意しないと動的に生成させることはできません。

参考URL:http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/98 …

この回答への補足

ありがとうございます。
Form1.Controls.Add "VB.CommandButton", "cmdBtn"
などとして、
Load cmdBtn(1)
とした場合エラーになるので、最初からコントロール配列としての定義が必要???と思い質問させて頂きました。
フォーム上で配置したコントロール配列には、問題なく増減できるのですが・・・。

補足日時:2001/06/13 13:14
    • good
    • 0

 ただ単に一つめの要素から(0),(1)・・・のようにコントロール配列を順番に生成したいって事ですか?

この回答への補足

早速ありがとうございます。その通りです。
まっさらなフォームにコマンドボタン10個をソースリストから生成するような感じです。
単純なコントロールなら、Addメソードなどで良いのですが、このメソードでは btnMyButton(0) のような配列要素を生成できないようなので・・・。
引き続きご教授くださるとありがたいです。

補足日時:2001/06/13 11:38
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

QWord2007のコンテンツコントロールについて

Word2007で表紙「サイドライン」というものを挿入しました。

その後、コンテンツコントロールを削除できないように「開発」タブを表示させ、リボンの中からプロパティをクリックしようとしましたが、グレーアウトしていてクリックできません。

デザインモードにするとプロパティをクリックできるようになるのですが、クリックすると英語がズラズラ出てきて、コンテンツコントロールのプロパティウィンドウは出てきません。

どのようにすれば、コンテンツコントロールのプロパティ画面が出るのでしょうか。

Aベストアンサー

> デザインモードにするとプロパティをクリックできるようになるのですが、
> クリックすると英語がズラズラ出てきて
これは、コンテンツを何も選択していない場合は、ドキュメントのプロパティ一覧が表示されているのと違いますか。

デザインモードかどうかに関わらず、各コンテンツコントロールを選択すると、プロパティがアクティブになって選択できるようになりませんか。
 

Q2次元動的配列の第一引数のみを可変にする

ReDim Preserve aStrSKU(x, 2)
aStrSKU(x, 0) = strPre
aStrSKU(x, 1) = サブ2
aStrSKU(x, 2) = サブ3

x = x + 1

上記のソースをDo Untilでまわしているのですが、
2週目以降にxに1を足して行数だけ増やしたいのですが、
2週目でエラーが発生します。
行数だけ要素数を増やす方法はありますか?

Aベストアンサー

こんな感じで

Structure column
Dim col1 As String
Dim col2 As String
Dim col3 As String
End Structure

Private Sub test()

Dim aStrSKU() As column
Dim x As Integer

Do Until x = 3
ReDim Preserve aStrSKU(x)
aStrSKU(x).col1 = "strPre"
aStrSKU(x).col2 = "サブ2"
aStrSKU(x).col3 = "サブ3"

x = x + 1
Loop

End Sub

Qワード2010「フォームコントロール」文字制限

ワード2003などの文書を保存すると、「コンテンツコントロール」が使えなく
ワード2010では「フォームコントロール」を使わないといけないということがわかり
ためしに、ワード2003のファイルをワード2010で「フォームコントロール」の設定をしましたが
以下の問題が発生しました。

テキストフィールドのフォームコントロールを挿入し、文字列、最長10文字、全角で設定を
したのですが、10文字以上の文字も数字も入力ができるのです。

また、コンボボックスのフォームコントロールを挿入し
「ビジネス英語」「簿記」「パソコン」とドロップダウンリストを作ったのですが
ドロップダウンして「英語」以外のものを選択ができません。

どうしてでしょうか?

テキストはFOM出版 MOSエキスパート2010のLesson72をやっています。
テキストにそってやっているのですが、上記が疑問です。

ぜひ、ご回答をいただきたいと思っております。
よろしくお願いします。

Aベストアンサー

>2003などで文書を保存すると、ワード2010では「フォームコントロール」を使わないといけないということがわかり・・・
というよりは、互換モードになりますので2010のコントロールコマンドは使えない状態(グレーアウトします)となり、「以前のバージョンのツール」というコマンドのみの使用となります

テキストフォームフィールドの設定は添付画像を載せますが、一応念のため設定方法を・・・。
テキストボックスフォームフィールドをダブルクリックするとプロパティが出ます
「種類」→「文字列」に設定
「最長文字数」→「10」に設定
「文字列の形式」→「全角文字」
ここまで設定で来たら「OK」を押す

「開発」タブより、「文書の制限」をクリック
1 書式の制限
  「利用可能な書式を制限する」にチェックを入れる
2 編集の制限
  「ユーザーに許可する編集の種類を指定する」の▼をクリックして「フォームの入力」を選択
「はい、保護を開始します」をクリックするとパスワードを入力する画面が出ますが、何も入力しないで「OK」をクリック

テキストボックスフォームフィールドをクリックして文字を入力
<例>あいうえおかきくけこさしすせそ(わざと15文字入力します)
文字はいくらでも入力できますが「Enter」を押したときに10字以上は消えて10字までの文字がフィールド内に入力されます

あと、ドロップダウンフォームフィールドですが・・・ (; ̄ー ̄A アセアセ・・・
これも同じく、1・2の順で文書を保護する事で、ドロップダウンのフィールドをクリックするとリストが出ますので、FOM出版のテキストをもう一度よく読んでみて下さい

>2003などで文書を保存すると、ワード2010では「フォームコントロール」を使わないといけないということがわかり・・・
というよりは、互換モードになりますので2010のコントロールコマンドは使えない状態(グレーアウトします)となり、「以前のバージョンのツール」というコマンドのみの使用となります

テキストフォームフィールドの設定は添付画像を載せますが、一応念のため設定方法を・・・。
テキストボックスフォームフィールドをダブルクリックするとプロパティが出ます
「種類」→「文字列」に設定
「最...続きを読む

Q動的配列が存在(要素が有る)か否かを判定できますか?

VBAで、「For ループが初期化されていません」エラーが発生します。
動的配列が要素0の時に発生するようです。
動的配列の要素が生成された場合だけ、Forループしたいのですが、
どうやって判定すればよいのでしょうか?
-------------------------------
Dim 配列() As Integer
Dim i As Integer
i = 0
If (i < 0) Then ' 本当は真になったり偽になったり
ReDim 配列(0 To i)
配列(i) = a + b
i = i + 1
End If

'' if ★★★ then '' 配列が有るか確認
For Each c In 配列
MsgBox c
Next
'' end if
-------------------------------

Aベストアンサー

こんにちは。

動的配列の要素が生成された時だけ、For ~Loop するなら、#2 さんのご指摘のように、動的配列を生成したときに、フラグを立てるのが一番簡単ですね。配列変数を、Integerと最初から宣言してしまっていますから、それ自体が変化したことを、値を取り出す方法以外には、チェックできませんね。

以下は未知の変数の配列を調べる場合、VBAでは以下のような方法を使います。

 On Error Resume Next
 dummy = 配列(0)
 Err.Clear  'プロシージャ内で、使いまわしする場合は、必要
 On Error GoTo 0
 If dummy <> Empty Then
  For Each c In 配列
   MsgBox c
  Next
 End If
 dummy = Empty 'dummy を使いまわしする場合は、一旦空にする。

Q設定などの表示が英語になった

スリープ状態から起こすとき、毎回パスワードを要求されるようになりました。面倒なのでなんとかしようとしたら、設定が英語表示に変わってしまいました。日本語表示に戻るにはどうしたら良いのでしょうか?
画面には今も日本語が出るし、こうして日本語入力もできます。しかし、コントロールパネルなどの表示が英語になっています。

Aベストアンサー

「スタート」右クリック「ファイル名を指定して実行」「 netplwiz」入力「OK」
「ユーザー」「このコンピューターのユーザー」からユーザー名を選択し、「ユーザーがこのコンピュータを使うにはユーザ名とパスワードの入力が必要」のチェックを外し「OK」
パスワードを入力、確認のため再度入力、「OK」再起動→パスワード入力を省略し自動サインインになります。(アカウントとパスワードは記録しておきます)

英語表示
1)再起動してみる。
2)「スタート」ボタン右クリック「コントロールパネル(Control Panel)」「時計、言語、および地域(Clock, Language, and Region)」言語の設定。(「スタート」メニューの「設定(Settings)」→「時刻と言語(Time & language)」でも言語を設定)

Q【VB2005】 実行時に動的にコントロールを作成した後のコントロールへの処理

こんばんわ、VB5.0を1週間ほどかじって現在2005に乗り換えたばかりのド初心者です。
(用語の使い方などが間違っている可能性があるかもしれません。おかしなところは指摘していただけるとありがたいです)

VB5.0を使っていたときはコントロール配列を使って簡単にできた事が2005になってコントロール配列を使えなくなったため行き詰ってしまいました。
内容は、ある操作をすると画面にコントロールが1つずつ追加されていき、そのコントロールのプロパティを他のコントロールから操作できるようにする物です。
検索などで情報を集めて、なんとかコントロールを追加していくことができるようにはなったのですが、プロパティを変更するためにコントロールにアクセスする際にエラーになってしまって困っています。

一つだけコントロールが追加された場合は、問題なくプロパティをいじれるのですが、2つ以上追加した場合に最新のコントロール以外のプロパティをいじろうとするとエラーになってしまうのです。
下に私の作りたいプログラムを簡潔にしたサンプルソースを記述させていただきます。
間違いの指摘やアドバイスをいただければ幸いです。


FormにはAddButtonというボタンが一つだけあります。

Dim Index As Integer

Private Buttons() As System.Windows.Forms.Button
Private Labels() As System.Windows.Forms.Label

Private Sub AddButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AddButton.Click

Index += 1
Me.Buttons = New System.Windows.Forms.Button(Index) {}
Me.Labels = New System.Windows.Forms.Label(Index) {}

Me.SuspendLayout()

Me.Buttons(Index - 1) = New System.Windows.Forms.Button

Me.Buttons(Index - 1).Text = Index - 1
Me.Buttons(Index - 1).Size = New Size(30, 30)
Me.Buttons(Index - 1).Location = New Point((Index - 1) * 30, 50)

Me.Labels(Index - 1) = New System.Windows.Forms.Label

Me.Labels(Index - 1).Text = Index - 1
Me.Labels(Index - 1).Size = New Size(30, 30)
Me.Labels(Index - 1).Location = New Point((Index - 1) * 30, 100)

AddHandler Me.Buttons(Index - 1).Click, _
AddressOf Me.Buttons_Click

Me.Controls.AddRange(Me.Buttons)
Me.Controls.AddRange(Me.Labels)
Me.ResumeLayout(False)

End Sub

Private Sub Buttons_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

Labels(sender.text).ForeColor = Color.Red

End Sub

こんばんわ、VB5.0を1週間ほどかじって現在2005に乗り換えたばかりのド初心者です。
(用語の使い方などが間違っている可能性があるかもしれません。おかしなところは指摘していただけるとありがたいです)

VB5.0を使っていたときはコントロール配列を使って簡単にできた事が2005になってコントロール配列を使えなくなったため行き詰ってしまいました。
内容は、ある操作をすると画面にコントロールが1つずつ追加されていき、そのコントロールのプロパティを他のコントロールから操作できるようにする物です...続きを読む

Aベストアンサー

原因は
>Me.Buttons = New System.Windows.Forms.Button(Index) {}
です。クリックするたびこの部分で配列が全て初期化されています。
配列の中身を保持したまま配列の大きさを変える場合は

ReDim Preserve Me.Buttons(Index-1)

とします。



配列を使わずにlistを使用する方法もあります。

Private Index As Integer
Private lstButtons As New List(Of System.Windows.Forms.Button)()

Private Sub AddButton_Click(ByVal sender As System.Object...省略)

Me.lstButtons.Add(New System.Windows.Forms.Button())
Me.lstButtons.Item(Index).Text = Convert.ToString(Index)
Me.lstButtons.Item(Index).Size = New Size(30, 30)

Index += 1

End Sub

原因は
>Me.Buttons = New System.Windows.Forms.Button(Index) {}
です。クリックするたびこの部分で配列が全て初期化されています。
配列の中身を保持したまま配列の大きさを変える場合は

ReDim Preserve Me.Buttons(Index-1)

とします。



配列を使わずにlistを使用する方法もあります。

Private Index As Integer
Private lstButtons As New List(Of System.Windows.Forms.Button)()

Private Sub AddButton_Click(ByVal sender As System.Object...省略)

Me.lstButtons.Add(New S...続きを読む

Q英語版WindowsXPもしくはVistaを日本語化

現在、オーストラリアに滞在しておりまして、最近の円高を利用し
現地の英語版のPCを購入し、OSだけ日本語化しようと考えています。
そこで質問なのですが、例えばスタートメニューやコントロールパネルなどすべて英語から日本語へ変更することは可能なのでしょうか。それともやはり日本語版のOSを購入しないと、すべて日本語にすることは難しいのでしょうか。またその逆で日本語版を英語版にする方法もぜひ教えてください。ご回答宜しくお願いします。

Aベストアンサー

Vistaと、XPでは若干違います。

特にXPのプロの多言語対応版のOSを購入したのなら、かなり日本語化できます。といっても、スタートメニューが起動時は英語、切り替えると日本語になったり英語に戻ったりだったと思います。コントロールパネルは英語のままで、アイコンそのものを自分で変更すると、日本語表示にまで変えることができますが、自分が名前を日本語で入力しなおしたもの、あるいは、日本語のアイコンを移植したものだけです。

日本語版、これを英語に切り替えるのも同様です。起動時は日本語になってしまうのですが、起動するまでは英語の表示にすることは、インストールする際の指定の仕方である程度は可能です。XPなら、プロの多言語対応版ならという条件ですので、他はそこまで対応できないと思います。

VISTAになると、アルティメットの日本語版を購入すると、ある程度は英語の表示に切り替えできました。しかし、ホームプレミアムやベーシックでは英語のスタートメニューには私はできませんでした。

今書き込みしているパソコン、米国購入で、初期はVISTAのベーシック英語版で、デュアルブートで日本語版のホームプレミアムにしてあります。英語のベーシック版も、日本語のソフトもアプリもほとんど使えるのですが、文字化けが激しい、起動してから、表示がときどき日本語に戻る程度の不安定な状態ですが、十分に日本語で使えます。

逆に日本語版のホームプレミアムに英語版のアプリを入れると、文字化けが激しく、フランス語やどこの言語か不明の状態になるので、割り切って、日本語のソフトは日本語版の方にインストール、英語版は英語のほうにインストールしています。特にオフィス、これは、パーソナルだと、インストールした言語の方をメインにされてしまうみたいで、英語のベーシック版にインストールすると英語起動で初期が英語になってしましました。使いにくいので、英語版はアンインストールし、日本語版のホームプレミアムの方だけライセンス認証して使うようにしています。

アルティメットではパーソナル版を使っていないのでどうなるか試していませんが、オフィスは、日本語版には日本語、英語版には英語をインストールしないと、動作も異常が起こりそうです。

ちなみに、私は試さないのですが、アップグレード版の日本語版ビスタホームプレミアムなどを購入し、英語のベーシック版からアップグレードしても、ちゃんと日本語版としてインストールできるそうです。その場合には、英語のベーシック版は使えなくなりますので、両方使い分けたかったら、通常版を購入することになります。

Vistaと、XPでは若干違います。

特にXPのプロの多言語対応版のOSを購入したのなら、かなり日本語化できます。といっても、スタートメニューが起動時は英語、切り替えると日本語になったり英語に戻ったりだったと思います。コントロールパネルは英語のままで、アイコンそのものを自分で変更すると、日本語表示にまで変えることができますが、自分が名前を日本語で入力しなおしたもの、あるいは、日本語のアイコンを移植したものだけです。

日本語版、これを英語に切り替えるのも同様です。起動時は日本語にな...続きを読む

Qコード上でコントロール配置

いつもお世話になっております。
コード上でコントロールを配置したいのですが、うまくいきません。

Dim location As New Point(100, 100)
Dim button As Button

button = New Button
button.Height = 50
button.Weight = 50
button.Location = location
button.Visible = True

何が足りないのか・・教えていただきたいです。。

Aベストアンサー

ボタンを配置する先が不明なので、表示されないのでしょう。

Me.Controls.Add(button)

##Weight->Widthの間違い?

ただし、これでボタンが配置できたとしても、イベントの処理
は行えませんよ。

Q言語を英語表記にしたいのですが・・・

ビスタを購入した外国の友人より相談をうけました。

メニュー画面などを英語表記にしたいのですが、
コントロールパネルの言語のオプションで英語を
選んでも上手くいきません。

メニューなど全般を英語にすることはできないのでしょうか?

Aベストアンサー

EnterpriseとUltimateエディションのみ、MUIに対応しています。

http://trendy.nikkeibp.co.jp/article/col/20070409/121526/
http://www.atmarkit.co.jp/fwin2k/win2ktips/1090langpk/langpk.html

QVBのコントロール配列を二次元配列にする方法

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

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

Aベストアンサー

コントロールの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を示すので、注意が必要です。

コントロールのIndexプロパティを利用する方法では二次元配列はできません。
しかし、変数としての二次元配列ならできます。

Dim TextBoxes(3, 10) As TextBox

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

以下に例を示します。

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

Option Explicit

Private TextBoxes(3, 10) As TextBox

...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング