Seite 1 von 1

ProgressBar-Programm verbessern

Verfasst: 13.08.2022 15:39
von Wolfvater Loki
Hallo PB-Team,

ich möchte mit folgendem Programm den Stand über einen ProgressBarGadget anzeigen, den man über einen StringGadget eingibt. Ich könnte noch etwas Hilfe gebrauchen.

Code: Alles auswählen

OpenWindow(1,0,0,1000,600,"",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ProgressBarGadget(1,10,10,400,20,0,4000)
SetGadgetState(1,4000)
StringGadget(2,10,50,100,20,"")
Repeat
  event = WaitWindowEvent()
  If event = #PB_Event_Gadget
    Select EventGadget()
      Case 2
        
    EndSelect
  EndIf
Until event = #PB_Event_CloseWindow

Re: ProgressBar-Programm verbessern

Verfasst: 13.08.2022 17:05
von Andesdaf
Mit SetGadgetState() kannst du den angezeigten Wert in der ProgressBar ändern. Das StringGadget machst du dann besser numerisch per #PB_String_Numeric und holst dir den eingegebenen Wert per GetGadgetText.

Und besser ist es, die ProgressBar nur bei Änderungen im SteongGadget zu aktualisieren, also noch den EventType #PB_EventType_Change abfragen.

Re: ProgressBar-Programm verbessern

Verfasst: 13.08.2022 20:11
von Wolfvater Loki
Andesdaf hat geschrieben: 13.08.2022 17:05 Mit SetGadgetState() kannst du den angezeigten Wert in der ProgressBar ändern. Das StringGadget machst du dann besser numerisch per #PB_String_Numeric und holst dir den eingegebenen Wert per GetGadgetText.

Und besser ist es, die ProgressBar nur bei Änderungen im SteongGadget zu aktualisieren, also noch den EventType #PB_EventType_Change abfragen.
Könntest du das mit EventType und #PB_EventType_Change näher erklären? Das habe ich kaum verwendet.

Re: ProgressBar-Programm verbessern

Verfasst: 14.08.2022 01:33
von jacdelad
Nach einem WaitWindowEvent werden einige Funktionen verfügbar, mit denen du ermittlen kannst, was für ein Event aufgetreten ist und wo.
Die Funktion Event() gibt das Event zurück, z.B. #PB_Event_Gadget, wenn das Event mit einem Gadget zu tun hat. Danach solltest du prüfen, was passiert ist, das geht mittels EventType(). #PV_EventType_LeftClick gibt an, dass mit der Maus geklickt wurde. EventGadget() gibt das passende Gadget zurück. Wenn du das in 3 Select-Abfragen verschachtelst hast du eine übersichtliche Struktur zur Abarbeitung:

Code: Alles auswählen

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break;Loop verlassen
    Case #PB_Event_Menu;Menüs und Shortcuts
      Select EventMenu()
        Case #MenuNummer
          ;Tu was
        Case #MenuNummerZwei
          ;Tu was anderes
      EndSelect
    Case #PB_Event_Timer;Timer
      Select EventTimer()
        Case #TimerEins
          ;Tu was
        Case #TimerZwei
          ;Tu was anderes
      EndSelect
    Case #PB_Event_Gadget;Gadgets
      Select EventType() ;Was ist passiert?
        Case #PB_EventType_LeftClick;Mausklick mit links
          Select EventGadget();Welches Gadget
            Case #GadgetEins
              ;Tu was
            Case #GadgetZwei
              ;Tu was anderes
          EndSelect
        Case #PB_EventType_Change;z.B. anderes Element in ListIconGadget angeklickt
          Select EventGadget();Welches Gadget
            Case #GadgetDrei
              ;Tu was
          EndSelect
      EndSelect
  EndSelect
ForEver
Das ist meine Methode, hier als Prototyp (also logischerweise die gewünschten Events, EventTypes, Gadgets...anpassen). Am Anfang etwas mehr Arbeit, dann aber übersichtlich und sturkturiert. Übrigens bleiben die Werte, die Event(), EventGadget() etc. zurückgeben so lange erhalten, bis wieder WaitWindowEvent() aufgerufen wird.

Re: ProgressBar-Programm verbessern

Verfasst: 14.08.2022 10:45
von mk-soft
Hallo jacdelad,

wie würde bei der Abfrage Gadget Events erst das Gadget prüfen und dann zum Gadget den Event Type, da jedes Gadget unterschiedliche Event Types hat.

Re: ProgressBar-Programm verbessern

Verfasst: 14.08.2022 14:15
von jacdelad
Das ist natürlich auch möglich. In meinem Programm habe ich meist viele Gadgets und prüfe fast nur LeftClick und Change, da hatte es sich bewährt erst den EventType und dann das Gadget zu prüfen, macht weniger Aufwand.

Re: ProgressBar-Programm verbessern

Verfasst: 18.08.2022 17:34
von Axolotl
Hallo Wolfvater Loki,

konntest Du dein Problem mit den bisherigen Tipps lösen?
Wenn nicht, findest Du hier eine Lösungsmöglichkeit. (Wirklich Sinn macht das Programm natürlich nicht.)
P.S.: Ich habe mir mal die Mühe gemacht und versucht meine "Coding Guidelines" anzuwenden. Die Anwendung solcher (eigener) Richtlinien ist aus meiner Sicht sehr zu empfehlen... Auch wenn in vielen Beispielen darauf verzichtet wird.

Code: Alles auswählen

EnableExplicit 

Enumeration EWindow 1 
  #WINDOW_Main 
EndEnumeration 

Enumeration EGadget 1 
  #GADGET_BarProgress 
  #GADGET_StrInput 
EndEnumeration 

#MinProgressValue =    0 
#MaxProgressValue = 4000 

Define state = #MaxProgressValue  


If OpenWindow(#WINDOW_Main, 0, 0, 1000, 600, "Example ", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ProgressBarGadget(#GADGET_BarProgress, 10, 10, 400, 20, #MinProgressValue, #MaxProgressValue) 
  SetGadgetState(#GADGET_BarProgress, state) 
  StringGadget(#GADGET_StrInput, 10, 50, 100, 20, Str(state)) 

  Repeat
    event = WaitWindowEvent() 
    If event = #PB_Event_Gadget
      Select EventGadget()
        Case #GADGET_StrInput 
          Select EventType() 
            Case #PB_EventType_Change          :Debug "Change"         ; The text has been modified by the user. 
              state = Val(GetGadgetText(#GADGET_StrInput)) 
              If state >= #MinProgressValue And state <= #MaxProgressValue 
                SetGadgetState(#GADGET_BarProgress, state) 
              EndIf 

            Case #PB_EventType_Focus           :Debug "Focus"          ; The StringGadget got the focus.              
            Case #PB_EventType_LostFocus       :Debug "LostFocus"      ; The StringGadget lost the focus.

          EndSelect 

      EndSelect
    EndIf
  Until event = #PB_Event_CloseWindow 
EndIf 

Re: ProgressBar-Programm verbessern

Verfasst: 18.08.2022 23:39
von Wolfvater Loki
Axolotl hat geschrieben: 18.08.2022 17:34 Hallo Wolfvater Loki,

konntest Du dein Problem mit den bisherigen Tipps lösen?
Wenn nicht, findest Du hier eine Lösungsmöglichkeit. (Wirklich Sinn macht das Programm natürlich nicht.)
P.S.: Ich habe mir mal die Mühe gemacht und versucht meine "Coding Guidelines" anzuwenden. Die Anwendung solcher (eigener) Richtlinien ist aus meiner Sicht sehr zu empfehlen... Auch wenn in vielen Beispielen darauf verzichtet wird.

Code: Alles auswählen

EnableExplicit 

Enumeration EWindow 1 
  #WINDOW_Main 
EndEnumeration 

Enumeration EGadget 1 
  #GADGET_BarProgress 
  #GADGET_StrInput 
EndEnumeration 

#MinProgressValue =    0 
#MaxProgressValue = 4000 

Define state = #MaxProgressValue  


If OpenWindow(#WINDOW_Main, 0, 0, 1000, 600, "Example ", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ProgressBarGadget(#GADGET_BarProgress, 10, 10, 400, 20, #MinProgressValue, #MaxProgressValue) 
  SetGadgetState(#GADGET_BarProgress, state) 
  StringGadget(#GADGET_StrInput, 10, 50, 100, 20, Str(state)) 

  Repeat
    event = WaitWindowEvent() 
    If event = #PB_Event_Gadget
      Select EventGadget()
        Case #GADGET_StrInput 
          Select EventType() 
            Case #PB_EventType_Change          :Debug "Change"         ; The text has been modified by the user. 
              state = Val(GetGadgetText(#GADGET_StrInput)) 
              If state >= #MinProgressValue And state <= #MaxProgressValue 
                SetGadgetState(#GADGET_BarProgress, state) 
              EndIf 

            Case #PB_EventType_Focus           :Debug "Focus"          ; The StringGadget got the focus.              
            Case #PB_EventType_LostFocus       :Debug "LostFocus"      ; The StringGadget lost the focus.

          EndSelect 

      EndSelect
    EndIf
  Until event = #PB_Event_CloseWindow 
EndIf 
Danke für deine Hilfe, Axolotl. Ich hatte es schon anders gelöst, trotzdem danke für deine Hilfe. Ich möchte mich auch bei den anderen bedanken, dafür, dass ihr mir geholfen habt.