StatusBarProgress() und ProgressBarGadget() reagieren träge

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Sicro
Beiträge: 969
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: StatusBarProgress() und ProgressBarGadget() reagieren tr

Beitrag von Sicro »

Nachfolgender Code funktioniert auch mit dem Maximalwert:

Code: Alles auswählen

Procedure SetProgressBarStateFast(Gadget, State)
  MaxState = GetGadgetAttribute(Gadget, #PB_ProgressBar_Maximum)
  
  If State < MaxState
    SetGadgetState(Gadget, State + 1)
    SetGadgetState(Gadget, State)
  Else
    SetGadgetAttribute(Gadget, #PB_ProgressBar_Maximum, MaxState + 1)
    SetGadgetState(Gadget, MaxState + 1)
    SetGadgetAttribute(Gadget, #PB_ProgressBar_Maximum, MaxState)
  EndIf
EndProcedure

;#ProgressBarState = 100
#ProgressBarState = 50

If OpenWindow(0, 0, 0, 570, 100, "ProgressBarGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ProgressBarGadget(0,  35, 35, 500,  30, 0, 100)
  
  AddWindowTimer(0, 1, 2000)
  
  Repeat
    Event = WaitWindowEvent()
    
    If Event = #PB_Event_Timer
      SetProgressBarStateFast(0, #ProgressBarState)
      RemoveWindowTimer(0, 1)
    EndIf
  Until Event = #PB_Event_CloseWindow
EndIf
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Lord
Beiträge: 325
Registriert: 21.01.2008 19:11

Re: StatusBarProgress() und ProgressBarGadget() reagieren tr

Beitrag von Lord »

Hallo Sicro!

Danke für Dein Beispiel.
Das ist eine Verbesserung des Vorschlages
von Christian+.
Damit reagiert das ProgressBarGadget auch
kurz vor Erreichen des Maximalwertes noch
trägheitslos.
Für den StatusBarProgress funktioniert das
so leider nicht. Den letzten Step führt die
StatusProgressBar immer noch mit Verzöge-
rung aus.
Bild
Benutzeravatar
Sicro
Beiträge: 969
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: StatusBarProgress() und ProgressBarGadget() reagieren tr

Beitrag von Sicro »

Ich habe das gleiche Prinzip mit dem StatusBarProgress ausprobiert und bei mir scheint es zu funktionieren.

Hier wieder ein Beispiel:

Code: Alles auswählen

Procedure SetStatusBarProgressStateFast(StatusBar, Field, State, Style = 0, MinState = 0, MaxState = 100)
  If State < MaxState
    StatusBarProgress(StatusBar, Field, State + 1, Style, MinState, MaxState)
    StatusBarProgress(StatusBar, Field, State,     Style, MinState, MaxState)
  Else
    StatusBarProgress(StatusBar, Field, MaxState + 1, Style, MinState, MaxState + 1)
    StatusBarProgress(StatusBar, Field, MaxState,     Style, MinState, MaxState)
  EndIf
EndProcedure

;#StatusBarProgressState = 100
#StatusBarProgressState = 50
  
If OpenWindow(0, 0, 0, 340, 50, "StatusBarProgress", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  If Not CreateStatusBar(0, WindowID(0)): End: EndIf
  AddStatusBarField(340)
  StatusBarProgress(0, 0, 0, 0, 0, 100)
  
  AddWindowTimer(0,1,2000)
    
  Repeat
    Event = WaitWindowEvent()
    
    If Event = #PB_Event_Timer
      SetStatusBarProgressStateFast(0, 0, #StatusBarProgressState, 0, #PB_Ignore, 100)
    EndIf
  Until Event = #PB_Event_CloseWindow
EndIf
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Lord
Beiträge: 325
Registriert: 21.01.2008 19:11

Re: StatusBarProgress() und ProgressBarGadget() reagieren tr

Beitrag von Lord »

Hallo Sicro!
Ich habe wohl einen Fehler gemacht, denn bei mir funktioniert es jetzt auch:

Code: Alles auswählen

Define max.i=10
Define Wert.i=0
Dim BtTxt.s(1)
BtTxt(0)="Träge"
BtTxt(1)="Flink"

OpenWindow(1, 10,10,400,200,"")
CreateStatusBar(1,WindowID(1))
AddStatusBarField((400-128)/2-40)
AddStatusBarField(40)
AddStatusBarField(128)
AddStatusBarField(40)
StatusBarProgress(1,2, 0, #PB_StatusBar_BorderLess, 0,10)
TrackBarGadget(1, 10,10,380,20, max,255)
TrackBarGadget(2, 10,50,380,20, 0, max)
StatusBarText(1, 1, Str(GetGadgetState(2)))
StatusBarText(1, 3, Str(GetGadgetState(1)))
ButtonGadget(4, (400-40)/2, 90, 40, 20, BtTxt(0), #PB_Button_Toggle)
ProgressBarGadget(3, (400-128)/2, 140, 128, 18, 0, max,#PB_ProgressBar_Smooth)

Procedure SetProgressBarStateFast(Gadget, State)
  MaxState = GetGadgetAttribute(Gadget, #PB_ProgressBar_Maximum)
 
  If State < MaxState
    SetGadgetState(Gadget, State + 1)
    SetGadgetState(Gadget, State)
  Else
    SetGadgetAttribute(Gadget, #PB_ProgressBar_Maximum, MaxState + 1)
    SetGadgetState(Gadget, MaxState + 1)
    SetGadgetAttribute(Gadget, #PB_ProgressBar_Maximum, MaxState)
    SetGadgetState(Gadget, MaxState )
  EndIf
EndProcedure
Procedure SetStatusBarProgressStateFast(StatusBar, Field, State, Style = 0, MinState = 0, MaxState = 100)
  If State < MaxState
    StatusBarProgress(StatusBar, Field, State + 1, Style, MinState, MaxState)
    StatusBarProgress(StatusBar, Field, State,     Style, MinState, MaxState)
  Else
    StatusBarProgress(StatusBar, Field, MaxState + 1, Style, MinState, MaxState + 1)
    StatusBarProgress(StatusBar, Field, MaxState,     Style, MinState, MaxState)
  EndIf
EndProcedure

Repeat
  Event=WaitWindowEvent()
  EventGadget =EventGadget()
  Select Event
    Case #PB_Event_Gadget
      Select EventGadget
        Case 1
          max=GetGadgetState(1)
          SetGadgetAttribute(2,#PB_TrackBar_Maximum,max)
          SetGadgetAttribute(3,#PB_ProgressBar_Maximum,max)
          StatusBarProgress(1,2,GetGadgetState(2),0, 0,max)
          StatusBarText(1, 1, Str(GetGadgetState(2)))
          StatusBarText(1, 3, Str(max))
        Case 2
          Wert=GetGadgetState(2)
          If GetGadgetState(4)
            SetProgressBarStateFast(3,Wert)
            SetStatusBarProgressStateFast(1,2,Wert, 0, 0, max)
          Else
            SetGadgetState(3,Wert)
            StatusBarProgress(1,2,Wert)
          EndIf
          StatusBarText(1, 1, Str(Wert))
        Case 4
          SetGadgetText(4, BtTxt(GetGadgetState(4)))
      EndSelect
  EndSelect
  
Until Event=#PB_Event_CloseWindow
Danke nochmals für Deinen (und Christian+') "workaround". Das hat
mir sehr geholfen. :allright:
Bild
Antworten