- PR -

ソースのコンバートで困ってます。

1
投稿者投稿内容
Earth
会議室デビュー日: 2002/06/11
投稿数: 14
投稿日時: 2002-06-14 16:17
非常に、レベルの低い話かもしれませんが・・・
下記のコードをVBでのコードでしりたいのですがわかりません。
どなたか、教えてください。
****************************************************************
ボタンがクリックされたときに実行されるコード

1: private void button1_Click(object sender, System.EventArgs e)
2: {
3: ICD icd = new ICD();
4: WORD[] words = icd.SearchWord(textBox1.Text, false);
5: ITEM item = icd.GetItemById(words[0].id);
6: textBox2.Text = item.meaning;
7: }
*****************************************************************

以上です。よろしくおねがいします。
biac
大ベテラン
会議室デビュー日: 2001/10/22
投稿数: 106
投稿日時: 2002-06-14 17:15
Insider.NET 特集 NetDictionary で始める Web サービス・プログラミング / 9.イベント・ハンドラを記述する で、各行ごとについて詳しく解説されていますよね?
VB.NET でどう書くかは、それで分るはずですが。 (VB.NET でコードを書ける人なら)

それ以前の、Web 参照やネームスペースの指定の追加は、出来ているんですか?
Earth
会議室デビュー日: 2002/06/11
投稿数: 14
投稿日時: 2002-06-14 17:29
Biacさんのおっしゃるとおり、わかるはずなのですが・・・

>4: WORD[] words = icd.SearchWord(textBox1.Text, false);
このコードだけは、VB.NET でコードを書けません。
(おしえてください。)

それ以外の、Web 参照やネームスペースの指定の追加はできています。

以上です。ご指摘ありがとうございます。
biac
大ベテラン
会議室デビュー日: 2001/10/22
投稿数: 106
投稿日時: 2002-06-14 18:20
引用:
>4: WORD[] words = icd.SearchWord(textBox1.Text, false);
このコードだけは、VB.NET でコードを書けません。


そのまま VB.NET に貼り付けると、「'WORD' は型であるため、式として使用することはできません。」というエラーになりますよね。 これは、
コード:
    Dim words As なんとか
    words = icd.SearchWord(textBox1.Text, false)

という形に直さねばならない、というのは分ると思います。 (3行目、5行目)
とりあえず、そのまま
コード:
    Dim words As WORD[]

とやってみると、] のところで、「識別子が必要です。」と怒られてしまいます。

C# では配列を表すのに () ではなくて [] を使うのも、お分かりですね? (5行目)
そこで、() に直してみます。
コード:
    Dim words As WORD()

これでコンパイルが通ります。

ただし、VB.NET では、配列の宣言は本来、
コード:
    Dim words() As WORD

と書くのでしたね。


なお、これはサンプルコードですから、処理を分りやすくするため、エラー処理が省いてあります。
4行目の SearchWord() で、検索がヒットしなかった場合は、words に Nothing が入ってくるので、5行目で例外で落ちます。 それを加味すると、最終的に次のようになるでしょう。

コード:
Private Sub Button1_Click( _
        ByVal sender As System.Object, _
        ByVal e As System.EventArgs) _
        Handles Button1.Click
    Dim icd As ICD = New ICD()
    Dim words() As WORD = icd.SearchWord(TextBox1.Text, False)
    If Not (words Is Nothing) Then
        Dim item As ITEM = icd.GetItemById(words(0).id)
        TextBox2.Text = item.meaning
    Else
        TextBox2.Text = "(該当無し)"
    End If
End Sub

Earth
会議室デビュー日: 2002/06/11
投稿数: 14
投稿日時: 2002-06-17 09:18
回答をありがとうございます。ただこの回答のコード記述は実際にbiacさんの解説して
いただいたとおりの理解をしてまして、テストした結果、下記のエラーが発生してしま
います。

--------------------------------------------------------------------------
コード全文
--------------------------------------------------------------------------
1: Dim icd As ICD = New ICD()
2: Dim words() As WORD = icd.SearchWord(TextBox1.Text, False)
3: If Not (words Is Nothing) Then
4: Dim item As ITEM = icd.GetItemById(words(0).id)
5: TextBox2.Text = item.meaning
6: Else
7: TextBox2.Text = "(該当無し)"
8: End If
--------------------------------------------------------------------------
2: Dim words() As WORD = icd.SearchWord(TextBox1.Text, False)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--------------------------------------------------------------------------
'Dic_Icd.net.iwebmethod.www.WORD' は 'Dic_Icd.WORD' から派生していないため、型 'Dic_Icd.net.iwebmethod.www.WORD の 1 次元配列' の値を 'Dic_Icd.WORD の
1 次元配列' に変換できません。
--------------------------------------------------------------------------
4: Dim item As ITEM = icd.GetItemById(words(0).id)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--------------------------------------------------------------------------
型 'Dic_Icd.net.iwebmethod.www.ITEM' の値を 'Dic_Icd.ITEM' に変換できません。
--------------------------------------------------------------------------

そのため、これ以上、どう記述して良いかわからなかったので相談いたしました。
(最初にここまではやったということを明記するべきでした。すみません。)
なので、解決策がありましたらお願いします。

以上
biac
大ベテラン
会議室デビュー日: 2001/10/22
投稿数: 106
投稿日時: 2002-06-17 13:55
引用:

'Dic_Icd.net.iwebmethod.www.WORD' は 'Dic_Icd.WORD' から派生していないため、型 'Dic_Icd.net.iwebmethod.www.WORD の 1 次元配列' の値を 'Dic_Icd.WORD の
1 次元配列' に変換できません。



あなたは、↓こう書いておられますが…
引用:

Earthさんの書き込み (2002-06-14 17:29) より:
それ以外の、Web 参照やネームスペースの指定の追加はできています。


…じつは、そこが出来ていなかった、ということです。

ソースのコンバート方法の問題ではないことが、はっきりしましたね。
「ソースのコンバートで困ってます。」という件名は不適切ですので、あらためてスレッドを起こしてください。
NothingBut.NETFX
大ベテラン
会議室デビュー日: 2001/09/13
投稿数: 102
投稿日時: 2002-06-17 14:42
引用:

Earthさんの書き込み (2002-06-17 09:18) より:
--------------------------------------------------------------------------
'Dic_Icd.net.iwebmethod.www.WORD' は 'Dic_Icd.WORD' から派生していないため、型 'Dic_Icd.net.iwebmethod.www.WORD の 1 次元配列' の値を 'Dic_Icd.WORD の1次元配列' に変換できません。


型 'Dic_Icd.net.iwebmethod.www.ITEM' の値を 'Dic_Icd.ITEM' に変換できません。
--------------------------------------------------------------------------


Web参照した後に、Web参照の結果できあがったプロキシクラスのファイル(Visual Studio .NETではReference.vb)から、WORDやITEMのClass宣言をコピーしてどこかに貼り付けたりしていませんか?

このエラーは、本来Web参照の結果できているので自分で作る必要のないWORDクラスやITEMクラスを自分で作ってしまっている場合に発生します。プロジェクト内の全部のソースコードをもう一度見直して、Public Class WORDやPublic Class ITEMが2つ以上定義されていないかどうかチェックしてみてください。
Earth
会議室デビュー日: 2002/06/11
投稿数: 14
投稿日時: 2002-06-17 16:15
> Web参照した後に、Web参照の結果できあがったプロキシクラスのファイル
> (Visual Studio .NETではReference.vb)から、WORDやITEMのClass宣言を
> コピーしてどこかに貼り付けたりしていませんか?

ご指摘の通り、貼り付けていました(>_<)。
削除した結果、正常に処理が行えました(^o^)。

結果的には蛇足があったため、処理がうまくいかず、無駄な時間を費やして
しまいました。

NothingBut.NETFX
・的確な指摘をありがとうございました。
・どうして、私のミスしてるであろう部分をズバっとみぬいたのでしょうか・・・経験や
 知識の賜物でしょうね。

biacさんへ
・何度も回答をいただきありがとうございました。
・最初からもっと詳細な状況のスレッドを載せれていればお手数かけずにすんだのですが
 今後は気をつけたいと思います。

以上、今後も私のスレッドに対してアドバイスをしていただけると幸いです。


1

スキルアップ/キャリアアップ(JOB@IT)