Avatar billede sorenstrom Nybegynder
15. december 2002 - 22:28 Der er 13 kommentarer og
1 løsning

Hvordan virker Progress Bar?

Hvis jeg vil kopiere en fil på fx. 10 mb via VB, og vise status i en Progress Bar. Hvordan gør jeg så?

Jeg har aldrig helt forstået, hvordan jeg aflæser, hvor lang filen er i kopieringen.

/Søren
Avatar billede bufferzone Praktikant
15. december 2002 - 22:33 #1
Avatar billede tubber Juniormester
15. december 2002 - 22:34 #2
Du sætter progressbar til at være lig din slutværdig :

PrgBar1 = 100 'eksempelvis hvis den viser %

og når du så får den til at tælle så gør du følgende....

ProgressBar1.Value = ProgressBar1.Value + 1 og den skal så være i et loop....

f.eks.

For i = 1 To 100
  List1.AddItem ("Tekst " & i, i)
  ProgressBar1.Value = ProgressBar1.Value + 1
Next i

/Tubber
Avatar billede kabbak Professor
15. december 2002 - 23:00 #3
Du kan finde længden på filen således.
Public Sub længdepåfil()
Dim A As Long
Open "C:\GTA2DEMO.exe" For Input As #1
A = LOF(1) '=12972175 byte
Close
End Sub
Avatar billede sorenstrom Nybegynder
16. december 2002 - 08:07 #4
>> kabbak
Tak for svaret. Jeg er bare ikke helt tilfreds.
Jeg ved stadig ikke, hvordan jeg aflæser status på kopieringen.
Hvordan ved jeg hvornår, der kun mangler 25%, eller 200 kb tilbage.
Avatar billede michaelemanuel Nybegynder
16. december 2002 - 10:23 #5
Hvis du bruger VB's indbyggede FileCopy, så har du ingen mulighed for at aflæse progress.

Du kan alternativt lave din egen FileCopy funktion.
Her skal du åbne SourceFile og DestFile, og derefter læse/skrive filindholdet i tilpas blokstørrelser.
Herved kan du lave Progress på lopieringen.
Avatar billede webcon Nybegynder
17. december 2002 - 23:24 #6
Jeg er heller ikke særlig stiv til Progresbar, men prøv om du ikke kan bruge dette til noget..!

Private Sub Command1_Click()
  Dim Counter As Integer
  Dim Workarea(30000) As String
  ProgressBar1.Min = LBound(Workarea)
  ProgressBar1.Max = UBound(Workarea)
  ProgressBar1.Visible = True

'Set the Progress's Value to Min.
  ProgressBar1.Value = ProgressBar1.Min

'Loop through the array.
  For Counter = LBound(Workarea) To UBound(Workarea)
      'Set initial values for each item in the array.
      Workarea(Counter) = "Initial value" & Counter
      ProgressBar1.Value = Counter
  Next Counter
'  ProgressBar1.Visible = False
  ProgressBar1.Value = ProgressBar1.Min
End Sub

Private Sub Form_Load()
  ProgressBar1.Align = vbAlignBottom
  ProgressBar1.Visible = False
  Command1.Caption = "Initialize array"
End Sub


/webcon
Avatar billede skumbaq Nybegynder
18. december 2002 - 21:28 #7
Man er nød til at åbne filen for så at kopiere tegn for tegn


Public Sub Copy(Fra As String, Til As String, ProgressBar As Object)
Dim Buffer As String 'buffer used for copying
Dim Pointer As Long 'position of pointer in file
Dim X As Integer 'used in for...next loop
Dim Whole As Integer
Dim Part As Integer

If Dir(Til) <> "" Then Kill (Til) 'checks if destination file exists. if it does, delete it

Open Fra For Binary As #1
Open Til For Binary As #2

Whole = LOF(1) \ 20000 'number of whole 20k chunks
Part = LOF(1) Mod 20000 'remainder at the end
Buffer = String$(20000, 0) 'buffer
Pointer = 1 'start at position 1
ProgressBar.Max = LOF(1)

For X = 1 To Whole
    Get #1, Pointer, Buffer 'get data
    Put #2, Pointer, Buffer 'put it to destination file
    Pointer = Pointer + 20000 'put pointer 20k later
    If Pointer < ProgressBar.Max Then ProgressBar.Value = Pointer Else ProgressBar.Value = ProgressBar.Max 'update progressbar, make sure it doesn't overflow
Next X

Buffer = String$(Part, 0) 'copy the last bit
Get #1, Pointer, Buffer        'get the remaining bytes at the end
Put #2, Pointer, Buffer      'put them
ProgressBar.Value = ProgressBar.Max
Close

Buffer = "" 'reclaim space
End Sub
Avatar billede skumbaq Nybegynder
18. december 2002 - 21:31 #8
Den her er en lidt anden måde

Men der skal du lige lave en ref


Function Copy(ByVal Fra As String, ByVal Til As String, ByRef Bar As Object)

Dim Fso As Scripting.FileSystemObject
Dim StreamL As Scripting.TextStream
Dim StreamS As Scripting.TextStream
Dim S As String
Dim NFil As File

Set Fso = New Scripting.FileSystemObject

Set NFil = Fso.GetFile(Fra)
Bar.Value = 0
Bar.Max = NFil.Size

Set StreamL = Fso.OpenTextFile(Fra, ForReading)
Set StreamS = Fso.CreateTextFile(Til, ForAppending)

Do Until StreamL.AtEndOfStream

S = StreamL.Read(1000000)
StreamS.Write S
Bar.Value = Bar.Value + 1000000
Bar.Refresh

Loop

StreamL.Close
StreamS.Close


End Function
Avatar billede teknikeren Nybegynder
27. december 2002 - 14:57 #9
Lige en kommentar til tubber: Der findes ingen property der hedder "value".
Avatar billede teknikeren Nybegynder
03. januar 2003 - 16:48 #10
Opret Progressbar + Timer

Private Sub Form_Load()
ProgressBar1.Min = 0
ProgressBar1.Max = 100
ProgressBar1.Value = 0
End Sub

Private Sub Timer1_Timer()
Progressbar1.Value = Progressbar1.Value +1
If Progressbar1.Value = 100 Then
Timer1.Enabled = "False"
End If
End Sub
Avatar billede teknikeren Nybegynder
03. januar 2003 - 16:48 #11
Det med filen ved jeg ik... Og det skulle være et svar :)
Avatar billede michaelemanuel Nybegynder
06. januar 2003 - 07:58 #12
Du kan benytte API Kald : SHFileOperation
DEn giver samme look and feel som kopiering v.h.a. f.eks stifinder.

Const FO_COPY = &H2
Const FO_DELETE = &H3
Const FO_MOVE = &H1
Const FO_RENAME = &H4

Type SHFILEOPSTRUCT
        hwnd As Long
        wFunc As Long
        pFrom As String
        pTo As String
        fFlags As Integer
        fAnyOperationsAborted As Long
        hNameMappings As Long
        lpszProgressTitle As String '  only used if FOF_SIMPLEPROGRESS
End Type

Declare Function SHFileOperation Lib "shell32.dll" Alias " SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long
Avatar billede kabbak Professor
01. februar 2004 - 00:26 #13
Gammel sag, vær venlig at afslutte. ?
Avatar billede kabbak Professor
12. marts 2007 - 22:58 #14
lukketid
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester