Variablenbeobachtung in einer Repeat-Until-Ereignisstruktur

Anfängerfragen zum Programmieren mit PureBasic.
Salafat
Beiträge: 30
Registriert: 05.01.2012 07:40
Computerausstattung: AMD FX-8350 Eight-Core-Prozessor 4,00 GHz
8 GB RAM
Windows 7 64-Bit
Wohnort: Berlin

Variablenbeobachtung in einer Repeat-Until-Ereignisstruktur

Beitrag von Salafat »

Hallo,

ich habe ein Problem beim Testen eines Programms (also beim Debugging). Der Kode erstellt zuerst ein GUI und soll dann, in Abhängigkeit von der Benutzereingabe, nach Betätigung der Schaltfläche "Berechnen" () ein paar Berechnungen durchführen und deren Ergebnis anzeigen. Ein ganz klassischer Fall also. Hier der Kode:

Code: Alles auswählen

EnableExplicit

Enumeration
  #Hf
  #Bz_Ztpkt_1
  #Tf_h1
  #Bz_h1
  #Tf_min1
  #Bz_min1
  #Tf_sek1
  #Bz_sek1
  #Tf_tsek1
  #Bz_tsek1
  #Bz_Ztpkt_2
  #Tf_h2
  #Bz_h2
  #Tf_min2
  #Bz_min2
  #Tf_sek2
  #Bz_sek2
  #Tf_tsek2
  #Bz_tsek2
  #Ra_Erg
  #Bz_Erg
  #Sf_Berechne
EndEnumeration

LoadFont(1, "WH12G", 8)
OpenWindow(#Hf, 460, 406, 281, 125, "Differenz", #PB_Window_SystemMenu|#PB_Window_TitleBar )
SetGadgetFont(#Bz_Ztpkt_1, 1)
TextGadget(#Bz_Ztpkt_1, 7, 11, 71, 16, "Zeitpunkt 1:")
StringGadget(#Tf_h1, 85, 8, 14, 22, #NULL$, #PB_String_Numeric)
TextGadget(#Bz_h1, 102, 11, 7, 18, "h")
StringGadget(#Tf_min1, 115, 8, 21, 22, #NULL$, #PB_String_Numeric|#PB_Text_Right)
TextGadget(#Bz_min1, 139, 11, 22, 18, "min")
StringGadget(#Tf_sek1, 164, 8, 21, 22, #NULL$, #PB_String_Numeric|#PB_Text_Right)
TextGadget(#Bz_sek1, 187, 11, 7, 18, "s")
StringGadget(#Tf_tsek1, 198, 8, 27, 22, #NULL$, #PB_String_Numeric)
TextGadget(#Bz_tsek1, 228, 11, 42, 18, "/1000 s")
TextGadget(#Bz_Ztpkt_2, 7, 40, 71, 16, "Zeitpunkt 2:")
StringGadget(#Tf_h2, 85, 37, 14, 22, #NULL$, #PB_String_Numeric)
TextGadget(#Bz_h2, 102, 40, 7, 18, "h")
StringGadget(#Tf_min2, 115, 37, 21, 22, #NULL$, #PB_String_Numeric|#PB_Text_Right)
TextGadget(#Bz_min2, 139, 40, 22, 18, "min")
StringGadget(#Tf_sek2, 164, 37, 21, 22, #NULL$, #PB_String_Numeric|#PB_Text_Right)
TextGadget(#Bz_sek2, 187, 40, 7, 18, "s")
StringGadget(#Tf_tsek2, 198, 37, 27, 22, #NULL$, #PB_String_Numeric)
TextGadget(#Bz_tsek2, 228, 40, 42, 18, "/1000 s")
Frame3DGadget(#Ra_Erg, 10, 65, 149, 49, "Ergebnis")
TextGadget(#Bz_Erg, 49, 87, 68, 16, #NULL$, #PB_Text_Center)
ButtonGadget(#Sf_Berechne, 172, 73, 98, 40, "Berechnen")

Define.b std1, std2, estd, min1, min2, emin
Define.u Fe
Define.d sek1, sek2, gsek1, gsek2, diff 
Define.s Erg

Repeat
  Fe = WaitWindowEvent()
  If Fe = #Sf_Berechne
    std1 = Val(GetGadgetText(#Tf_h1))
    std2 = Val(GetGadgetText(#Tf_h2))
    min1 = Val(GetGadgetText(#Tf_min1))
    min2 = Val(GetGadgetText(#Tf_min2))
    sek1 = Val(GetGadgetText(#Tf_sek1)) + Val("." + GetGadgetText(#Tf_tsek1))
    sek2 = Val(GetGadgetText(#Tf_sek2)) + Val("." + GetGadgetText(#Tf_tsek2))
    
X  gsek1 = std1*3600 + min1*60 + sek1
    gsek2 = std2*3600 + min2*60 + sek2
    diff = Abs(gsek1 - gsek2)
    If diff >= 3600
      estd = Int(diff/3600)
      diff = Mod(diff, 3600)
    EndIf
    If diff >= 60
      emin = Int(diff/60)
      diff = Mod(diff, 60)
    EndIf
    
    If estd > 0
      Erg = StrU(estd, #PB_Byte) + " h" + StrU(emin, #PB_Byte) + " min"
    EndIf
    If estd = 0 And emin > 0
      Erg = StrU(emin, #PB_Byte) + " min"
    EndIf
    SetGadgetText(#Bz_Erg, Erg)
  EndIf
Until Fe = #PB_Event_CloseWindow
Der Vollständigkeit halber: Das Programm soll die Differenz zwischen zwei Zeitpunkten A und B berechnen, wobei A und B Werte in Stunden, Minuten Sekunden und Tausendstelsekunden darstellen. Ein solches Programm ist nützlich, wenn man bei Asynchronitäten von Untertiteln und Bild den Versatzwert braucht.
Ich versuche nun schon seit einer Stunde, wie ich das Programm in der mit "X" markierten Zeile anhalten lassen kann, um dann im Variablenfenster die Werte der berechneten Variablen beobachten zu können. Ich habe in dieser Zeile selbstverständlichen einen Haltepunkt gesetzt; aber das nützt nicht viel. Nach dem Compilieren (F5) springt das Programm wild in der Repeat-Until-Schleife herum, ohne jemals in der besagten Zeile anzuhalten.

Überhaupt würde ich gern den Programmablauf vom Start weg im Einzelschrittverfahren abarbeiten können (wie dies in Visual Basic problemlos mittels F8 möglich ist), aber F8 ist bei mir im Editor vor dem Debuggen immer deaktiviert. Was mache ich verkehrt?

Vielen Dank
PureBasic v5.11 x64
Windows 7 64-Bit
AMD FX-8350 Eight-Core Processor 4 GHz, 8 GB Arbeitsspeicher
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: Variablenbeobachtung in einer Repeat-Until-Ereignisstruk

Beitrag von CSHW89 »

WaitWindowEvent gibt dir zunächst erstmal die Art eines Events zurück (z.b. #PB_Event_Gadget, #PB_Event_CloseWindow), nicht direkt die Gadgetnummer. Falls ein Gadget ein Event ausgelöst hat (der relevante Fall für dich), kannst du dann mit EventGadget die Nummer deines Gadgets ermitteln (ungetestet):

Code: Alles auswählen

EnableExplicit

Enumeration
  #Hf
  #Bz_Ztpkt_1
  #Tf_h1
  #Bz_h1
  #Tf_min1
  #Bz_min1
  #Tf_sek1
  #Bz_sek1
  #Tf_tsek1
  #Bz_tsek1
  #Bz_Ztpkt_2
  #Tf_h2
  #Bz_h2
  #Tf_min2
  #Bz_min2
  #Tf_sek2
  #Bz_sek2
  #Tf_tsek2
  #Bz_tsek2
  #Ra_Erg
  #Bz_Erg
  #Sf_Berechne
EndEnumeration

LoadFont(1, "WH12G", 8)
OpenWindow(#Hf, 460, 406, 281, 125, "Differenz", #PB_Window_SystemMenu|#PB_Window_TitleBar )
SetGadgetFont(#Bz_Ztpkt_1, 1)
TextGadget(#Bz_Ztpkt_1, 7, 11, 71, 16, "Zeitpunkt 1:")
StringGadget(#Tf_h1, 85, 8, 14, 22, #NULL$, #PB_String_Numeric)
TextGadget(#Bz_h1, 102, 11, 7, 18, "h")
StringGadget(#Tf_min1, 115, 8, 21, 22, #NULL$, #PB_String_Numeric|#PB_Text_Right)
TextGadget(#Bz_min1, 139, 11, 22, 18, "min")
StringGadget(#Tf_sek1, 164, 8, 21, 22, #NULL$, #PB_String_Numeric|#PB_Text_Right)
TextGadget(#Bz_sek1, 187, 11, 7, 18, "s")
StringGadget(#Tf_tsek1, 198, 8, 27, 22, #NULL$, #PB_String_Numeric)
TextGadget(#Bz_tsek1, 228, 11, 42, 18, "/1000 s")
TextGadget(#Bz_Ztpkt_2, 7, 40, 71, 16, "Zeitpunkt 2:")
StringGadget(#Tf_h2, 85, 37, 14, 22, #NULL$, #PB_String_Numeric)
TextGadget(#Bz_h2, 102, 40, 7, 18, "h")
StringGadget(#Tf_min2, 115, 37, 21, 22, #NULL$, #PB_String_Numeric|#PB_Text_Right)
TextGadget(#Bz_min2, 139, 40, 22, 18, "min")
StringGadget(#Tf_sek2, 164, 37, 21, 22, #NULL$, #PB_String_Numeric|#PB_Text_Right)
TextGadget(#Bz_sek2, 187, 40, 7, 18, "s")
StringGadget(#Tf_tsek2, 198, 37, 27, 22, #NULL$, #PB_String_Numeric)
TextGadget(#Bz_tsek2, 228, 40, 42, 18, "/1000 s")
Frame3DGadget(#Ra_Erg, 10, 65, 149, 49, "Ergebnis")
TextGadget(#Bz_Erg, 49, 87, 68, 16, #NULL$, #PB_Text_Center)
ButtonGadget(#Sf_Berechne, 172, 73, 98, 40, "Berechnen")

Define.b std1, std2, estd, min1, min2, emin
Define.u Fe
Define.d sek1, sek2, gsek1, gsek2, diff
Define.s Erg

Repeat
  Fe = WaitWindowEvent()
  If Fe = #PB_Event_Gadget                      ;<<<<<==============
    If (EventGadget() = #Sf_Berechne)        ;<<<<<==============
      std1 = Val(GetGadgetText(#Tf_h1))
      std2 = Val(GetGadgetText(#Tf_h2))
      min1 = Val(GetGadgetText(#Tf_min1))
      min2 = Val(GetGadgetText(#Tf_min2))
      sek1 = Val(GetGadgetText(#Tf_sek1)) + Val("." + GetGadgetText(#Tf_tsek1))
      sek2 = Val(GetGadgetText(#Tf_sek2)) + Val("." + GetGadgetText(#Tf_tsek2))
   
      gsek1 = std1*3600 + min1*60 + sek1
      gsek2 = std2*3600 + min2*60 + sek2
      diff = Abs(gsek1 - gsek2)
      If diff >= 3600
        estd = Int(diff/3600)
        diff = Mod(diff, 3600)
      EndIf
      If diff >= 60
        emin = Int(diff/60)
        diff = Mod(diff, 60)
      EndIf
     
      If estd > 0
        Erg = StrU(estd, #PB_Byte) + " h" + StrU(emin, #PB_Byte) + " min"
      EndIf
      If estd = 0 And emin > 0
        Erg = StrU(emin, #PB_Byte) + " min"
      EndIf
      SetGadgetText(#Bz_Erg, Erg)
    EndIf
  EndIf
Until Fe = #PB_Event_CloseWindow
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Demivec
Beiträge: 49
Registriert: 22.02.2008 20:49
Wohnort: Utah, USA

Re: Variablenbeobachtung in einer Repeat-Until-Ereignisstruk

Beitrag von Demivec »

Code: Alles auswählen

;X  
    CallDebugger
    gsek1 = std1*3600 + min1*60 + sek1
    gsek2 = std2*3600 + min2*60 + sek2
Bild
Salafat
Beiträge: 30
Registriert: 05.01.2012 07:40
Computerausstattung: AMD FX-8350 Eight-Core-Prozessor 4,00 GHz
8 GB RAM
Windows 7 64-Bit
Wohnort: Berlin

Re: Variablenbeobachtung in einer Repeat-Until-Ereignisstruk

Beitrag von Salafat »

Danke, CSHW89. Da in Fe nicht die Gadget-Nummer, sondern der Event-Typ abgelegt wird, konnte die Bedingungsabfrage nicht funktionieren. Da es nur einen Button in meinem Fenster gibt und folglich nur ein relevantes Ereignis, habe ich Deine zwei Bedingungsabfragen mittels And zu einer zusammengezogen:

Code: Alles auswählen

Repeat
  Fe = WaitWindowEvent()
  If Fe = #PB_Event_Gadget And EventGadget() = #Sf_Berechne
    std1 = Val(GetGadgetText(#Tf_h1))
  …
  EndIf
Until Fe = #PB_Event_CloseWindow
Edit by NicTheQuick: Quote-Tags zu Code-Tags geändert.
PureBasic v5.11 x64
Windows 7 64-Bit
AMD FX-8350 Eight-Core Processor 4 GHz, 8 GB Arbeitsspeicher
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Variablenbeobachtung in einer Repeat-Until-Ereignisstruk

Beitrag von bobobo »

übrigens eins der Vorteile des ansonsten so vielgeschmähten eingebauten VisualDesigners

bei den VD Projekt-Optionen

Menü [Projekt]
Eintrag [Project options]
CheckBox 'Include event loop' angehakt

erzeugt man damit zumindest ein Grundgerüst
(ein Fenster mit einem Button reicht ja erstmal)
was auch recht gut eine mögliche Eventbehandlung darstellt.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Variablenbeobachtung in einer Repeat-Until-Ereignisstruk

Beitrag von Bisonte »

Programmierer sind faul ! Also baut man sich nen "Codebaustein" und fügt ihn in die Werkzeugtafel der IDE ein ;)
So sieht mein Baustein aus, so hab ich immer flink alles zusammen...per Doppelklick...
Ist natürlich für meine "Bedürfnisse"... ;)

Aber diese "Templates" der IDE sind nützlich für so faule wie mich :oops:

Code: Alles auswählen

; ____________________________________________________________________________________________________
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
EnableExplicit
;
Procedure CreateWindow(Window, x, y, w, h, Title.s, Flags = #PB_Window_SystemMenu|#PB_Window_ScreenCentered, ParentWindow = 0)
  
  Protected hWnd
  
  If ParentWindow
    If IsWindow_(ParentWindow)
      hWnd = OpenWindow(Window,x,y,w,h,Title,Flags,ParentWindow)
    EndIf
  Else
    hWnd = OpenWindow(Window,x,y,w,h,Title,Flags)
  EndIf
  
  If Window = #PB_Any : Window = hWnd : EndIf
  
  If IsWindow(Window)
    AddKeyboardShortcut(Window,#PB_Shortcut_Escape, 63999)
  Else
    ProcedureReturn #False
  EndIf
  
  ProcedureReturn hWnd
  
EndProcedure
Procedure MainEventloop(Window, TimeOut = 25)
  
  Protected Quit, Event
  
  If IsWindow(Window)
    Repeat
      Event = WaitWindowEvent(TimeOut)
      
      Select Event
        Case #PB_Event_Gadget
          Select EventGadget()
            Case 0
              ; »»» Hier Gadget 0
              Debug "Gadget 0 löst aus"
          EndSelect
          
        Case #PB_Event_Menu
          Select EventMenu()
            Case 63999
              Quit = 1
          EndSelect
          
        Case #PB_Event_Timer
          Select EventTimer()
            Case 0
              ; »»» Hier Timer 0
          EndSelect
          
        Case #PB_Event_CloseWindow
          Quit = 1
          
      EndSelect
      
    Until Quit > 0

  EndIf
    
EndProcedure
;
DisableExplicit
; ____________________________________________________________________________________________________
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
; Test

Define Window

Window = CreateWindow(#PB_Any,0,0,800,600,"TestWindow")
Debug Window

ButtonGadget(0, 10, 10, 100, 20, "Hallo Welt")

MainEventloop(Window)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Antworten