Seite 2 von 4

Re: Maus loslassen wird null erkannt

Verfasst: 26.12.2020 16:33
von Re42
#WM_LBUTTONUP kann DOCH abgefragt werden, nur nicht in einem bestimmten verschachtelten IF-Endif-Bereich, obwohl die Werte, die weiterverarbeitet werden sollen, genau richtig da ankommen.

Der Abschnitt sieht so aus:

Code: Alles auswählen

If bs <> vs
  If ((wmx > 280 And wmx < 320) Or (wmx > 330 And wmx < 370)) And (wmy > 250 And wmy < 290)
     If event = #WM_LBUTTONUP
       debug event
     EndIf 
  EndIf
EndIf
Wenn ich

Code: Alles auswählen

If event = #WM_LBUTTONUP
  debug event
EndIf
direkt über den obigen Code-Abschnitt schreibe, funkioniert die Abfrage, nur nicht da, wo sie funktionieren soll. Selbsteverständlich wird der betreffende Abschnitt innerhalb der if-endif-Verschachtelung erreicht, aber dann funktioniert das nicht mehr. Wie gesagt, in meinem Parallelprogramm funktioniert dieser Abschnitt einwandfrei. Es werden da zwei Schalter auf einem WindowedScreen abgefragt (jeweils erstellt mit 4 Linien) , aber zur Gesamtsteuerung ist in dem Fall die Abfrage der wieder losgelassenen Maus unerläßlich. Ich arbeite da nur mit der Windows-Maus, weil ich das auch bei WindowedScreens immer so gemacht hatte und das ging ja auch immer.

Re: Maus loslassen wird null erkannt

Verfasst: 26.12.2020 16:55
von Mijikai
Bitte die OS-Events richtig Abfragen (via WinApi bzw. über einen Callback).

Re: Maus loslassen wird null erkannt

Verfasst: 26.12.2020 16:58
von ccode_new
Versuch mal:

Code: Alles auswählen

if Event() = #WM_LBUTTONUP
Und, Quatsch?
Oder wurde etwas über Gültigkeitsbereiche von deklarierten Variablen gelernt?

Re: Maus loslassen wird null erkannt

Verfasst: 26.12.2020 17:27
von Kiffi
@Re42: Ohne lauffähigen Code (wie schon mehrfach erbeten) wird das hier nix und die anderen orakeln sich den Wolf.

Re: Maus loslassen wird null erkannt

Verfasst: 26.12.2020 18:20
von Re42
Ich war zwischendurch angerufen worden, Entschuldigung, aber das Gespräch ist jetzt gerade beendet.

Edit: Edit: Zu früh gefreut! Während meines Telefongesprächs war das mit dem If Event() nur scheinbar gelaufen, weil da in Wirklichkeit noch ein zweiter Debugger lief, der genau den Wert geliefert hatte, auf den ich gewartet hatte. Mit If Event() geht da sogar gar nichts. Ich kann hier jetzt nicht den ganzen Code einstellen, aber ich bereite etwas vor. Also bis später.

Re: Maus loslassen wird null erkannt

Verfasst: 26.12.2020 20:12
von ccode_new
Und?

Ich glaube was ich oben geschrieben habe ist Blödsinn.
(If Event() = ...)

Zähle mal wie viele WindowEvent(), WaitWindowEvent(), Event(), etc. Befehle hast du in der Schleife?
Bei mehr als oder weniger als 1 würde ich mir Gedanken machen.

Re: Maus loslassen wird null erkannt

Verfasst: 26.12.2020 20:45
von Re42
@ccode_new
Einmal WaitWindowEvent()

Ich habe jetzt mal den relevanten Code-Teil herausgezogen. Der Code ist lauffähig und es werden dort zwei Schalter gezeigt, die beim Draufklicken die Farben wechseln. Ziel der Übung soll sein, daß die Schalter entweder grün oder rot werden, aber niemals beide rot. Im Fall beide grün nehmen dann programmseitig beide Schalter einen Blauton an.

Das Problem: Die Abfrage

Code: Alles auswählen

If event = #WM_LBUTTONUP
   schalt = 2
endif
funktioniert nicht. Wie macht man denn nun die Abfrage richtig?

Hier jetzt mal der Code-Teil:

Code: Alles auswählen

If InitMouse() = 0
  MessageRequester("InitMouse fehlgeschlagen", "")
EndIf  

If InitKeyboard() = 0
;MessageRequester("InitKeyboard fehlgeschlagen", "")
EndIf

 If InitSound() = 0
   MessageRequester("Initsound not possible" , "")
 EndIf
   
If InitSprite() = 0
 MessageRequester("InitSprite fehlgeschlagen", "")
EndIf

If OpenWindow(1,0,0,801,412,"",#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered) = 0
 MessageRequester("OpenWindow fehlgeschlagen", "")
EndIf

If OpenWindowedScreen(WindowID(1),0,0,801,412) = 0
 MessageRequester("OpenWindowedScreen fehlgeschlagen", "")
EndIf
   
 StartDrawing(ScreenOutput())
   Box(280,252,40,40,RGB(100,100,220))
   Box(330,252,40,40,RGB(100,100,220))
   
 Line(330-50,251,42,1,RGB(0,0,0)); oben
 Line(330-50,292,42,1,RGB(0,0,0)); unten
 Line(330-50,251,1,42,RGB(0,0,0)); links
 Line(371-50,251,1,42,RGB(0,0,0)); rechts
 
 Line(380-50,251,42,1,RGB(0,0,0)) 
 Line(380-50,292,42,1,RGB(0,0,0))
 Line(380-50,251,1,42,RGB(0,0,0))
 Line(421-50,251,1,42,RGB(0,0,0))
StopDrawing()
  
  Repeat
    ExamineKeyboard()
     event = WaitWindowEvent()
    
      Select event    
        Case #PB_Event_LeftClick
          klvb = 1
          wmx = WindowMouseX(1)    : ;Debug wmx
          wmy = WindowMouseY(1)    : ;Debug wmy
      EndSelect
      
    
       ;Schalter
       If klvb = 1
         klvb = 0
         If schalt = 0
           If (wmx > 280 And wmx < 320) And (wmy > 250 And wmy < 290) And event = #PB_Event_LeftClick
             vs = 1
             bs = 0
             StartDrawing(ScreenOutput())
             Box(280,252,40,40,RGB(0,140,0))
             Box(330,252,40,40,RGB(200,0,0))
             StopDrawing()
           EndIf
           
           If (wmx > 330 And wmx < 370) And (wmy > 250 And wmy < 290) And event = #PB_Event_LeftClick
             vs = 0
             bs = 1
             StartDrawing(ScreenOutput())
             Box(280,252,40,40,RGB(200,0,0))
             Box(330,252,40,40,RGB(0,140,0))
             StopDrawing()
           EndIf
         EndIf  ; If schalt = 0
     
         
           If bs <> vs
             If ((wmx > 280 And wmx < 320) Or (wmx > 330 And wmx < 370)) And (wmy > 250 And wmy < 290)
               If event = #WM_LBUTTONUP
                 schalt = 2
               EndIf 
             EndIf
           EndIf
           
           If bs = vs
             If ((wmx > 280 And wmx < 320) Or (wmx > 330 And wmx < 370)) And (wmy > 250 And wmy < 290)
               If event = #WM_LBUTTONUP
                 schalt = 0
               EndIf 
             EndIf
           EndIf
         
            
         If schalt = 2
           If (wmx > 280 And wmx < 320) And (wmy > 250 And wmy < 290) And event = #PB_Event_LeftClick
             schalt = 1
             If vs = 1
               vs = 0
               bs = 1
               StartDrawing(ScreenOutput())
               Box(330,252,40,40,RGB(0,140,0)) 
               Box(280,252,40,40,RGB(200,0,0))
               StopDrawing()
             Else 
               vs = 1 
               StartDrawing(ScreenOutput())
               Box(280,252,40,40,RGB(0,140,0))
               StopDrawing()
                 If bs = 1
                   StartDrawing(ScreenOutput())
                     Box(330,252,40,40,RGB(0,140,0))
                   StopDrawing()
                   Delay(75)
                   StartDrawing(ScreenOutput())
                     Box(280,252,40,40,RGB(100,100,220))
                     Box(330,252,40,40,RGB(100,100,220))
                   StopDrawing()
                 EndIf
                 
             EndIf
           EndIf
         
           If (wmx > 330 And wmx < 370) And (wmy > 250 And wmy < 290) And event = #PB_Event_LeftClick
             If bs = 1
               bs = 0
               vs = 1
               StartDrawing(ScreenOutput())
               Box(280,252,40,40,RGB(0,140,0))
               Box(330,252,40,40,RGB(200,0,0))
               StopDrawing()
             Else
               bs = 1
               StartDrawing(ScreenOutput())
               Box(330,252,40,40,RGB(0,140,0))
               StopDrawing()
                 If bs = 1
                   StartDrawing(ScreenOutput())
                     Box(280,252,40,40,RGB(0,140,0))
                   StopDrawing()
                   Delay(75)
                   StartDrawing(ScreenOutput())
                     Box(280,252,40,40,RGB(100,100,220))
                     Box(330,252,40,40,RGB(100,100,220))
                   StopDrawing() 
                 EndIf
                 
             EndIf 
           EndIf 
         EndIf ; if schalt = 2 
       EndIf ; If klvb = 1
   
   FlipBuffers()
 Until event = #PB_Event_CloseWindow     
 

Danke für Info.

Re: Maus loslassen wird null erkannt

Verfasst: 26.12.2020 21:19
von ccode_new
/:->
Da liegt aber was auf dem Fenster.

Bei Screen-Anwendungen geht das nicht mehr so:
Hier kannst du so etwas benutzen:

Code: Alles auswählen

If GetAsyncKeyState_(#VK_LBUTTON) & 1 ;Async ist wichtig!
  schalt = 2
  Debug schalt
EndIf
Oder du freundest dich mit der PureBasic-Maus-Bibliothek an.* (ExamineMouse() /ReleaseMouse() / MouseButton())
(*Ich aber nicht)

Re: Maus loslassen wird null erkannt

Verfasst: 26.12.2020 21:24
von STARGÅTE
Ich verstehe gerade nicht wieso du unbedingt #WM_LBUTTONUP nutzen willst.
Das offizielle Event #PB_Event_LeftClick wird genau dann gefeuert, wenn die Maus losgelassen wird (also ein Klick).
Auch #WM_LBUTTONUP wird dann gesendet, aber vor #PB_Event_LeftClick.
Das führt natürlich zu Problemen, wenn du erst danach mit #PB_Event_LeftClick die Mauskoordinaten abfragst (WindowMouseX und WindowMouseY), denn dann haben wmx und wmy noch den "alten" Wert.

Hier die Events die ankommen, wenn die Maus gedrückt wird:
513 ; (#WM_LBUTTONDOWN)
514 ; (#WM_LBUTTONUP)
13112 ; (#PB_Event_LeftClick)
PS: Höre bitte auf PureBasic "zu beleidigen" nur weil du unsere Ratschläge nicht annimmst. (Edit: bezogsich auf ein gelöschen kommentar von Re42)
PSPS: Und höre bitte auf deine Beiträge zu ändern und Sachen zu löschen die Teil der Konversation/Threads waren. (viewtopic.php?p=358580#p358580)

Re: Maus loslassen wird null erkannt

Verfasst: 26.12.2020 21:33
von ccode_new
:o
Halte dich an STARGÅTE.