0

フォルダーに画像を表示するプログラムを作ろうとしていました。各画像のパスはデータベースに保存されました。私の問題は、データベースに保存されている最後の画像のみが表示され、すべての画像が表示されないことでした。

コードは次のとおりです。

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

        Me.Timer1.Enabled = True

End Sub







Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick




    Try
        Dim ctr As Integer = 0
        Dim pic As String
        Dim sqlconn As New SqlConnection("data source=NMPI_2;initial catalog=IPCS; " & _
                             "password=rhyatco; " & _
                             "persist security info=True; " & _
                             "user id= rhyatco;" & _
                             "packet size=4096")
        sqlconn.Open()
        Dim query As String = "Select picture from Bpicture"
        Dim sqlcomm As New SqlCommand(query, sqlconn)
        Dim reader As SqlDataReader
        reader = sqlcomm.ExecuteReader

        While reader.Read
            pic = reader("picture").ToString
            Me.PictureBox1.Image = Image.FromFile(pic)
            Me.PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
        End While

    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub
4

3 に答える 3

2

テーブル全体を取得し、While ループですべてのレコードを取得しているため、常に最後の画像が表示されます。最後の画像が常に勝者になります。

考えられる解決策は 2 つあります。

One、データベースから 1 つの画像をランダムに取得します。行をランダムに選択する方法については、このスタックオーバーフロー スレッドを確認してください。このソリューションの注意点は、毎回データベースを呼び出すことです。

2、データベースからすべての画像を取得し、データをコレクションに保存して、コレクションから画像の 1 つをランダムに選択します。このソリューションの注意点は、メモリ内のコレクションに保存するには画像が多すぎる可能性があることです。その場合は、One を使用する必要があります。

于 2009-02-11T07:04:47.563 に答える
0

あなたが提供したもので私が目にする問題は、タイマーが起動するたびにクエリを実行し、結果セット内のすべての行を反復処理していることです。

あなたが本当に探しているのは、フォームが読み込まれたときに結果セットを 1 回ダウンロードしてから、タイマーで見ている画像を切り替えることだと思います。

それらを何度も何度もローテーションする1つの方法は、リストをダウンロードしてファイル名のキューに入力し、タイマーで次のようにすることです(申し訳ありませんが、私の例はC#にあります):

string fileName = imageFileNameQueue.Dequeue();
PictureBox1.Image = Image.FromFile(fileName);
imageFileNameQueue.Enqueue (fileName); // Put the file back at the back of the queue
于 2009-02-11T07:08:06.400 に答える
-2

ある種の作業を行う既存のソリューションへの単純な変更は、ある程度の確率でwhileループから抜け出すことです。このソリューションの問題は、クエリ結果の後半の画像が以前の画像よりも表示される可能性がはるかに低いことです。

私はVBを行ったことがないので、Google経由でコーディングしていますが、どこかにRandomのインスタンスを作成する必要があります。

Dim rand as new Random()

次に、whileループで、乱数を引き出して、停止する必要があるかどうかを確認します。

While reader.Read
    ...
    If rand.Next(10) > 8 Then
       Exit While
    End If
End While

編集:画像を決定したら、コードを移動して、画像とサイズモードをwhileループから外し、一度だけ設定されるようにする必要があります。

于 2009-02-11T07:22:40.937 に答える