Streaming und Progressbar

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
John Doe
Beiträge: 57
Registriert: 02.01.2006 18:08

Streaming und Progressbar

Beitrag 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.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Code: Alles auswählen

EditStreamCallback(dwCookie,pbBuff,cb,*pcb)
In cb steht die Anzahl der zulesenden Bytes.
Benutzeravatar
John Doe
Beiträge: 57
Registriert: 02.01.2006 18:08

Beitrag 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 ??
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Nirgendwo. Bei dir heisst die Procedure/Callback "StreamIN"
Benutzeravatar
John Doe
Beiträge: 57
Registriert: 02.01.2006 18:08

Beitrag 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 ?
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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  
  
  
Benutzeravatar
John Doe
Beiträge: 57
Registriert: 02.01.2006 18:08

Beitrag 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 ???
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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 (-;
Benutzeravatar
John Doe
Beiträge: 57
Registriert: 02.01.2006 18:08

Beitrag von John Doe »

vielen Dank für die ausführliche Hilfe ...
Antworten