Da ich nix wirklich gefunden hab, was rund läuft hab ich das gebastelt .. wer s braucht , Verbesserungen schaden ja auch nicht , also nix wie los...
Die Abfrage der Variablen ist nicht wirklich rund, liegt an den ULongs, aber das Grundsätzliche läuft ja und notfalls kann man den restlichen Kram mit PeekL ab der ersten Variablen auslesen, im 8 Byte takt, die ersten 4, dann alle weiteren normal alle 4 Bytes .... Na ja, so ähnlich ...
Freitag 8.okt.2004 23:56
Hab noch was dran editiert, weil die Routine nicht division durch Zero sicher war - ist behoben... Außerdem ging das Fenster nicht in jedem Fall automatich zu - auch OK tschöööö
Code: Alles auswählen
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
; FileCopy Routine mit Progressbar ;
; ;
; © copyright Isidoro Okt.2004 ;
; ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
; CopyFileEx_ Konstanten
#PROGRESS_CONTINUE = 0
#PROGRESS_CANCEL = 1
#PROGRESS_STOP = 2
#PROGRESS_QUIET = 3
#COPY_FILE_FAIL_IF_EXISTS = 1
#COPY_FILE_RESTARTABLE = 2
#ProgressWnd = 0
Enumeration
#CopyProgressBar
#CopyProgressText
#CopyProgressCancel
EndEnumeration
Procedure.l CopyProgressCallback(TotalFileSize , TotalBytesTransferred , StreamSize , StreamBytesTransferred , dwStreamNumber.l , dwCallbackReason.l , hSourceFile.l ); keine Ahnung Tschüss...>, hDestinationFile.l , lpData.l )
;#####################################################################################################################################################################
TotalFileSize_ = (TotalFileSize>>16) &$FFFFFFFF
StreamSize_ = 100 * (StreamSize>>16) &$FFFFFFFF
If TotalFileSize_ > 0 And StreamSize_ > 0
Prozent = 100 * (StreamSize>>16) &$FFFFFFFF / (TotalFileSize>>16) &$FFFFFFFF
Else
Prozent = 100
EndIf
SetGadgetState(#CopyProgressBar , Prozent )
SetGadgetText (#CopyProgressText , "Orginal: " + Str(TotalFileSize)+ " Bytes " + Str(StreamSize)+" Bytes transfered" )
If Prozent = 100 : SetGadgetText (#CopyProgressText , "Orginal: " + Str(TotalFileSize)+ " Bytes " + Str(StreamSize)+" Bytes finished!" ) : EndIf
ProcedureReturn #PROGRESS_CONTINUE
EndProcedure
Procedure.b CopyFileWithProgress( ExistingFileName.s , NewFileName.s , flag.b )
;##############################################################################
ProgressWndFlags = #PB_Window_TitleBar | #PB_Window_WindowCentered|#WS_POPUP
If flag
If flag = 2 : ProgressWndFlags| #PB_Window_SystemMenu | #PB_Window_SizeGadget : EndIf
If OpenWindow(#ProgressWnd, 216, 0, 320, 80, ProgressWndFlags , " Filecopy Progress ")
If CreateGadgetList(WindowID())
ProgressBar = ProgressBarGadget(#CopyProgressBar , 10 , 15 , 300 , 20 , 0 , 100 , #PB_ProgressBar_Smooth)
SendMessage_( ProgressBar , #CCM_SETBKCOLOR , 0 , $174B0E ); Hintergrundfarbe
SendMessage_( ProgressBar , #WM_USER + 9 , 0 , $43D629 ); Balkenfarbe
TextGadget(#CopyProgressText , 11 , 54 , 280 , 20, "")
EndIf
EndIf
res = CopyFileEx_( @ExistingFileName.s , @NewFileName.s , @CopyProgressCallback() , 0 , cancel , 0)
If flag = 2
Repeat
event = WaitWindowEvent()
Select event
Case #PB_EventGadget
Case #PB_EventCloseWindow : Quit = 1
EndSelect
Until Quit = 1
EndIf
CloseWindow(#ProgressWnd)
ProcedureReturn res
Else
ProcedureReturn CopyFileEx_( @ExistingFileName.s , @NewFileName.s , 0 , 0 , 0 , 0)
EndIf
EndProcedure
;
; CopyFileWithProgress( CopyFrom.s , CopyTo.s , flags.b)
;
; Pfade müssen angepasst werden
; Flags: 0 = Unsichtbar - Kein Fenster geht auf, Copy im Hintergrund.
; 1 = Fenster geht auf und schließt sich automatisch nach Beendigung.
; 2 = Fenster bleibt offen stehen und muss vom Benutzer geschlossen werden.
CopyReady = CopyFileWithProgress( "c:\test2.avi" , "d:\test2.bak" , 1)