Seite 1 von 1
Streaming und Progressbar
Verfasst: 22.04.2006 10:34
von John Doe
wenn ich mittels File streaming eine Datei in ein Editorgadget einlese, möcht ich den Ladefortschritt mit einer Progressbaranzeige angezeigt bekommen.
Wie erhalte ich die aktuelle Anzahl der transferierten Bytes, um dies dem Progressbargadget mitzuteilen.
Ich habe schon in diversen Foren nach einer Lösung gesucht, bisher aber noch nichts passendes gefunden.
Für eure Hilfe vielen Dank im voraus.
Verfasst: 22.04.2006 10:47
von edel
In cb steht die Anzahl der zulesenden Bytes.
Verfasst: 22.04.2006 10:57
von John Doe
vielen Dank für die schnelle Antwort.
Wollte die Anweisung einbauen, weiß aber nicht wie und wo.
Zum Laden Einer Datei benutze ich folgende Procedure:
Code: Alles auswählen
Procedure Load(FileName.s, EditorID.l)
Protected *hFile.LONG
Protected Stream.EDITSTREAM
EditStreamCallback(dwCookie,pbBuff,cb,*pcb)
*hFile = ReadFile(#PB_Any, FileName)
If *hFile
Stream\dwCookie = *hFile\l
Stream\pfnCallback = @StreamIN()
SendMessage_(GadgetID(EditorID),#EM_STREAMIN ,#SF_TEXT, @Stream)
SendMessage_(GadgetID(EditorID),#EM_LIMITTEXT,-1,0)
CloseFile(*hFile)
EndIf
EndProcedure
Wo baue ich die Anweisung da ein ??
Verfasst: 22.04.2006 11:04
von edel
Nirgendwo. Bei dir heisst die Procedure/Callback "StreamIN"
Verfasst: 22.04.2006 11:22
von John Doe
ich habe die Procedure 'StreamIN' gefunden, weiß aber immer noch nicht, wie ich die Variable cb nutzen soll, um damit den aktuellen Wert des Progressbar zu aktualisieren.
Die StremIn-procedure sieht bei mir so aus:
Code: Alles auswählen
Procedure StreamIN(dwCookie.l,pbBuff.l,cb.l,*pcb.l)
ReadFile_(dwCookie, pbBuff, cb, *pcb, 0)
!XOR Eax,1
ProcedureReturn
EndProcedure
wo baue ich die Progressbar-Anweisung ein ?
Verfasst: 22.04.2006 11:38
von edel
Vorsicht ! Ich weiss nicht wo das Maximum einer Progressbar liegt.
Habe vorsichtshalber mal das ganze durch 1000 geteilt.
Eventuell noch ein WindowEvent() vor ReadFile_ setzen.
Code: Alles auswählen
Enumeration
#GAD_EDIT
#GAD_PROG; <----
#IDM_LOAD
EndEnumeration
Procedure StreamIN(dwCookie.l,pbBuff.l,cb.l,*pcb.l)
Protected pro.l = GetGadgetState(#GAD_PROG) ; <----
SetGadgetState(#GAD_PROG,pro+cb/1000) ; <----
;WindowEvent() ; <----
ReadFile_(dwCookie, pbBuff, cb, *pcb, 0)
!XOR Eax,1
ProcedureReturn
EndProcedure
Procedure Load()
Protected File.s
Protected *hFile.LONG
Protected Stream.EDITSTREAM
File = OpenFileRequester("Öffnen", "", "", 0)
If File
*hFile = ReadFile(#PB_Any, File)
If *hFile
Stream\dwCookie = *hFile\l
Stream\pfnCallback = @StreamIN()
SetGadgetAttribute(#GAD_PROG, #PB_ProgressBar_Maximum, FileSize(File)/1000) ; <----
SendMessage_(GadgetID(#GAD_EDIT), #EM_STREAMIN, #SF_TEXT, @Stream)
SetGadgetAttribute(#GAD_PROG, #PB_ProgressBar_Maximum,0); <----
CloseFile(*hFile)
EndIf
EndIf
EndProcedure
*win.LONG = OpenWindow(#PB_Any, 0, 0, 500, 500, "PureBasic Window")
If *win
CreateGadgetList(*win\l)
EditorGadget(#GAD_EDIT,0,0,500,460)
ProgressBarGadget(#GAD_PROG, 0, 461, 500, 20,0, 0,#PB_ProgressBar_Smooth) ; <----
If CreateMenu(0,*win\l)
MenuTitle("File")
MenuItem( #IDM_LOAD, "&Load...")
EndIf
Repeat
EventID = WaitWindowEvent()
Select EventID
Case #PB_Event_CloseWindow : Break
Case #PB_Event_Menu
Select EventMenu()
Case #IDM_LOAD
Load()
EndSelect
EndSelect
ForEver
EndIf
End
Verfasst: 22.04.2006 11:57
von John Doe
jetzt hab ich so einigermaßen den Durchblick.
vielen Dank an hallodri
vielleicht noch eine kurze Frage.
wozu ist eigentlich diese Anweisung da:
ich kann mit ihr noch nichts anfangen, was ist Eax,1; was wird hier exor-verknüpft ???
Verfasst: 22.04.2006 12:21
von edel
In eax steht der Wert den Readfile zurueck gibt , XOR ist Assembler und
verknuepft hier eax mit 1 , danach gibt procedurereturn eax zurueck , ist eax
0 ist ein Fehler aufgetreten oder die Dateioperation zu Ende.
Hoffentlich habe ich jetzt kein Mist erzaehlt (-;
Verfasst: 22.04.2006 12:35
von John Doe
vielen Dank für die ausführliche Hilfe ...