VB6からVB2008へのフォームオブジェクトのコントロール

このQ&Aのポイント
  • VB6で書かれたコードをVB2008で置き換える際に、クラス 'System.Windows.Forms.Form' の既定のプロパティがないため、インデックス処理を実行できませんというエラーが発生します。
  • VB6でのコーディングでは、引数に応じて適切なフォームのオブジェクトを選択し、そのフォームオブジェクトのラベルに文字列を代入して表示します。
  • VB2008では、フォームに対してはインデックス処理ができないため、ダイアログ選択に応じて選択したフォームオブジェクトのラベルに文字列を代入する方法を利用する必要があります。
回答を見る
  • ベストアンサー

フォームオブジェクトのコントロール

あるプログラムを解析していたところ、引数に応じて違うフォームのラベルに文字列を代入し・表示するというVB6で書かれた下のコードがありました。 これをVB2008で置き換えてみようと思ったのですが、 ***クラス 'System.Windows.Forms.Form' には既定のプロパティがないため、インデックス処理を実行できません。*** というエラーが帰ってきてしまいます。どのように書き換えればよろしいのでしょうか?? [VB6] Public Sub MsgBoxE(BType As Integer, MsgH As String, MsgM As String, MsgL As String) Dim DForm As Form Set DForm = Nothing 'ダイアログ選択 Select Case BType Case 0 Set DForm = DialogC Case 1 Set DForm = DialogB Case 2 Set DForm = DialogC End Select On Error Resume Next 'メッセージセット DForm!Label1.Caption = MsgH DForm!Label2.Caption = MsgM DForm!Label3.Caption = MsgL DForm.Show

  • tyosu
  • お礼率29% (7/24)

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

  • ベストアンサー
  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.2

エラー 1 'Label1' は 'System.Windows.Forms.Form' のメンバではありません。 まず先に、上記のエラーはこのソース以外の部分に起因していますから、提示することはできません。 エラーの内容ですが、 変数などの宣言に'Label1'という型が使用されていることを意味しています。 簡単に言うと Dim strA As String 上記のように記述すべきところが、 Dim strA As String1 のように記述されているために発生します。 String1という型は存在しないためにエラーになります。 解決の仕方 1.エラーダイアログのエラー項目をダブルクリックすると該当行に飛びますので、ソースを修正する。 2.Label1を検索し、文法のおかしい行を検出する。 などで対応できると思います。

tyosu
質問者

お礼

AKARI0418様 返信ありがとうございます。 返信していただいた方法で解決しようとしましたが、文法ミスらしきところが見当たりませんでした @w@;; 悩んだ挙句、「Label1~3」はDForm内コントロールなのだから、コントロール配列のように DForm.Controls("***").text = チョメチョメ でいけるのでは!?っと閃き実行したところ、他の箇所でエラーを起こすことなく何とかなりました。 貴重なお時間とアドバイスの程ありがとうございました。これからもよろしくお願いいたします。

その他の回答 (1)

  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.1

Dim DForm As Form = Nothing '.NETはSET文は使用しません 'Set DForm = Nothing 'ダイアログ選択 Select Case BType Case 0 'Set DForm = DialogC DForm = New DialogC Case 1 'Set DForm = DialogB DForm = New DialogB Case 2 'Set DForm = DialogC DForm = New DialogC End Select 'Try Catch構文のほうがエラーハンドリングしやすいです。 On Error Resume Next 'メッセージセット '.NETからLabelのCaptionプロパティはTextという名称に変更されました。 DForm.Label1.Text = MsgH DForm.Label2.Text = MsgM DForm.Label3.Text = MsgL 'DForm!Label1.Caption = MsgH 'DForm!Label2.Caption = MsgM 'DForm!Label3.Caption = MsgL DForm.Show

tyosu
質問者

お礼

回答ありがとうございます。 早速やってみたところ構文エラーは回避できたのですが、今度は エラー 1 'Label1' は 'System.Windows.Forms.Form' のメンバではありません。 というエラーが戻ってきました。 各フォーム上にあるLabel1~3の参照範囲レベルはpublicにしてありますががどうすればよろしいでしょうか? よろしければ追加でお願いいたします

関連するQ&A

  • 変数にフォームからの入力値は入るのですが。

    変数にフォームからの入力値は入るのですが。 VBA初心者です。下記コードを書きました。 フォームからの入力値をレポート印刷しようとしています。 MSGBOXで内容を参照したところ、変数の内容は入っています。 入っているのですが、レポート上、項目が#Errorになってしまいます。 どこが悪いのでしょうか?。 お分かりになる方でおみえならご教授下さい。 Option Explicit '共通変数の宣言 Dim stdocname As String Dim repo As Report Dim delt As String Dim kmsg As String        :        :        : Private Sub 印刷_Click() On Error GoTo Err_印刷_Click '*** 変数の宣言 Dim tuki As String Dim mais As Integer Dim denp As Integer Dim busu As Integer Dim joge As String Dim kmsg As String '*** 変数に入力値をセット mais = 0 delt = Forms!メイン画面![リストDELTUKI] joge = Forms!メイン画面![リストJYOGEDAN] tuki = Forms!メイン画面![リストTUKI] denp = Forms!メイン画面![テキストSBAN] busu = Forms!メイン画面![テキストEBAN] '*** 消し月と印刷月重複不可チェック If delt = tuki Then GoTo Err_印刷月_Click End If '*** 上段・下段使用と対象月から使用レポートを判定 Select Case joge & tuki Case "上段" & "1" stdocname = "レポート01上" Case "上段" & "2" stdocname = "レポート02上" Case "上段" & "3" stdocname = "レポート03上"        :        :        : Case "下段" & "10" stdocname = "レポート10下" Case "下段" & "11" stdocname = "レポート11下" Case "下段" & "12" stdocname = "レポート12下" Case Else stdocname = "レポート原稿" End Select kmsg = MsgBox(joge & tuki & stdocname)

  • モジュール→コントロールの操作

    VB6で作られたプログラムをVB2008の言語に直しているのですが、あるモジュールから任意のフォーム(Dfrom)上にあるコントロール(Label1)を操作するプログラム?があります [VB6] Dim DForm as form Dform = TextBox1.text DForm!Label1.Caption = Msg これをVB2008で再現しようと思ったのですが、良い方法が見つかりません。 MsgをPublic変数で定義して、フォーム側からLabel1.Caption = Msgとすれば楽にいけるのですが、できるだけ元の形に近い組み方で記述したいので、良い方法をお持ちの方はご享受ください

  • Mid関数

    VB6.0とVB.NETのMid関数についてなんですが、例えば.NETで次のように書く時、 Label2.text = "abcdefg" Private Sub Form1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress If Mid(Label2.Text, z, 1) = e.KeyChar Then   Mid(Label2.Text, z, 1) = " " End if と.NETでは書けるのですが、VB6.0では、まずKeyPressの()の中が違うし、Midの()の中の「Label.Text」を「Label2.Caption」と書くと 「.Caption」のところで「変数が必要です」とエラーが出てしまいます。 これはどういうことなのか、教えてください。

  • Mid関数(2)

    VB6.0でタイピングソフトを作成しています。KeyPressの入力判定で、入力された文字とLabel1に表示されている文字が一緒なら、その文字を消すという処理なんですが、 Private Sub Form_KeyPress(KeyAscii As Integer) Label1.Caption = "taipingu" If Mid(Label1.Caption, z, 1) = Chr(KeyAscii) Then Dim ss As String ss = Label1.Caption Mid(ss, z, 1) = " " Label1.Caption = ss z = z + 1 End if というやり方を教えていただいてやってみたのですが、 「If Mid(Label1.Caption, z, 1) = Chr(KeyAscii) Then」の部分で 「プロシージャの呼び出し、または引数が不正です」 というエラーが出てしまいます。しかも、このエラーが出ずに実行がうまくいくときもあります。 何故このエラーが出るのか、分かる方お願いします。

  • オブジェクト名を変数で参照できますか

    VB初心者です。 配列の場合 Dim str(10) as string と宣言し、i番目のデータを取り出したいときには、str(i) と記述すると思います。 そこで質問ですが、例えばCommandが1~10まであるとします。 オブジェクト名はそのまま(Command1, Command2)で、それぞれのCaptionに違ったデータが入っています。 (例えば、Command1のCaptionには'A' Command2のCaptionには'B'といった感じに) ある文字列があり、For文を使い、CommandのCaptionとその文字列が一致したときに文字列を出力するという処理を行いたいとき、どのように Command1~10のCaptionを回せばいいのでしょうか? コードを記述しておきます。 Dim str(10) as String Dim i as Integer Dim j as Integer for i = 0 to 10 for j = 0 to 10 ☆☆ if Command(i).Caption = str(j) then print.str(j) end if next next ☆☆のところです。 可能であれば回答をお待ちしております。 環境は windows XP, VB6.0 です。

  • エクセルのVBユーザーフォームがうまく組めません

    会社でエクセルを使ってデータをまとめているのですがVBのユーザーフォームで作ろうとしています。今困っていることはoptionbuttonを4個使い選択式にし選択したら「OK」buttonを押すことで各optionbuttonに対応したsheetへ飛ぶようにしたいのですがうまくいきません。 現状ですが Private Sub CommandButton1_Click() dim str as string str=optionbutton1.caption select case str case "****" sheets("1234").select ・    ・    ・ end select End Sub としています。 間違いがありましたら指摘してください。 ちなみに3日前に始めてVBを教えてもらいました。

  • [VB6]文字列でオブジェクトを指定する方法

    VB6でiniファイルからリードしたフォーム名を元に そのフォームをロードしたいのですが、出来ますでしょうか? 以下のソースで★ところのコメントがしたいのです。 '--------------- Type HogeType testform as Form caption as String End Type Dim FormTest(2) as HogeType Private Sub SetFormData() Set FormTest(0).testform = Form1 '★←ここを"Form1"とか文字列が格納された変数としたい。 FormTest(0).caption = "test1" End Sub Private Sub Main() FormTest(0).Show End Sub 以上、宜しくお願い致します。

  • ACCESSでフォーム上のオブジェクトが引数に渡らない

    環境:XP&ACCESS2003 メインフォーム(下記A)に得意先名、全体の金額、消費税等、サブフォームに売上明細(工種番号、工種、数量、単価、金額) を持っています。 明細テーブルは、工種番号1~8、工種1~8、数量1~8、単価1~8、金額1~8までの フィールドを持っています。 マクロで、工種番号が変わった場合、数量が変わった場合、それぞれ金額を計算させていました。 マクロをVBに変換したところ、以下のようになります。(工種番号1_AfterUpdateの場合) With CodeContextObject DoCmd.RepaintObject acForm, "A" .Form.工種1 = DLookup("[工種]", "測量台帳", "Forms![A]![年度]=[年度] And Form.[工種番号1]=[工種番号] AND [Forms]![A]![ブロック]=[ブロック]") .Form.単価1 = DLookup("[単価]", "測量台帳", "Forms![A]![年度]=[年度] And Form.[工種番号1]=[工種番号] AND [Forms]![A]![ブロック]=[ブロック]") .Form.数量1 = 1 .Form.金額1 = Int(Form.単価5 * Val(Form.数量1)) [Forms]![A]![測量委託費] = [計] [Forms]![A]![消費税相当額] = IntA([計] * Val([Forms]![A]![消費税率] / 100)) End With Private Functionを作り、サブフォーム上のオブジェクトを数量1~8までが変更された時に、引数で渡してやり シンプルな作りにしようと以下の様に作成しましたが金額(=引数のkingaku)がうまく変わりません。 ご存知の方、よろしくお願いします。 -------------------------------同一フォーム上のPrivate Function Private Function suuryoukeisan(kousyubangou As String, suuryou As String, tanka As String, kingaku As String, _ F_suuryou, F_tanka, F_kingaku) With CodeContextObject DoCmd.RepaintObject acForm, "A" F_kingaku = IntA(Val(F_tanka) * Val(F_suuryou)) kingaku = F_kingaku [Forms]![A]![測量委託費] = 計 [Forms]![A]![消費税相当額] = Int(計 * Val([Forms]![A]![消費税率] / 100)) End With End Function ----------------------------数量1が変わった場合の処理 Private Sub 数量1_AfterUpdate() Call suuryoukeisan("工種番号1", "数量1", "単価1", "金額1", 数量1, 単価1, 金額1) End Sub ---------------------------

  • VBで動的に作成したパネルの上にラベルを乗せるには?

    VB6にてプログラムで動的に作成したフレーム(Frame)の上に、動的に作成したラベル(Label)を乗せることが出来ません。 どうすれば、ラベルをフレームの上に乗せることが出来るようになるでしょうか? どなたか分かる方がいらっしゃいましたら、ご教授願います。 なお、フレームとラベルの作成は以下のようなやり方で行っています。 ' Form1 : 表示フォーム Private lbl As New LabelClass ' ラベル作成クラス Private frm As New FrameClass ' フレーム作成クラス Private Sub Form_Load() Call lbl.LabelMake(Form1, "lbl1") With lbl.makelbl .Caption = "テストラベル" .AutoSize = True .Top = 500 .Left = 500 .Visible = True End With Call frm.FrameMake(Form1, "frm1") With frm.makefrm .Caption = "テストフレーム" .Width = 2000 .Height = 2000 .Visible = True End With End Sub ' LabelClass : ラベル作成クラス Public WithEvents makelbl As Label Public Sub LabelMake(form As Object, name As String) Set makelbl = form.Controls.Add("VB.Label", name) End Sub ' FrameClass : フレーム作成クラス Public WithEvents makefrm As Frame Public Sub FrameMake(form As Object, name As String) Set makefrm = form.Controls.Add("VB.Frame", name) End Sub ※nameはオブジェクト名です

  • ExcelVBAのイメージコントロールについて

    こんにちは。Excel2000を使用している初心者です。 フォーム上には以下のものがあります。 Image1 Label1、Label2、Label3、Label4 CommandButton1 ・CommandButton1を押すとImage1に画像Aをロードして、次に押すと消すという動作をさせます。 ・Image1の上をマウスが動くと座標をLabel1(x)、2(y)に常に表示させます。 ・Image1をクリックするとそのときの座標をLabel3(x)、4(y)に表示させたままにします。 コードは以下の通りです。 Dim Flg As Boolean Flg = False Private Sub CommandButton1_Click() If Flg = False then Me.Image1.Picture = LoadPicture ("C:\A.jpg") Flg = True Else Me.Image1.Picture = LoadPicture ("") Flg = False End If End Sub Private Sub Image1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer,_ ByVal X As Single, ByVal Y As Single) Me.Label1.Caption = X Me.Label2.Caption = Y End Sub Private Sub Image1_Click() Me.Label3.Caption = Me.Label1.Caption Me.Label4.Caption = Me.Label2.Caption End Sub ・・・という記述なんですが、まず画像を表示させて、次にイメージをクリックしてLabel3、4に座標を表示させた後、CommandButton1を押してもイベントを受け付けてくれません。 イメージをクリックさえしなければ、画像の表示/非表示の切り替えはできます。 何が間違っている(足りない?)のでしょうか? よろしくお願いします。