OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

コントロールが配列かどうかを知るには?

  • 困ってます
  • 質問No.113895
  • 閲覧数311
  • ありがとう数8
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 95% (66/69)

Visual Basic6.0(SP5)で伺いたいことがあります。

フォーム上の全てのオブジェクトを For Each文で取得しています。以下の様にです。

Dim Control As Object

For Each Control In Form1.Controls
If TypeOf Control Is Text Then
End If
Next Control

このとき個々のControlがコントロール配列かどうかを知りたいのですが、どうすればよろしいでしょうか?フォーム上にはコントロール配列のオブジェクトも、コントロール配列ではないオブジェクトもあります。

Control.Indexの値を参照しようとしても、コントロール配列でない場合は
「配列ではないオブジェクトです」とエラーになります。
IsArray関数でもFalseになってしまいます。

何を行いたいかというと、そのControlがコントロール配列(Text1(0)とかText1(1)とか)かどうかを調べて、そのIndexをある関数の引数にしたいのです。全てコントロール配列だったら、Control.Indexで値を取得できるのですが。

よろしくお願いします。
通報する
  • 回答数4
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.4
レベル9

ベストアンサー率 21% (13/60)

新しいアルゴリズムを思いつきました。
コントロール配列って、たしか、同じ名前を共有しますよね。

だから、For Each ・・の中で、Control.Name を参照して、同じ名前が 2>= 出てきたら・・・と言うのは、いかがですか?
お礼コメント
Magoichi

お礼率 95% (66/69)

Masato_aさん、再度のご回答どうもありがとうございます。
なるほど!全てのオブジェクトの数だけ配列を用意してカウントする方法ですね。For Each文でオブジェクトを取得した場合、コントロール配列は必ずしも連続して取得できないので単純なコントロールブレイクではだめそうですが、全てのオブジェクトに対してカウントすれば確かによさそうですね。早速試してみます。

処理スピードとメンテナンスの方法等から総合的に判断して、こちらの方法をとるか、On Errorでの処理を取るか、一つ一つ場合分けするかを検討します。

どうもご回答ありがとうございました。
投稿日時 - 2001-08-05 22:07:27
-PR-
-PR-

その他の回答 (全3件)

  • 回答No.1
レベル9

ベストアンサー率 21% (13/60)

無理やりインデックスを参照して見て、Err.Numberを使って判定するのって、嫌いですか? ...続きを読む
無理やりインデックスを参照して見て、Err.Numberを使って判定するのって、嫌いですか?
お礼コメント
Magoichi

お礼率 95% (66/69)

Masato_aさん、ご回答どうもありがとうございます。

そうですね。なるべくなら On Error文を使いたくないんですよ。On Errorで飛ばして、そこでErr.Numberで判断するのは、処理的には変わらないのですが、気の持ちようというか、他にスマートな方法がないかなーって思ってしまいます。

フォームにオブジェクトがたくさんあるので、場合分けするのも大変なんですが、どうしようもなくなったら、On Errorか、一つ一つ聞いていくかにすると思います。

ご回答どうもありがとうございました。
投稿日時 - 2001-08-04 22:26:37
  • 回答No.2
レベル13

ベストアンサー率 68% (791/1163)

普通に調べてエラーが起きたら何もしないのは? 下記ではコントロール配列だけ<Debug.Print myCtrl.Name>に入っています。 <Err.Clear: On Error GoTo 0>とかはこんな使い方でした?年かな?だいぶ忘れてきました。 Private Sub Form_Load()   Dim myCtrl As Control   Dim CtrlFlg As ...続きを読む
普通に調べてエラーが起きたら何もしないのは?
下記ではコントロール配列だけ<Debug.Print myCtrl.Name>に入っています。

<Err.Clear: On Error GoTo 0>とかはこんな使い方でした?年かな?だいぶ忘れてきました。


Private Sub Form_Load()
  Dim myCtrl As Control
  Dim CtrlFlg As Boolean

  On Error GoTo ErrorHandler
  For Each myCtrl In Form1.Controls
    CtrlFlg = (myCtrl.Index >= 0)
    If CtrlFlg = True Then
      Debug.Print myCtrl.Name
    End If
  Next

  Err.Clear: On Error GoTo 0
  Exit Sub

ErrorHandler:
  CtrlFlg = False
  Resume Next
End Sub
お礼コメント
Magoichi

お礼率 95% (66/69)

nishi6さん、どうもご回答ありがとうございます。

Masato_aさんのお礼にもお答えいたしましたが、On Error文で処理するのは最終手段にしようと思います。

なぜコントロールを使用すると、コントロール配列はIsArray関数で識別できないのでしょうかね?もちろんVarType 関数でもvbArrayは返しませんでした。

それと質問なのですが、
>  Err.Clear: On Error GoTo 0
の後半部分の On Error GoTo 0 とはどのような処理なのでしょうか?
たった今確認しましたところ、うまく動きましたが、GoTo 0の行き先がわかりません。再びご回答を賜りたく存じます。

ご回答どうもありがとうございました。
投稿日時 - 2001-08-04 22:38:28
  • 回答No.3
レベル13

ベストアンサー率 68% (791/1163)

ANo.#1に >そうですね。なるべくなら On Error文を使いたくないんですよ。・・・ とありましたので、難しいことは分かりませんが tag にコントロール配列だという印(しるし)をつけたらどうですかね。スマートかどうかは判断しかねますが簡明にはなります。 On Error GoTo 0 ですが、エラー判定するべき箇所が終わったのでエラー処理ルーチンを無効にする意味で書きました。この後、ど ...続きを読む
ANo.#1に
>そうですね。なるべくなら On Error文を使いたくないんですよ。・・・
とありましたので、難しいことは分かりませんが tag にコントロール配列だという印(しるし)をつけたらどうですかね。スマートかどうかは判断しかねますが簡明にはなります。

On Error GoTo 0 ですが、エラー判定するべき箇所が終わったのでエラー処理ルーチンを無効にする意味で書きました。この後、どのような処理を書くかわかりませんので。エラー判定をずっと引きずりたくない意味です。書き方としては個人的な癖かもしれません。現プロシージャは終わってしまうので不要?でしょうか。
お礼コメント
Magoichi

お礼率 95% (66/69)

nishi6さん、早々のレスポンスありがとうございます。

実は最初tagに目印をつけようかと思ったのですが、既にtagは他の目的に使っていまして、桁を増やしたりしたくはないなと考えておりました。ちょっと修正箇所が多くなりそうなので。

あの・・・、「スマート」とは言葉が悪く、良識を疑われても仕様がない表現でした。謹んでお詫び申し上げます。もちろんMasato_aさんやnishi6さんの方法を悪く言うつもりはありませんでした。どうぞお気を悪くなさらないでください。

On Error GoTo 0 の使い方は存じませんでした。ありがとうございます。

矢張り、Controlで取得した場合、IsArray関数で配列とみなされないのは仕様なんですかね。

再度のご回答どうもありがとうございました。
投稿日時 - 2001-08-04 23:09:18
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ