Seite 1 von 1

Das 2. Gadget wird nicht angezeigt.

Verfasst: 15.05.2016 12:03
von funkheld
Hallo, guten Tag.

Das 2. Gadget str_1 wird nicht angezeigt.
SetGadgetText(#str_1,Str(PeekL(*MemoryID+4)))

Woran liegt das bitte?
Wenn ich die hier rein setze "Case #PB_Event_Gadget", sind sie sichtbar, aber die Zahlenausgabe funktioniert da drin nicht fortlaufend, sondern nur wenn ich den Regler bewege.

Danke.
Gruss.

Code: Alles auswählen

XIncludeFile "filemap.pbi"

Global angle.f,delta.f,vr.l

Enumeration
  #Window_0
  #track_h
  #track_v
  #track_h1
  #track_v1
  #vor
  #zur
  #str_0
  #str_1
EndEnumeration

*MemoryID = AllocateMemory(1024)
Define *MemoryID = FileMap::Create("MyMemory", 1024)

OpenWindow(#Window_0,20,100,400,400,"filemap-send-sprite", #PB_Window_SystemMenu)

TrackBarGadget(#track_h, 20, 20, 200, 20, 0, 360)
TrackBarGadget(#track_v, 120, 40, 20,100, 0, 50,#PB_TrackBar_Vertical)

TrackBarGadget(#track_h1, 20, 20, 200, 20, 0, 360)
TrackBarGadget(#track_v1, 120, 40, 20,100, 0, 50,#PB_TrackBar_Vertical)


ButtonGadget(#vor, 180,80, 40, 20, "vor")
ButtonGadget(#zur, 180,100, 40, 25, "zurück")

StringGadget(#str_0, 280,  20, 100, 20, "")
StringGadget(#str_1, 280,  60, 100, 20, "")

;RunProgram("d:\purebasic\pure-exe\filemap-empfaenger-sprite1.exe")

Repeat  
  Event = WaitWindowEvent(1)
  
  Select Event
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()

     SetGadgetText(#str_0,Str(PeekL(*MemoryID+8)))
  SetGadgetText(#str_1,Str(PeekL(*MemoryID+4)))
      
      If EventGadget =  #vor
        vr=0
      EndIf
      
      If EventGadget =  #zur
        vr=1
      EndIf
      
      If vr=0
        delta = GetGadgetState(#track_v) /10 
      ElseIf vr=1  
        delta = -GetGadgetState(#track_v) /10 
      EndIf  
      angle = GetGadgetState(#track_h) 
      
      
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        CloseWindow(#Window_0)
        Break
      EndIf
  EndSelect 
  
  SetGadgetText(#str_0,Str(PeekL(*MemoryID+8)))
  SetGadgetText(#str_1,Str(PeekL(*MemoryID+4)))
  PokeF(*MemoryID+0,delta)
  PokeF(*MemoryID+4,angle)
ForEver 

FileMap::Close(*MemoryID)

Re: Das 2. Gadget wird nicht angezeigt.

Verfasst: 15.05.2016 13:47
von matbal
Das Problem ist, daß mit SetGadgetText() gleichzeitig auch Events erzeugt werden. Wenn in jedem Scheifendurchlauf zwei SetGadgetText() stehen, werden in jedem Scheifendurchlauf zwei neue Events erstellt. Ein Event wird verarbeitet, gleichzeitig entstehen zwei neue. Die Eventschleife wird nicht fertig...

Hier ein ganz einfacher Code, der zeigt, daß die Schleife durch das SetGadgetText nicht mehr zur Ruhe kommt, trotz WaitWindowEvent().

Code: Alles auswählen

OpenWindow(0, 100, 100, 400, 300, "Fenster")

StringGadget(0, 10, 10, 100, 20, "String")

Define n  ; Schleifenzähler

Repeat
   
   Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
         Break
   EndSelect
   
   SetGadgetText(0, "Hallo")
   
   n + 1    ; Schleifenzähler 
   Debug n
ForEver
Das läßt sich aber leicht mit einem Timer umgehen.

Code: Alles auswählen

XIncludeFile "filemap.pbi"

Global angle.f,delta.f,vr.l

Enumeration
   #Window_0
   #track_h
   #track_v
   #track_h1
   #track_v1
   #vor
   #zur
   #str_0
   #str_1
   #timer
EndEnumeration

*MemoryID = AllocateMemory(1024)
Define *MemoryID = FileMap::Create("MyMemory", 1024)

OpenWindow(#Window_0,20,100,400,400,"filemap-send-sprite", #PB_Window_SystemMenu)

TrackBarGadget(#track_h, 20, 20, 200, 20, 0, 360)
TrackBarGadget(#track_v, 120, 40, 20,100, 0, 50,#PB_TrackBar_Vertical)

TrackBarGadget(#track_h1, 20, 20, 200, 20, 0, 360)
TrackBarGadget(#track_v1, 120, 40, 20,100, 0, 50,#PB_TrackBar_Vertical)


ButtonGadget(#vor, 180,80, 40, 20, "vor")
ButtonGadget(#zur, 180,100, 40, 25, "zurück")

StringGadget(#str_0, 280,  20, 100, 20, "")
StringGadget(#str_1, 280,  60, 100, 20, "1")

;RunProgram("d:\purebasic\pure-exe\filemap-empfaenger-sprite1.exe")

AddWindowTimer(#Window_0, #timer, 10)

Repeat  
   Event = WaitWindowEvent()
   
   Select Event
      Case #PB_Event_Gadget
         EventGadget = EventGadget()
         EventType = EventType()
         
         SetGadgetText(#str_0,Str(PeekL(*MemoryID+8)))
         SetGadgetText(#str_1,Str(PeekL(*MemoryID+4)))
         
         If EventGadget =  #vor
            vr=0
         EndIf
         
         If EventGadget =  #zur
            vr=1
         EndIf
         
         If vr=0
            delta = GetGadgetState(#track_v) /10 
         ElseIf vr=1  
            delta = -GetGadgetState(#track_v) /10 
         EndIf  
         angle = GetGadgetState(#track_h) 
      Case #PB_Event_Timer
         Select EventTimer()
            Case #timer
               SetGadgetText(#str_0,Str(PeekL(*MemoryID+8)))
               SetGadgetText(#str_1,Str(PeekL(*MemoryID+4)))
               PokeF(*MemoryID+0,delta)
               PokeF(*MemoryID+4,angle)         
         EndSelect
         
      Case #PB_Event_CloseWindow
         EventWindow = EventWindow()
         If EventWindow = #Window_0
            CloseWindow(#Window_0)
            Break
         EndIf
   EndSelect 
ForEver 

FileMap::Close(*MemoryID)

Re: Das 2. Gadget wird nicht angezeigt.

Verfasst: 15.05.2016 14:22
von funkheld
Hallo, danke für die Info.

Das habe ich nicht geahnt, das sich die Evenst im Wege stehen.

Danke.
Gruss

Re: Das 2. Gadget wird nicht angezeigt.

Verfasst: 15.05.2016 15:17
von ts-soft

Code: Alles auswählen

Define *MemoryID = FileMap::Create("MyMemory", 1024)
Ich hoffe mal, das "MyMemory" nur in diesem Beispiel genutzt wird, weil es ist natürlich erforderlich, einen "einmaligen" String zu nutzen,
der nicht nochmal auf dem PC auftaucht!

Am einfachsten nimmt man eine GUID: http://www.purebasic.fr/german/viewtopi ... hilit=guid

Zu Deinem eigentlichen Problem wurde ja bereits alles gesagt, in so fern nur soviel: Keinen Code außerhalb von Events!

Code: Alles auswählen

Repeat
  ...
->  SetGadgetText(#str_0,Str(PeekL(*MemoryID+8)))
->  SetGadgetText(#str_1,Str(PeekL(*MemoryID+4)))
->  PokeF(*MemoryID+0,delta)
->  PokeF(*MemoryID+4,angle)
ForEver

Re: Das 2. Gadget wird nicht angezeigt.

Verfasst: 15.05.2016 17:58
von funkheld
Ja danke für die Hilfe.

Jetzt funktioniert es.

Gruss