Das 2. Gadget wird nicht angezeigt.

Für allgemeine Fragen zur Programmierung mit PureBasic.
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Das 2. Gadget wird nicht angezeigt.

Beitrag 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)
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: Das 2. Gadget wird nicht angezeigt.

Beitrag 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)
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Re: Das 2. Gadget wird nicht angezeigt.

Beitrag von funkheld »

Hallo, danke für die Info.

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

Danke.
Gruss
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Das 2. Gadget wird nicht angezeigt.

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Re: Das 2. Gadget wird nicht angezeigt.

Beitrag von funkheld »

Ja danke für die Hilfe.

Jetzt funktioniert es.

Gruss
Antworten