1

VB6の使用

私のプロジェクトでは、あるフォルダから別のフォルダにファイルをコピーするときに、コピーのようにプログレスバーを表示したいのですが…。、ファイルがコピーされると、プログレスバーが100%完了しました。

コード。

'ファイルのコピー

Private Sub Copy_Click()
Timer1.Enabled = True
Dim abc As Integer
Dim line As String
abc = FreeFile
Open App.Path & "\DatabasePath.TXT" For Input As #abc
Input #abc, line
databasetext = line
Dim fs As New FileSystemObject, f As File
Set f = fs.GetFile(databasetext)
f.Copy App.Path & "\"
Set fs = Nothing
Close #abc
End Sub

Private Sub Timer1_Timer()
ProgressBar1.Min = 0
ProgressBar1.Max = 100
ProgressBar1.Value = ProgressBar1.Value + 1
If ProgressBar1.Value = ProgressBar1.Max Then
Timer1.Enabled = False
End If
End Sub

上記のコードは機能していますが、コピーボタンをクリックすると、ファイルが別のフォルダーにコピーされると、Progressbar1が表示されません。次に、progressbar1のみが表示されます。

両方が同時に機能することはありません。

また、ファイルがコピーされると、プログレスバーに100%が表示されます。今は正しく表示されていません、それでもファイルはコピーされています、プログレスバーは100%を示しています

誰かが問題を解決するのを助けることができますか?

VB6コードのヘルプが必要です。

4

3 に答える 3

4

標準のコピー機能がタイマーの起動をブロックしている場合、実行できる最善の方法は、ソースファイルを一度に数千バイト読み取り、宛先ファイルに書き込む独自のコピーを作成することです。

各読み取り操作と書き込み操作の間に、プログレスバーを更新し、(場合によっては)DoEventsを呼び出して再描画する必要があります。

また、タイマーコードは意味がありません。実際にどれだけの進歩があったかに関係なく、発砲した場合は毎回任意に進歩を増やします。プログレスバーをコピー機能に渡して、進行中に更新できるようにすることをお勧めします。

このような何かがそれをするでしょう:

Private Sub Copy_Click()
  Dim abc As Integer
  Dim line As String
  abc = FreeFile
  Open App.Path & "\DatabasePath.TXT" For Input As #abc
  Input #abc, line
  copyFile line, App.Path & "\" & line, ProgressBar1
  Close #abc
End Sub



Sub copyFile(inFile As String, outFile As String, ByRef pg As ProgressBar)

  Close

  Const chunkSize = 1024
  Dim b() As Byte

  fhIn = FreeFile

  Open inFile For Binary Access Read As #fhIn

  fhOut = FreeFile

  Open outFile For Binary Access Write As #fhOut

  toCopy = LOF(fhIn) 'gets the size of the file
  fileSize = toCopy

  pb.Min = 0
  pb.Max = toCopy




  While toCopy > 0
      If toCopy > chunkSize Then
          ReDim b(1 To chunkSize)
          toCopy = toCopy - chunkSize
      Else
          ReDim b(1 To toCopy)
          toCopy = 0
      End If

      Get #fhIn, , b
      Put #fhOut, , b

      pg.Value = fileSize - toCopy
      DoEvents
  Wend
  Close #fhIn
  Close #fhOut
End Sub
于 2009-08-19T13:13:15.527 に答える
0

プログレスバーが機能するには、定期的なループでインラインで更新するか、別のスレッドで実行する必要があります。

于 2009-08-19T12:57:40.420 に答える
0

古い学校のVB6のコピーはブロッキングコマンドです。したがって、DoEventsでも同じ結果が得られます(ファイルがコピーされ、進行状況バーが表示されます)。遅いメディアで大きなファイルをコピーしていて、進行状況を表示できるようにする必要がある場合は、ターゲットファイルを作成し、ループ内のチャンクでバイトを移動する必要があります。そのループで、進行状況バーを更新できます。残念ながら、OPに示されている例では、すべての操作が同期しているため、探しているものが得られません。

編集:私の上の男に殴られた:)

于 2009-08-19T13:13:50.880 に答える