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

Code: Alles auswählen

EditStreamCallback(dwCookie,pbBuff,cb,*pcb)
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
:allright: :allright: :allright:
jetzt hab ich so einigermaßen den Durchblick.
vielen Dank an hallodri
vielleicht noch eine kurze Frage.
wozu ist eigentlich diese Anweisung da:

Code: Alles auswählen

!XOR Eax,1
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 ...