Mouse X | Y ausgabe wo liegt der fehler?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
benji
Beiträge: 124
Registriert: 01.11.2006 20:23

Mouse X | Y ausgabe wo liegt der fehler?

Beitrag von benji »

heyho!!
Habe ein Programm geschrieben, dass die aktuellen X und Y koordinaten auf dem Bildschirm ausgibt. Ist nichts großes - einfach "mal schnell hingeklatscht"
Funkt sehr gut... einziges problem:
die Y - Anzeige funktioniert nur, wenn ich dauerhaft den string der ausgegeben wird markiere und die linke maustaste gedrückt halte....
warum?!?!
vllt könnt ihrs mir sagen...

Code: Alles auswählen

IncludeFile "MOUSEXY_INC.pb"
Open_Window_0()
InitMouse()
ExamineMouse()
Repeat
  
  Event = WaitWindowEvent()
    
  Y = DesktopMouseY()
SetGadgetText(#Y, Str(Y))
    X = DesktopMouseX()
  SetGadgetText(#X, Str(X))
Until Event = #PB_Event_CloseWindow ; End of the event loop

End
die includefile sieht so aus: (an der liegts vermutlich nicht aber ich hau sie trotzdem mal rein)

Code: Alles auswählen

;
; PureBasic Visual Designer v3.95 build 1485 (PB4Code)


;- Window Constants
;
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #X
  #Y
  #Text_0
  #Text_1
EndEnumeration

;- Fonts
Global FontID1
FontID1 = LoadFont(1, "@Arial Unicode MS", 16, #PB_Font_Bold)

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 508, 58, 177, 91, "Mouse X | Y",  #PB_Window_SystemMenu | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      StringGadget(#X, 10, 10, 120, 30, "", #PB_String_ReadOnly)
      StringGadget(#Y, 10, 50, 120, 30, "", #PB_String_ReadOnly)
      TextGadget(#Text_0, 140, 10, 30, 30, "X")
      SetGadgetFont(#Text_0, FontID1)
      TextGadget(#Text_1, 140, 50, 30, 30, "Y")
      SetGadgetFont(#Text_1, FontID1)
    EndIf
  EndIf
EndProcedure
viele grüße :allright:
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

dein code ist nicht testbar....

ich habe dein include in den IDE kopiert, und deinen oberen code danach reinkopiert,
wobei ich das IncludeFile weggelassen hab.

also, nix anderes als passierenn sollte, wenn ich es getrennt abspeicher.

die fehlermeldung war "OpenScreen() ... must be called before using Mouse Commands"

ja, das wäre leicht für mich auszubügeln, aber wir sind hier nicht bei nem contest.

wenn du ein problem hast, poste bitte einen einzigen lauffähigen code,
der dein problem reproduziert.

sorry, aber sonst könnten wir uns hier als "kristallkugel-abteilung" verdingen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Beitrag von a14xerus »

so gehts:

Code: Alles auswählen

Enumeration ; Windows
  #Window_0
EndEnumeration
Enumeration ; Gadgets
  #X
  #Y
EndEnumeration

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 508, 58, 121, 30, "Mouse X | Y", #PB_Window_SystemMenu | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      TextGadget(#X, 0, 0, 120, 20, "")
      TextGadget(#Y, 0, 20, 120, 20, "")
    EndIf
  EndIf
EndProcedure

Open_Window_0()

Repeat
  
  Event = WindowEvent()
  
  SetGadgetText(#X, "X: "+Str(DesktopMouseX()))
  SetGadgetText(#Y, "Y: "+Str(DesktopMouseY()))
  Delay(10)
Until Event = #PB_Event_CloseWindow ; End of the event loop

End
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

guten morgen!

also, frisch ausgeschlafen, zeit, neuen senf dazuzugeben.

ganz klar, wie axerus erkannt hat, es liegt am WaitWindowEvent.

aber, da dann ein einfaches WindowEvent reinzuhaun, und auf der CPU ein Ei zu braten,
halte ich für weniger konstruktiv.

da empfehle ich dann eher ein WaitWindowEvent(50)


trotzdem

grundsätzlich sollte man codes posten, die das aktuelle problem schildern,
und nicht hundert andere bugs produzieren.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Mouse X | Y ausgabe wo liegt der fehler?

Beitrag von edel »

benji hat geschrieben:[...]
die Y - Anzeige funktioniert nur, wenn ich dauerhaft den string der ausgegeben wird markiere und die linke maustaste gedrückt halte....
warum?!?!
vllt könnt ihrs mir sagen...
Funktionen wie SetGadgetText loesen Events aus, deine Event Schleife
produziert also bei jedem Durchlauf neue Events und dein Fenster wird
dadurch nur so mit Events vollgestopft, wodurch es eben zu solchen
Darstellungsfehlern kommt.

Auch der Vorschlag von a14xerus ist so nicht zu gebrauchen,
auch nicht mit WaitwindowEvent und einem Timeout.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

nö... sorry edel, da bin ich letztens auch drauf reingefallen...

ja, es gibt gadget-aktualisierungen, die ein event auslösen,
aber ein SetGadgetText bei einem Textgadget tut das nicht.

a14xerus' beispiel funktioniert so wie es ist,
mit einem WaitWindowEvent(50) lediglich CPU schonender aber genauso gut.

würde die event-queue überlaufen, würde das zweite gadget niemals aktualisiert werden.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
benji
Beiträge: 124
Registriert: 01.11.2006 20:23

Beitrag von benji »

erst mal vielen dank... :)
ich poste jetzt nochmal hier den veränderten Code (WaitwindowEvent(50))
der code ist lauffähig (getestet in PB4.01)
Tut mir leid... dass der vorhergehende Code kaputt war...

Code: Alles auswählen

Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #X
  #Y
  #Text_0
  #Text_1
EndEnumeration

;- Fonts
Global FontID1
FontID1 = LoadFont(1, "@Arial Unicode MS", 16, #PB_Font_Bold)

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 508, 58, 177, 91, "Mouse X | Y",  #PB_Window_SystemMenu | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      StringGadget(#X, 10, 10, 120, 30, "", #PB_String_ReadOnly)
      StringGadget(#Y, 10, 50, 120, 30, "", #PB_String_ReadOnly)
      TextGadget(#Text_0, 140, 10, 30, 30, "X")
      SetGadgetFont(#Text_0, FontID1)
      TextGadget(#Text_1, 140, 50, 30, 30, "Y")
      SetGadgetFont(#Text_1, FontID1)
    EndIf
  EndIf
EndProcedure



Open_Window_0()
 InitMouse()
ExamineMouse()
Repeat ; Start of the event loop
  
  Event = WaitWindowEvent(50) ; This line waits until an event is received from Windows
  
  WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures
  
  GadgetID = EventGadget() ; Is it a gadget event?
  
  EventType = EventType() ; The event type
  
  ;You can place code here, and use the result as parameters for the procedures
  
  Y = DesktopMouseY()
SetGadgetText(#Y, Str(Y))
    X = DesktopMouseX()
  SetGadgetText(#X, Str(X))

Until Event = #PB_Event_CloseWindow ; End of the event loop

End
das Problem besteht immernoch -_- hab ich etwas falschbessert?!
oder was ist los?
vllt versteht ihr was ich meine, wenn ihr das Programm ausführt.

grüße, benji
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

ExamineMouse() ? :?
Windows 10 Pro, 64-Bit / Outtakes | Derek
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

also, bei mir meckert er, dass du keinen screen aufgemacht hast,
aber ExamineMouse() verwenden willst.

InitMouse und ExamineMouse brauchst du nicht für die Mausabfrage auf Desktop und/oder Window, nur aufm screen.

so, wenn ich die beiden überflüssigen mouse-commands rausschmeiße,
dann läuft das programm immerhin, jetzt kommt aber das eigentlich problem zum tragen:

wie edel sagte, auf bestimmten Gadgets werden von SetGatgedText()-commands Events erzeugt.
auf TextGadgets nicht, aber auf Stringgadgets.

@edel
yo sorry, er verwendet ja tatsächlich StringGadgets...
nur axerus hat textgadgets verwendet in seinem beispiel..


@benji

also, du darfst die stringgadgets nur dann aktualisieren,
wenn kein anderes ereignis anliegt, wenn er wirklich ausm timer kommt.
du musst also vorher auf Event = 0 prüfen.

Code: Alles auswählen

Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #X
  #Y
  #Text_0
  #Text_1
EndEnumeration

;- Fonts
Global FontID1
FontID1 = LoadFont(1, "@Arial Unicode MS", 16, #PB_Font_Bold)

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 508, 58, 177, 91, "Mouse X | Y",  #PB_Window_SystemMenu | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      StringGadget(#X, 10, 10, 120, 30, "", #PB_String_ReadOnly)
      StringGadget(#Y, 10, 50, 120, 30, "", #PB_String_ReadOnly)
      TextGadget(#Text_0, 140, 10, 30, 30, "X")
      SetGadgetFont(#Text_0, FontID1)
      TextGadget(#Text_1, 140, 50, 30, 30, "Y")
      SetGadgetFont(#Text_1, FontID1)
    EndIf
  EndIf
EndProcedure

Open_Window_0()

Repeat ; Start of the event loop
 
  Event = WaitWindowEvent(50) ; This line waits until an event is received from Windows
  WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures
  GadgetID = EventGadget() ; Is it a gadget event?
  EventType = EventType() ; The event type
 
  If Event = 0
    Y = DesktopMouseY()
    SetGadgetText(#Y, Str(Y))
    X = DesktopMouseX()
    SetGadgetText(#X, Str(X))
  EndIf 

Until Event = #PB_Event_CloseWindow ; End of the event loop

End
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
benji
Beiträge: 124
Registriert: 01.11.2006 20:23

Beitrag von benji »

verstehe :)
vielen dank mann :D

Problem gelöst und verstanden :allright:
Antworten