ProgressBar-Programm verbessern

Anfängerfragen zum Programmieren mit PureBasic.
Wolfvater Loki
Beiträge: 52
Registriert: 22.05.2022 15:37

ProgressBar-Programm verbessern

Beitrag 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
Wolfvater Loki
Er wünscht euch schöne Grüße.
Andesdaf
Moderator
Beiträge: 2658
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: ProgressBar-Programm verbessern

Beitrag 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.
Win11 x64 | PB 6.00 (x64)
Wolfvater Loki
Beiträge: 52
Registriert: 22.05.2022 15:37

Re: ProgressBar-Programm verbessern

Beitrag 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.
Wolfvater Loki
Er wünscht euch schöne Grüße.
Benutzeravatar
jacdelad
Beiträge: 341
Registriert: 03.02.2021 13:39
Computerausstattung: Ryzen 5800X, 108TB Festplatte, 32GB RAM, Radeon 7770OC
Wohnort: Riesa
Kontaktdaten:

Re: ProgressBar-Programm verbessern

Beitrag 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.
PureBasic 6.04/XProfan X4a/Embarcadero RAD Studio 11/Perl 5.2/Python 3.10
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: ProgressBar-Programm verbessern

Beitrag 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.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
jacdelad
Beiträge: 341
Registriert: 03.02.2021 13:39
Computerausstattung: Ryzen 5800X, 108TB Festplatte, 32GB RAM, Radeon 7770OC
Wohnort: Riesa
Kontaktdaten:

Re: ProgressBar-Programm verbessern

Beitrag 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.
PureBasic 6.04/XProfan X4a/Embarcadero RAD Studio 11/Perl 5.2/Python 3.10
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB
Axolotl
Beiträge: 146
Registriert: 31.12.2008 16:34

Re: ProgressBar-Programm verbessern

Beitrag 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 
Mostly running PureBasic <latest stable version and current alpha/beta> (x64) on Windows 11 Home
Wolfvater Loki
Beiträge: 52
Registriert: 22.05.2022 15:37

Re: ProgressBar-Programm verbessern

Beitrag 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.
Wolfvater Loki
Er wünscht euch schöne Grüße.
Antworten