Seite 1 von 1

Variablenbeobachtung in einer Repeat-Until-Ereignisstruktur

Verfasst: 25.06.2012 02:09
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

Re: Variablenbeobachtung in einer Repeat-Until-Ereignisstruk

Verfasst: 25.06.2012 02:21
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

Re: Variablenbeobachtung in einer Repeat-Until-Ereignisstruk

Verfasst: 25.06.2012 06:09
von Demivec

Code: Alles auswählen

;X  
    CallDebugger
    gsek1 = std1*3600 + min1*60 + sek1
    gsek2 = std2*3600 + min2*60 + sek2

Re: Variablenbeobachtung in einer Repeat-Until-Ereignisstruk

Verfasst: 27.06.2012 00:55
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.

Re: Variablenbeobachtung in einer Repeat-Until-Ereignisstruk

Verfasst: 27.06.2012 13:21
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.

Re: Variablenbeobachtung in einer Repeat-Until-Ereignisstruk

Verfasst: 28.06.2012 15:18
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)