visualbasic6.0を2008で

タグの編集
投稿者 Colo  (高校生) 投稿日時 2010/5/22 19:49:50
このサイトの英単語を学習するプログラムはvisualbasic6.0なんですがそれを2008ですることってできないんですか?

最終的にはこのサイトがしてるようなランダムでできる完成形にしたいんですが。

この箇所をこういう風にすればできるというのをおしえてください。(もしできるのであれば)
投稿者 葉月  (社会人) 投稿日時 2010/5/22 20:36:44
こんばんは。

>>>このサイトの英単語を学習するプログラムはvisualbasic6.0
意味がわかりません。
VB中学校で使われているサンプルや提供プログラムなのでしょうか?
それとも、全く別のサイトで作られたプログラムですか?

そのプログラムを関連URLなどに紹介してください。
投稿者 まだまだ  (高校生) 投稿日時 2010/5/22 21:33:35
http://homepage1.nifty.com/rucio/main/shokyu/jugyou15.htm
http://homepage1.nifty.com/rucio/main/shokyu/jugyou16.htm
この記事のことですよね。

直せると思いますよ。
文法が似ているので、大体はそのままで大丈夫ではないでしょうか。
ただ、ControlのEventの書き方は違うので修正が必要ですね。
たとえば、
VB6で
Private Sub cmdAnswer_Click()
のように書いてあるものは
Private Sub cmdAnswer_Click() Handles cmdAnswer.Click
のようにHandlesを追加しなければなりませんね。
又、ButtonはVB6ではコマンドボタンと呼ばれていますね。
投稿者 colo  (高校生) 投稿日時 2010/5/22 21:33:59
visual basic6.0の初級講座目次の第4章、15.16回にありますけど
投稿者 colo  (高校生) 投稿日時 2010/5/22 21:48:53
実際やってみました。まず前編の方をやってみたんですが「使いやすくする」のenterキーでコマンドボタンを押すっていうのとグラッフィックスメゾットを利用した◯×ができませんでした。
わかるかた教えてください
投稿者 まだまだ  (高校生) 投稿日時 2010/5/22 22:09:08
EnterKeyの処理は
    Private Sub TextBox1_KeyDown(ByVal sender As ObjectByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
        If e.KeyCode = Keys.Enter Then
            'ここに処理を書く 
        End If
    End Sub

の様にKeyCodeで取得できますね。

>グラッフィックスメゾットを利用した◯×ができませんでした。
これは具体的にどのような点がどのようにできなかったのでしょうか。

ちなみに、メゾットではなくメソッドです。
間違えやすいので注意してください。
投稿者 colo  (高校生) 投稿日時 2010/5/22 22:57:14
教えていただいてありがたいんですができませんね。

ByValが式が必要ですとなる
Keycodeがメンバでないとなります。

また、グラフィックに関してはプログラムのほとんどに波線が入ってできません。
投稿者 葉月  (社会人) 投稿日時 2010/5/22 23:27:27
MsgBox、Mid、ValなどVB6で使える一部の機能は、.NET以降でも使えます。
しかし、基本は全く別物です。
入門から順を追って学習し、
初級をクリアしてから目的のものを作るのをお勧めします。
初級をクリアした直後は、作れるものが限られているためです。
最後に絵を描くサンプルを載せます。
ボタンを一個張り付けて、以下のように描いてください。

>サンプル
Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click

        Dim pen As New Pen(Color.Red)

        Using g As Graphics = Me.CreateGraphics
            g.DrawRectangle(pen, 0, 10, 100, 100)
            g.DrawLine(pen, 0, 20, 200, 0)
        End Using
    End Sub
End Class
投稿者 colo  (高校生) 投稿日時 2010/5/23 00:00:09
まだまださんありがとうございます。

ここに処理を書くのところに処理(buttonを押すという内容)を書いてるんですがなかなかうまくいきません
投稿者 太郎冠者  (社会人) 投稿日時 2010/5/23 01:20:13
テキストボックスにフォーカスが当たっている状態で、Enterキーを押した時にボタン押下をシミュレートするサンプル
関連URLはMSDNのButton.PerformClick メソッドのページです

'Form1にボタン(Button1)とテキストボックス(TextBox1)を配置 
Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click
        MsgBox("ボタンが押されたね!")
    End SubButton

    Private Sub TextBox1_KeyDown(ByVal sender As ObjectByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
        If e.KeyCode = Keys.Enter Then
            Button1.PerformClick()
        End If
    End Sub
End Class


#わかりません、できません、うまくいきません、ではなく
#何が分からないのか、どううまくいかないのか書かないと
#中々、有用な回答は得られません
投稿者 colo  (高校生) 投稿日時 2010/5/23 02:18:20
enterについては出来ました。皆さんありがとうございました。

しかし、まだグラフィックの課題が残っています。
問題がわかりしだいまた質問させていただきます。
投稿者 colo  (高校生) 投稿日時 2010/5/23 14:56:42
なんとかグラッフィックスは自己解決しました。葉月さんの教えていただいたサンプルともう一度復習をして何とかできました。ありがとうございます
ただvisualbasic6.0ではClsメソッドで○や×を消してますが2008ではそれがうまくいきません。
なので解答して次の問題が出題されても○や×が残ってしまいます。

2008ではClsメソッドはどのようにすればいいのでしょうか?
投稿者 neptune  (社会人) 投稿日時 2010/5/23 15:17:20
掲示板復活してたんですね。

>2008ではClsメソッドはどのようにすればいいのでしょうか?
Graphics メンバのurl貼っておきます。そこのメソッドを少し探せば同じ機能があります。

葉月さんも書かれていますが、VB6とそれ以降は全く違う言語と思っても良いほど違います。
順を追ってやって行って、先ず、MSDNをよ~く眺める事をお勧めします。
投稿者 colo  (高校生) 投稿日時 2010/5/23 16:38:24
次に後編の方へ行ってみたんですが問題を分離させるところでまたできなくなりました。
問題集engのものは作成したんですがLoadProblemのところができません
まず、いろいろ試したんですがOpen Appが宣言されてないになる
For 有効な式の継続文字が必要ですとなる
#式が必要です となる

はじめからもっと詳しく勉強したいのはやまやまなんですが時間がないんです。とりあえずはこのプログラムを完了させなくてはなりません。その後しばらくしてからじっくりと勉強したいと思います。
言いたいことはわかるんですが順を追ってというのは今は無理なんです。自分勝手ですがよろしくお願いします。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2010/5/23 17:21:32
Coloさんとcoloさんは同一人物ですよね?

> 問題を分離させるところでまたできなくなりました。
ファイル入出力・グラフィックス・印刷の 3 機能は、利用頻度の割には
.NET 化に際して大きく変化してしまっている箇所なので、移植は厄介なところです。

> 時間がないんです。
いやいや。それにしては、短い時間で頑張っていると思いますよ。
グラフィクス処理も比較的短期間で解決できているようですし。

ファイル操作に関しては、System.IO 名前空間のクラスを使う事になります。
Visual Basic 初級講座の「第30回 ファイル処理」を読み進めてみて下さい。
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/index_sta.htm

また、今回は VB2008 とのことなので、My.Computer.FileSystem を使うのも手です。
http://msdn.microsoft.com/ja-jp/library/0b485hf7(VS.80).aspx

もしくは、VB6 互換命令となる FileOpen 関数を使う事もできます。
こちらは VB6 の構文に近い物となるので、(VB6 ユーザーであれば)単純な移植は容易になります。
ただし .NET らしからぬコードとなるため、後々の事を考えると、あまりお奨めはできません。
http://msdn.microsoft.com/ja-jp/library/afh37kh8(VS.80).aspx

> とりあえずはこのプログラムを完了させなくてはなりません。
時間が無いなら「Visual Basic 6 コードのアップグレード」の利用も検討してみてください。
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard40.htm
上記の『7.VB6コードのアップグレード』で紹介されているツールを使うと、
Open "C:\test.eng" For Input As #1
Input #1 , Datum
Close #1
というコードを、VB6互換命令を用いた
FileOpen(1, "C:\test.eng", OpenMode.Input)
Input(1, Datum)
FileClose(1)
へと変換してくれます。
http://msdn.microsoft.com/ja-jp/library/ab2372k4(VS.90).aspx


> 言いたいことはわかるんですが順を追ってというのは今は無理なんです。
VB6 → VB2008 への変換を行うには、VB6 のコードの意味を理解できるだけのスキルが必要です。

あるいはコード自体が読めなくても、コードに付随している日本語の説明を
VB2008 に置き換えられるだけの .NET の知識が要求されます。

もしもその両方が不足している段階なのであれば、VB6 の資料を参考にするのではなく、
最初から VB.NET 向けの資料を読まれる事をお奨めします。その方が習得が早いと思いますよ。
http://homepage1.nifty.com/rucio/commu/ThreadDetail_ThreadId_144.htm
投稿者 colo  (高校生) 投稿日時 2010/5/23 19:23:16
ありがとうございます。アップグレードで変換してみました。
しかし、ほとんどうまくいったんですが
Input #1 , Answer(K)が変換後
 Input(1, Answer(K))となりました。
しかし、実際に実行してみると、"EndOfStreamExceptionはハンドルされませんでした ファイルにこれ以上データがありません"となります。

原因はなんですか?
投稿者 葉流  (社会人) 投稿日時 2010/5/23 19:53:46
まっ、急がば回れという事ですね。
また、人に聞けば何でも答えてもらえる、あるいは、何でも解決するとは思わない方が..
ある種の人に対しては、一度ヒントを与えると、延々と与え続けないと済まなくなる、とも。
投稿者 祐士  (社会人) 投稿日時 2010/5/23 20:19:11
VBの勉強に近道はありません。
ひたすら愚直に基本を積み重ねるのみです。

分からないというのであれば、小学校レベルからやり直しましょう。
何故こんな作業が必要であるかと言う事を体得して下さい。

文章問題から式を立てる段階で躓いています。読解力が欠如して
いますので、この場合は、本を読むなどして、文字に触れる機会を増やしましょう。
これは一生の問題なので、今のうちに養っておきましょう。

逆にしてはいけない事を記載します。
解き方や問題文の丸覚えです。土台が弱いので。基礎固めをしっかりしましょう。

がんばろ!♪
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2010/5/23 20:19:33
> アップグレードで変換してみました。
余裕ができたら、そうした VB6 互換命令でのファイル入出力ではなく、
VB.NET 時代のファイル入出力操作も覚えて下さいね。


> ファイルにこれ以上データがありません"となります。
> 原因はなんですか?
原因は、「ファイルにそれ以上データが無いから」です。
恐らく、問題ファイルを用意していなかった(0バイトだった?)のでは無いでしょうか。

今回使用した Input は、ファイルからデータを読み込む命令です。

読み込むべきデータが残っていれば、そのデータを変数に取り込み、
現在の読み込み位置をその分移動させます。

しかし、その読み込み位置がファイル終端にまで到達していた場合、
それ以上読み取れるデータが無いため、今回のエラーとなります。
そのため、ファイルが終端まで到達していたかどうかを調べるために、
読み込み前に EOF 関数でチェックしておく必要があります。

なお http://homepage1.nifty.com/rucio/main/shokyu/jugyou16.htm で紹介されているサンプルでは、
Do
    'ファイル読み込み 
Loop Until EOF(1)
と書かれていましたが、ファイルの内容によっては、
Do Until EOF(1)
    'ファイル読み込み 
Loop
の方が良いでしょう。その理由はあえて書きませんけれども。
投稿者 colo  (高校生) 投稿日時 2010/5/23 21:35:51
人に聞けば何でも答えてもらえるわけではない-ごもっともな意見です

基礎から学ぶことは重要です私もはじめから学びたいんです。ですが前にも言ったとおり事情があるんです。

そんななか 魔界の仮面弁士さんご親切に教えていただき大変感謝です。
なんとか問題の読み込みに成功しました!!

しかしやっぱりClsの部分ができません。Graphicsのメンバなどを見てやってみたんですが、エラーにはならなかったようですが実行しても変化が起きません。なのでまだ問題に答えると次の問題のとき○や×が残ってしまいます
投稿者 葉月  (社会人) 投稿日時 2010/5/23 22:27:16
こんばんは。

>サンプル
' 前の私のサンプルに、ボタンを一つ追加して試してください。

[/CODE]
 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Using g As Graphics = Me.CreateGraphics
            g.Clear(SystemColors.Control)
        End Using
End Sub
[CODE]
投稿者 colo  (高校生) 投稿日時 2010/5/23 23:29:27
葉月さんありがとうございます。でもボタンを追加すると使い勝手が悪くなると思ったので考えて

  Private Sub TextBox1_KeyDown1(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
        If e.KeyCode = Keys.Back Then
            Using g As Graphics = Me.CreateGraphics
                g.Clear(Color.Aqua)
            End Using

        End If
    End Sub

としてBackSpeaceを押すと消えるようにしました。ちなみに背景はAquaです。SystemColors.Controlだと背景の色が抜けてしまいました。
そして無事○、×は消えるようになったんですが今度問題を解いてみるととりあえず今は3問しか作っていませんが問題1は正しい答えを入力するとちゃんと○になります。しかし2問目3問目は正しい答えを入れても×になります。問題ファイルも間違いはありません。
投稿者 葉月  (社会人) 投稿日時 2010/5/24 00:06:13
私のスタイルは応用することで、やり方に気付いてもらいたいので、
ズバリ答えのサンプルはあまり書かないです。
そういつつ、ズバリ書くときもありますが。

本題に入ります。
問題の答えの入力が、1問目から変わらなかったりしませんか?
どうしても見つからないようだったら、問題の部分を提示してください。
投稿者 colo  (高校生) 投稿日時 2010/5/24 00:18:50
問題はちゃんと出題されるんです。いろいろ試して見たんですが出題→解答→Enterキー→backspeaceここで次の問題に答えず一旦delキーを押してから次の問題に答えると解消されました。しかし面倒です。なにかいい方法はありますかね。もうなにが原因かこれに関してはさっぱりです。
投稿者 葉月  (社会人) 投稿日時 2010/5/24 00:53:10
関数で分けられているかわかりませんが、
出題する部分に問題があるとは考えていません。
先ほど伝えたかったのは――
答えを格納した部分に問題がないかチェックしてほしかったんです。

デバッグすればわかるとは思うんですが、
現段階では使うのは無理だと思います。
もし、見つからないようなら答えを格納した部分と、
答えを判断するコードを載せてください。
中途半端になるようなら全部記載してもらってもいいですが、
その場合は、変数にコメントを入れてください。

' 答えを格納 
Dim iAnser As Integer
投稿者 葉月  (社会人) 投稿日時 2010/5/24 00:55:48
補足します。

>答えを格納した部分に問題がないかチェックしてほしかったんです。
「2問目や3問目を答えた際に、1問目の答えが引き継がれている気がします」
と言い換えることができます。

投稿者 colo  (高校生) 投稿日時 2010/5/24 01:10:31
全部乗せます
Public Class Form1

    Dim Answer(100) As String
    Dim Question(100) As String
    Dim Qcount As Integer







    Private Sub SetProblem()

        QCount = QCount + 1

        Label1.Text = Question(Qcount)


    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        LoadProblem()  '問題を読み込む

        SetProblem() '最初の問題を出題する

        Label2.Text = "答えを入力してください"

        Label3.Text = "問題"

    End Sub
    Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
        If e.KeyCode = Keys.Enter Then
            Button1.PerformClick()
        End If

    End Sub

    Private Sub TextBox1_KeyDown1(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
        If e.KeyCode = Keys.Back Then
            Using g As Graphics = Me.CreateGraphics
                g.Clear(Color.Aqua)
            End Using

        End If
    End Sub




    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        If TextBox1.Text = Answer(Qcount) Then

            Dim p As New Pen(Color.Red)

            p.Width = 10


            Using g As Graphics = Me.CreateGraphics
                g.DrawEllipse(p, 70, 20, 230, 230)

            End Using
        Else
            Dim p1 As New Pen(Color.Blue)

            p1.Width = 10

            Using g As Graphics = Me.CreateGraphics
                g.DrawLine(p1, 0, 0, 389, 280)
                g.DrawLine(p1, 0, 260, 370, 0)

            End Using

        End If


        TextBox1.Text = " "

        SetProblem()   'ここで次の問題を呼び出している。
    End Sub


    Private Sub LoadProblem()


        Dim K As Short

        FileOpen(1, My.Application.Info.DirectoryPath & "\test.eng", OpenMode.Input)

        Do Until (EOF(1))
            K = K + 1

            Input(1, Question(K))

            Input(1, Answer(K))

        Loop

        FileClose(1)


    End Sub

End Class

でtest.engが
"入る"
"enter"
"を教育する"
"educate"
"勝つ"
"win"
となってます
投稿者 葉月  (社会人) 投稿日時 2010/5/24 02:03:10
初期化する際に、半角スペースが入っています。
答えを判断する際に、完全に一致させないといけないために起きています。
コメントと置き換えているところを見てください。
かなり突っ込みたい部分が結構ありますが、もう寝るので止めときます。
今はいいので、基礎を身につけ終わったら、再度作り直してください。

   Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click

        If TextBox1.Text = Answer(Qcount) Then

            Dim p As New Pen(Color.Red)

            p.Width = 10


            Using g As Graphics = Me.CreateGraphics
                g.DrawEllipse(p, 70, 20, 230, 230)

            End Using
        Else
            Dim p1 As New Pen(Color.Blue)

            p1.Width = 10

            Using g As Graphics = Me.CreateGraphics
                g.DrawLine(p1, 0, 0, 389, 280)
                g.DrawLine(p1, 0, 260, 370, 0)

            End Using

        End If


        'TextBox1.Text = " " 
        TextBox1.Text = String.Empty

        SetProblem()   'ここで次の問題を呼び出している。 
    End Sub
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2010/5/24 10:02:15
Graphics と同様、Pen も後始末が必要なオブジェクトです(作成したら解放処理が必要)。
そのため、

Dim p As New Pen(Color.Red)
p.Width = 10
Using g As Graphics = Me.CreateGraphics
    g.DrawEllipse(p, 70, 20, 230, 230)
End Using

ではなく、以下のように Using ブロックで囲む必要があります。

Using p As New Pen(Color.Red)
    p.Width = 10
    Using g As Graphics = Me.CreateGraphics
        g.DrawEllipse(p, 70, 20, 230, 230)
    End Using
End Using
投稿者 るきお  (社会人) 投稿日時 2010/5/24 12:55:04
>Graphics と同様、Pen も後始末が必要なオブジェクトです(作成したら解放処理が必要)。
その通りですが、重要でないプログラムの場合、
面倒なのと、インデントが好みでないので私は省略してしまっています。

今回も英単語の練習レベルであれば気にしなくても良いかと思います。
プログラムの勉強も兼ねているのであればつけておいてもいいでしょう。

これで、とりあえずVB2008でも動きます。

  
Public Class Form1

    Dim Answer As New List(Of String)
    Dim Question As New List(Of String)
    Dim Qcount As Integer

    Private Sub SetProblem()

        Qcount = Qcount + 1
        If Qcount > Question.Count Then
            MsgBox("問題が1周したのでシャッフルして再出題します。")
            Answer.Clear()
            Question.Clear()
            LoadProblem()  '問題を読み込む 
            Qcount = 1
        End If

        Label1.Text = Question(Qcount - 1)

    End Sub

    Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles MyBase.Load

        LoadProblem()  '問題を読み込む 
        SetProblem() '最初の問題を出題する 
        Label2.Text = "答えを入力してください"
        Label3.Text = "問題"

    End Sub
    Private Sub TextBox1_KeyDown(ByVal sender As ObjectByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
        If e.KeyCode = Keys.Enter Then
            Button1.PerformClick()
        End If

    End Sub

    Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click

        Dim g As Graphics = Me.CreateGraphics
        g.Clear(Color.Aqua)

        If TextBox1.Text = Answer(Qcount - 1) Then
            Dim p As New Pen(Color.Red)
            p.Width = 10
            g.DrawEllipse(p, 70, 20, 230, 230)
        Else
            Dim p1 As New Pen(Color.Blue)
            p1.Width = 10
            g.DrawLine(p1, 0, 0, 389, 280)
            g.DrawLine(p1, 0, 260, 370, 0)
        End If

        TextBox1.Clear()

        SetProblem()   'ここで次の問題を呼び出している。 
    End Sub

    Private Sub LoadProblem()

        Dim fileName As String = My.Application.Info.DirectoryPath & "\test.eng"
        Dim shiftJIS As System.Text.Encoding = System.Text.Encoding.GetEncoding("shift_jis")
        Dim lineNumber As Integer
        For Each line As String In IO.File.ReadAllLines(fileName, shiftJIS)
            If lineNumber Mod 2 = 0 Then
                Question.Add(line)
            Else
                Answer.Add(line)
            End If
            lineNumber += 1
        Next

        '順番のシャッフル(ランダム出題)←必要なければまるごとコメントに 

        Dim random As New Random
        For i As Integer = 0 To Question.Count - 1
            Dim temp As String
            Dim r As Integer
            r = random.Next(0, Question.Count)

            temp = Question(i)
            Question(i) = Question(r)
            Question(r) = temp

            temp = Answer(i)
            Answer(i) = Answer(r)
            Answer(r) = temp
        Next

    End Sub


End Class
投稿者 colo  (高校生) 投稿日時 2010/5/24 14:03:21
皆さんありがとうございます。だいぶ使い勝手が良くなってきました。

ここでわがままなんですが以下のことができるようにしたいです。
・不正解のときだけメッセージボックスで正答を教えてくれる
・るきおさんの教えていただいた案を一部使用したんですが再出題をはい、いいえで選択可能にする。
・良くあるソフトのようにメニューバーを追加して問題集ファイルを複数つくり選択できるようにしたい。
です。

どうかこの自分勝手な私に教えてください
投稿者 ん=ん  (その他) 投稿日時 2010/5/24 17:14:22
> ここでわがままなんですが以下のことができるようにしたいです。
> ・不正解のときだけメッセージボックスで正答を教えてくれる
> ・るきおさんの教えていただいた案を一部使用したんですが再出題をはい、いいえで選択可能にする。
> ・良くあるソフトのようにメニューバーを追加して問題集ファイルを複数つくり選択できるようにしたい。
> です。

> どうかこの自分勝手な私に教えてください 

えーと、正解だったら、メッセージボックスを飛ばせばいいのでは?
他も、終わった後に、確認をして、「はい」なら、シャッフルさせなければいいのでは?
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2010/5/24 18:26:43
>>>Graphics と同様、Pen も後始末が必要なオブジェクトです(作成したら解放処理が必要)。
>>その通りですが、重要でないプログラムの場合、
>>面倒なのと、インデントが好みでないので私は省略してしまっています。
省略する場合は、毎回イベントで生成しなおすのではなく、
フィールド変数に保持して使いまわした方が良いかも知れません。

# この手の解放処理が必要なのは、OpenFileDialog などでも同様ですが、こちらは
# フォームに貼って使えば、Form 終了時に Component として解放されるので、
# あまり問題にはなり難いですね。


> ここでわがままなんですが以下のことができるようにしたいです。
「やりたい事」は分かりました。それで、「分からない点」はどこでしょうか?

エラーが出ているなら、どのようなコードを書いていて、どの部分で問題が起きているのかを
教えて下さい。コードの書き方で悩んでいるなら、現状、どこまでできているのかを提示してください。
その方が、より具体的な回答がつきやすいですよ。


> 不正解のときだけメッセージボックスで正答を教えてくれる
・「正解」と「不正解」を判定する事はできていますか? If ステートメントで判定できるはずです。
・メッセージボックスの表示方法は分かりますか? MessageBox または MsgBox を使います。
・正答を取得する事はできていますか?

> 再出題をはい、いいえで選択可能にする。
・「はい」「いいえ」を表示させる事はできていますか?
・どちらが選択されたかを判定できていますか?
・再出題する部分は、どのように実装しようとされていますか?

> メニューバーを追加して問題集ファイルを複数つくり選択できるようにしたい。
・メニューバーの追加方法が分からないのでしょうか?
http://msdn.microsoft.com/ja-jp/library/cc720823.aspx
http://msdn.microsoft.com/ja-jp/events/dd282862.aspx
・ファイルを作る方法が分からないのでしょうか? 初級講座の第30回、31回を参照してみてください。
・複数のファイルを扱うところで問題がおきているのでしょうか?
・ファイルを選択させるところで躓いているのでしょうか? OpenFileDialog は試されましたか?
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard16.htm
http://homepage1.nifty.com/rucio/VBNyumon/BEGIN11_old.htm
http://homepage1.nifty.com/rucio/VBNyumon/BEGIN11.htm
投稿者 colo  (高校生) 投稿日時 2010/5/24 23:36:02
返答ありがとうございます。いくか自力でやりましたがあとはコードをどうするかがわからなかったりです。
まず
> 不正解のときだけメッセージボックスで正答を教えてくれるについて
正解を判定はできています。メッセージボックスの出し方もわかります。
しかし、メッセージボックスに間違えた問題の正答をどうやって出現させるががわかりません。
よくまだわかっていませんがとりあえずだめもとでMgsBox ("ここにコード" ) とか試してみたんですがコードがそのままでできます。なにか別の方法を使用するのでしょうか?

> 再出題をはい、いいえで選択可能にする。について
はい、いいえではなくはい、キャンセルのほうがいいかと思って変えました。
[はい][キャンセル]は表示できてます。
どちらが選択されたか判定するコードが良くわかりません。戻り値などを使うのでしょうか?希望としては[はい]を選択すると今までやってた問題をやり直す。[キャンセル]を選択したらまた問題を出さず今までの問題の最後が終了したところで止まってていいです。

> メニューバーを追加して問題集ファイルを複数つくり選択できるようにしたい。について
メニューバーは追加しました。定番の[ファイル]を作りました。中には[問題集を開く]、[終了する]をつくりました。
まず、[問題集を開く]について
今はるきおさんに教えていただいたようにランダムに出題させてます
  Private Sub LoadProblem()

        Dim fileName As String = My.Application.Info.DirectoryPath & "\test.eng"
        Dim shiftJIS As System.Text.Encoding = System.Text.Encoding.GetEncoding("shift_jis")
        Dim lineNumber As Integer
        For Each line As String In IO.File.ReadAllLines(fileName, shiftJIS)
            If lineNumber Mod 2 = 0 Then
                Question.Add(line)
            Else
                Answer.Add(line)
            End If
            lineNumber += 1
        Next

        '順番のシャッフル(ランダム出題)←必要なければまるごとコメントに 

        Dim random As New Random
        For i As Integer = 0 To Question.Count - 1
            Dim temp As String
            Dim r As Integer
            r = random.Next(0, Question.Count)

            temp = Question(i)
            Question(i) = Question(r)
            Question(r) = temp

            temp = Answer(i)
            Answer(i) = Answer(r)
            Answer(r) = temp
        Next

    End Sub

でもこれだとtest.engというひとつのファイルしか読み込めません
 OpenFileDialog は使ったことがなくコードがわかりません

[終了する]について
これもコードがわかりません

よろしくお願いします



投稿者 るきお  (社会人) 投稿日時 2010/5/24 23:56:44
>しかし、メッセージボックスに間違えた問題の正答をどうやって出現させるががわかりません。
コードのどの個所でも、このプログラムではQuestion(Qcount - 1)が問題を、Answer(Qcount - 1)が回答を表しています。

>[はい][キャンセル]は表示できてます。
>どちらが選択されたか判定するコードが良くわかりません。戻り値などを使うのでしょうか?
[はい][キャンセル]という表示は普通ではなかったと思いますが、[OK][キャンセル]ですか?
メッセージボックスの表示のさせ方によって若干異なりますが、御認識通り戻り値で判断できます。


    
Dim result As MsgBoxResult

result = MsgBox("どっちにしますか?", MsgBoxStyle.OkCancel)

If result = MsgBoxResult.Ok Then
    'OKが選択されたときここで止まります。 
    Stop
Else
    'OKではないとき(=上の例ではキャンセルのとき)ここで止まります。 
    Stop
End If


>OpenFileDialog は使ったことがなくコードがわかりません
ファイルを選択するとてもシンプルな例を紹介します。
    
Dim dialog As New OpenFileDialog

If dialog.ShowDialog = DialogResult.OK Then
    Dim fileName As String
    fileName = dialog.FileName
    MsgBox(fileName)
End If


全体に急ぎすぎている感じがします。もう少しじっくり考えたほうがいいように思います。
こんなに急激にVBを習得できる人は多分いないんじゃないでしょうか。
投稿者 colo  (高校生) 投稿日時 2010/5/25 00:44:28
> 不正解のときだけメッセージボックスで正答を教えてくれるについて
Answer(Qcount - 1)だとMsgBoxにAnswer(Qcount - 1)がそのまま出れしまうから聞いてるんですが。

OpenFileDialogの使い方を教えていただいてありがたいんですが複数の問題ファイルをどうやって選択するかをメインに知りたかったです。今はtest.engしか開けないのをたくさんのファイルを開けるようにする。そのためにどうするかということです。メニューバー→問題集を開くで問題集の選択をするところまでは完了しました。

あと終了するについてはどうなんでしょうか?


ちなみに、るきおさんへ確かに今僕は無謀なことをしています。ただ以前にも言ったように今のところは学習を目的としているわけではなくいち早くこのソフトを完成させなくてはなりません。今は時間がないためはじめから地道に習得することができません。このソフト完成後、時間に余裕ができたら学習を本格的にかいしするつもりなんです。sこのところのご理解をお願いします
投稿者 (削除されました)  () 投稿日時 2010/5/25 05:57:35
(削除されました)
投稿者 n=n  (その他) 投稿日時 2010/5/25 07:05:11
> いち早くこのソフトを完成させなくてはなりません。
なぜですか?
そんなに急ぐ理由がわかりません。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2010/5/25 10:25:12
> OpenFileDialog は使ったことがなくコードがわかりません
先の回答に、具体的なコード付きの URL を提示していたと思うのですが…それでは不足でしたでしょうか。
http://homepage1.nifty.com/rucio/VBNyumon/BEGIN11.htm

また、「OpenFileDialog」という用語で google 検索してみても、具体的なコードを幾つか得られるかと思います。

とりあえず、ツールボックスにある "OpenFileDialog" をフォームに貼って使ってみましょう。
いろいろなプロパティやメソッドがありますが、メインとなるのは .ShowDialog() メソッドです。
これによってファイル選択画面が表示され、FileName プロパティにて選択されたファイル名を得られます。
複数のファイルを同時に選択させたい場合は、Multiselect プロパティと FileNames プロパティを使います。

また、OpenFile() メソッドを使えばファイルの内容を読み取ることもできます。
今回は別の方法でファイルを開いているようなので、こちらは使わないかも知れませんけれど。


> Answer(Qcount - 1)だとMsgBoxにAnswer(Qcount - 1)がそのまま出れしまうから聞いてるんですが。
具体的に「どういうコードを書いたのか」が提示されていませんので、ただ出来ないとだけ言われても
こちらとしても、間違っている箇所を指摘する事はできません。
(そもそも、どのような結果になっているのかを、質問者側で想像する事さえできませんでした)

とりあえず、そのまま出てしまうという言葉から想像するに、コーディングに間違いがあるようですね。
たとえば、
MsgBox( "Answer(Qcount - 1)" )
 MsgBox( Answer(Qcount - 1) )
の違いは理解されていますでしょうか?

先にも書きましたが、具体的な回答が欲しいのであれば、質問内容も具体的に書きましょう。
どのようなコードを書いていて、どの部分で問題が起きているのかを教えて下さい。
そうでなければ、話している内容がすれ違ってしまうばかりですから…。


> ただ以前にも言ったように今のところは学習を目的としているわけではなく
いえ、学習はしてください。暗中模索を続けるよりは、結果的には早く完成させる事ができると思います。
算数の学習を終えていない人が数学の問題を説く事が困難であるのと同様に、
基礎を飛ばしたままコーディングを続けても、先に進むたびに躓いてしまう事が多くなります。
時間が不足しているなら猶の事、最低限の知識だけでも継続的に学習していってください。

このサイトの VB.NET 講座集を順番に試していくだけでも、かなりの効果があるかと思います。
時間が無いなら「理解」は後回しでも構いませんので、流し読み程度に読んでみましょう。
読むのが早い人だと半日で読破できるようですが、それが無理なら毎日少しずつでも読み進めましょう。

時間があるならば、講座の内容を順に試していった方が良いのですが、講座の内容を読んでいくだけでも
開発速度はある程度向上していきます。というのも、不明な点が出てきたときに
“内容はよく覚えていないけれど、あの辺りに何か関係する話が書かれていたような気がする…”と
思えるようになり、サンプル等を検索する速度が徐々に向上していくからです。


> いち早くこのソフトを完成させなくてはなりません。
「いち早く」が今日中なのか今月中なのか分かりませんが、時間が無いという現状を訴えても
回答の仕方が変わるわけではありませんので、それよりも、短い時間を有効に生かすためにも
回答者から情報を素早く得られるよう、質問の仕方を工夫してみる事をお奨めします。

・目的を実現するためのクラス名やメソッド名を知りたいのか、あるいはそれらの使い方を
 知りたいのか、それとも、使ってみたけれど予想した結果にならないのか、状況をきちんと説明する。 
・やりたい事を提示するだけではなく、それを実現するにあたり、
 どこまで出来ていて、どこが出来ていないのかを併記する。

・自分の状況が他の人にも分かるよう、現象を再現できる最低限のコードを掲載してみる。
投稿者 colo  (高校生) 投稿日時 2010/5/25 15:51:09
確かに基礎は必要です。とりあえずここのサイトをもう一度目を通してみました。よってメッセージボックスは成功しました。

私としては最後の問題なんですが、今はコードをどのようにすればいいかわかりません。
現状では
  Private Sub LoadProblem()

        Dim fileName As String = My.Application.Info.DirectoryPath & "\test.eng"
        Dim shiftJIS As System.Text.Encoding = System.Text.Encoding.GetEncoding("shift_jis")
        Dim lineNumber As Integer
        For Each line As String In IO.File.ReadAllLines(fileName, shiftJIS)
            If lineNumber Mod 2 = 0 Then
                Question.Add(line)
            Else
                Answer.Add(line)
            End If
            lineNumber += 1
        Next

        '順番のシャッフル(ランダム出題)←必要なければまるごとコメントに 

        Dim random As New Random
        For i As Integer = 0 To Question.Count - 1
            Dim temp As String
            Dim r As Integer
            r = random.Next(0, Question.Count)

            temp = Question(i)
            Question(i) = Question(r)
            Question(r) = temp

            temp = Answer(i)
            Answer(i) = Answer(r)
            Answer(r) = temp
        Next

    End Sub
となっていて特定のファイルtest.engしか開けません。
また、
 Private Sub 問題集を開くToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 問題集を開くToolStripMenuItem.Click


        If dialog.ShowDialog = DialogResult.OK Then
            Dim fileName As String
            fileName = dialog.FileName
            MsgBox(fileName)
        End If

    End Sub

としてファイルを選択する部分を作ることができました。
このメニューバーから選択したファイルをどのようにLoadProblemと結びつけるかがわかりません。
たぶんLoadProblemの部分についてはまったく違うと思います。

あと、来週以降はテストが終了し自由時間が増えるのでそこからまた1から勉強し始めようと思っているんですが本を購入しようかなと思ってます。現在販売されているものでおすすめ、またはどのような点を見て本を選べばいいですか?やっぱり自分しだいですか?

投稿者 まだまだ  (高校生) 投稿日時 2010/5/25 16:22:17
LoadProblem()の中に、
        Dim fileName As String = My.Application.Info.DirectoryPath & "\test.eng"

とありますよね、つまり、LoadProblemが呼び出されたときに
このfileNameの変数の値のPathのFileを読み取っているわけですよね。

今は、問題集を開くToolStripMenuItem_Click内の
fileNameの変数のPathのFileを読みたいわけですね。

こういう場合には、LoadProblemに引数を持たせて値を渡してあげるとよいと思います。
つまり、
 Private Sub LoadProblem(ByVal fPath As String)   'ByValで値を渡す。 
        Dim fileName As String = fPath
'以下省略 

このようにしてやり、今度は Private Sub 問題集を開くToolStripMenuItem_Clickで
このLoadProblemを呼び出してやればいいのです。

分かりにくかったらすみません。
投稿者 (削除されました)  () 投稿日時 2010/5/25 16:23:45
(削除されました)
投稿者 ?-?  (その他) 投稿日時 2010/5/25 16:27:33
すいません、ヒント投稿したら、まだまださんがほとんど回答を出しちゃっていましたので、流れ的におかしいので削除しました。
投稿者 colo  (高校生) 投稿日時 2010/5/25 16:51:03
まだまださんありがとうございます。こちらはまだ十分な知識がないので良くわかりません。

今のコードのここをどう変えるなどを教えてくれると助かります。
投稿者 まだまだ  (高校生) 投稿日時 2010/5/25 17:38:41
今度は Private Sub 問題集を開くToolStripMenuItem_Clickで
このLoadProblemを呼び出してやればいいのですから、
 Private Sub 問題集を開くToolStripMenuItem_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles 問題集を開くToolStripMenuItem.Click


        If dialog.ShowDialog = DialogResult.OK Then
            Dim fileName As String
            fileName = dialog.FileName
            LoadProblem(fileName)   '変更 
        End If

    End Sub

としてやれば、LoadPloblemを呼び出せます。
投稿者 colo  (高校生) 投稿日時 2010/5/27 01:40:47
Private Sub LoadProblem(ByVal fPath As String)   'ByValで値を渡す。 
        Dim fileName As String = fPath
としたんですが今度SetPloblemやForm1_LoadのところにあるLoadPloblem()になっているのでエラーになります。
この場合()の中にはなにを入れればいいのかわかりません。
ByVal fPath Stringもだめでいろいろ試しましたがだめでした。
投稿者 まだまだ  (高校生) 投稿日時 2010/5/27 14:05:32
それは、LoadProblemが絶対引数を渡さなくてはいけないからです。

解決手段1:ERRORが出ている場所の引数に
My.Application.Info.DirectoryPath & "\test.eng"
等を渡す。
詰まり、
LoadProblem(My.Application.Info.DirectoryPath & "\test.eng")

と書き換えます。

解決手段2:省略可能な引数にする。
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard48.htm
この記事のようにします。
詰まり、
Private Sub LoadProblem(ByVal fPath As String)

の1文を、
Private Sub LoadProblem(Optional ByVal fPath As String = My.Application.Info.DirectoryPath & "\test.eng")

に書き換えます。

解決方法3:OverLoadする。
これは今回はいいかな、と思います。
気になるならば、解決手段2で提示したURLの先に乗っているかと思います。

解決方法のどれを使うかはお任せします。個人的には2が好きです。
投稿者 葉月  (社会人) 投稿日時 2010/5/27 20:45:35
こんばんは。

このケースなら――
ポリモフィズムを利用し、
引数なしのメソッドを作るのが効果的です。
引数を指定したい場合としたくない場合で、
利用者は意識することなく使うことができます。

>サンプル
' 引数を指定しなかった場合 
Private Sub LoadProblem()
Dim fPath As String = My.Application.Info.DirectoryPath & "\test.eng"
Me.LoadProblem(fPath)
End Sub

' 引数を指定した場合 
Private Sub LoadProblem(ByVal fPath As String)
 ' 省略 
End Sub

投稿者 葉月  (社会人) 投稿日時 2010/5/27 20:58:39
まだまださんのやり方は、VB特有のやり方ですね。
私のは3に当てはまります。
今回は省略しましたが、コード量が増えたら、
Overloadsキーワードを使った方がいいですね。

VBは知りませんが、C#やJAVAだとこの方法が使われます。
投稿者 colo  (高校生) 投稿日時 2010/5/27 23:44:07
あのなぜtest.engを開くコードになってるんでしょうか?
まえに言ったように複数のファイルを開きたいんです。

話が混合して意味がわからなくなりました。
投稿者 はふ  (社会人) 投稿日時 2010/5/28 09:30:53
少しは自分で考えようよ……
投稿者 \/\  (その他) 投稿日時 2010/5/28 09:44:53
> SetPloblemやForm1_LoadのところにあるLoadPloblem()
そのLoadPloblem()を削除しましょう。
投稿者 ^\^  (その他) 投稿日時 2010/5/28 10:03:08
ここは、あなたの要求どおりにかわりに作ってもらえる場所じゃないです。
なので、まだまださんが原因を書いているとおりに、

> それは、LoadProblemが絶対引数を渡さなくてはいけないからです。

ということですから、SetPloblemやForm1_LoadのところにあるLoadPloblem()に、ファイル名を渡すように修正しましょう。
どういうふうにするかは、coloさん、あなたが考えるんですよ!