Seite 1 von 1

WaitWindowEvent() und WindowCallback

Verfasst: 15.03.2010 15:42
von dysti
Hallo,
normalweise sollte die Abfrage des WindowCallback vor WaitWindowEvent() kommen.
Wenn nun z.B. ein Stringgadget sein Fokus verliert, weil man ein Buttongadget angeklickt hat,
so steht das Ereignis des Stringgadgets vor dem Ereignis des Buttongadgets.

Code: Alles auswählen

SetWindowCallback(@MyWindowCallback())

Event = WaitWindowEvent()
Wie kann man es hinbekommen, das der Buttongadget den Fokus erhält?

Re: WaitWindowEvent() und WindowCallback

Verfasst: 15.03.2010 16:11
von ts-soft
Irgendwie verstehe ich Deine Aussage nicht.

Code: Alles auswählen

OpenWindow(0, #PB_Ignore, #PB_Ignore, 640, 480, "", #PB_Window_SystemMenu)
StringGadget(0, 10, 10, 620, 30, "")
EditorGadget(1, 10, 50, 620, 420)
ButtonGadget(2, 10, 450, 620, 30, "")
SetActiveGadget(0)

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow : Break
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 0
          Select EventType()
            Case #PB_EventType_LostFocus
              Debug "LostFocus"
          EndSelect
        Case 2
          Select EventType()
            Case #PB_EventType_LeftClick
              Debug "ButtonClick"
          EndSelect
      EndSelect
  EndSelect
ForEver
Wenn ich jetzt den Button clicke kommt erst lost_focus, auch ohne Callback
Und der Button hat anschließend automatisch den focus.

Gruß
Thomas


PS: Dein Beispielcode ist mal wieder ein Witz /:->
naja, die Frage ist genauso unklar.

Re: WaitWindowEvent() und WindowCallback

Verfasst: 15.03.2010 16:18
von Kaeru Gaman
das Setzen des Callbacks muss natürlich vor der Aktualisierung des Events kommen,
weil es vor der Schleife erfolgen muss, in der es präsent sein soll,
die Abfrage des WindowEvents erfolgt hingegen in der Schleife,
weil es ein Schritt ist der wiederholt ausgeführt werden muss.

... klärt das dein Verständnisproblem mit der Reihenfolge?

Re: WaitWindowEvent() und WindowCallback

Verfasst: 15.03.2010 17:17
von dysti
Danke für die schnelle Antwort.

Das Problem tritt ja bei TS-Soft-Code deutlich hervor:
Die Anzeige "Debug ButtonClick erscheint nicht.

Re: WaitWindowEvent() und WindowCallback

Verfasst: 15.03.2010 17:24
von ts-soft
dysti hat geschrieben:Danke für die schnelle Antwort.

Das Problem tritt ja bei TS-Soft-Code deutlich hervor:
Die Anzeige "Debug ButtonClick erscheint nicht.
Ich weiß ja nicht was bei Dir kaputt ist:
Debugger hat geschrieben:LostFocus
ButtonClick
Vielleicht bringst auch was mit Profan durcheinander. Focus <> Buttonclick,
also Focus setzen erzeugt keinen Click.

Re: WaitWindowEvent() und WindowCallback

Verfasst: 15.03.2010 18:33
von Kaeru Gaman
dysti hat geschrieben:Das Problem tritt ja bei TS-Soft-Code deutlich hervor:
Die Anzeige "Debug ButtonClick erscheint nicht.
click doch mal auf den Button, dann erscheint auch die Anzeige "ButtonClick" im Debugger...
Wie kann man es hinbekommen, das der Buttongadget den Fokus erhält?
indem man draufklickt,
indem man mit [Tab] draufgeht (im Falle von ts' Beispiel rückwärts (shift-Tab),
oder indem man Zeile 5 von ts' Beispiel auf

Code: Alles auswählen

SetActiveGadget(2)
ändert.


... was das Alles jetzt aber mit nem Callback zu tun hat, bleibt mir schleierhaft...

Re: WaitWindowEvent() und WindowCallback

Verfasst: 15.03.2010 18:36
von ts-soft
Es fehlt immer noch sein Beispiel! Dieses Ratespiel kotzt mich an. Wir sind zwar im Anfängerforum,
aber Dysti klebt ja keine Eierschale mehr an den Ohren.

Re: WaitWindowEvent() und WindowCallback

Verfasst: 15.03.2010 18:45
von Kaeru Gaman
ja bleibens doch kul, nehmens an Keks! Bild

Re: WaitWindowEvent() und WindowCallback

Verfasst: 15.03.2010 18:54
von ts-soft
lecker :D

Re: WaitWindowEvent() und WindowCallback

Verfasst: 15.03.2010 20:37
von dysti
..OK, bekomme keinen :cry: Bitte um Entschuldigung :praise:
Also, ich hatte gedacht, das der Callback mehr Gewicht hat.
Wenn der Button "Schließen" angekickt wird, soll trotz der Abfrage von Lastfocus sich das Fenster schließen.
Ich bekomme es nicht gebacken. :oops:

Code: Alles auswählen

Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Button_Close
  #String_0
  #String_1
EndEnumeration


Procedure ueberpruefen()
  ; Achtung hier Ermittlung der richtigen Zifferanzahl
  Protected aFeld, iFeld$, n
  If (EventType() = #PB_EventType_LostFocus)
    aFeld  = EventGadget()
    iFeld$ = GetGadgetText(aFeld)
    If (Len(iFeld$) > 0) And (Len(iFeld$) < 5)
      MessageRequester("Fehler", "Zahl zu klein")
      SetActiveGadget(aFeld)
    ElseIf (Len(iFeld$) > 7)
      MessageRequester("Fehler", "Zahl zu groß")
      SetGadgetText(aFeld, "")
      SetActiveGadget(aFeld)
    EndIf
  Else
    
      SetGadgetColor(#string_0, #PB_Gadget_BackColor, -1)
      SetGadgetColor(#string_1, #PB_Gadget_BackColor, -1)
    
  EndIf
EndProcedure

Procedure MyWindowCallback(WindowID, Message, wParam, lParam)
Result = #PB_ProcessPureBasicEvents

           Select Message
              Case #WM_COMMAND
              Select (wParam&$FFFF)
              Case #BUTTON_CLOSE
       
              Debug "BUTTON_CLOSE"
              
              EndSelect
              
              Case #WM_LBUTTONUP
              
              Debug "Hallo Mouse hier bin ich"
               
          EndSelect 

          Select wParam
              Case GadgetID(#BUTTON_CLOSE)
              
              ;MessageRequester("Button","Hallo hier bin ich")
              
          EndSelect 
          
  
  
  ProcedureReturn Result
EndProcedure


If OpenWindow(#Window_0, 248, 16, 600, 150, "Test",  #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget | #PB_Window_TitleBar )

  ButtonGadget(#Button_Close, 450, 50, 100, 50, "Schließen")
  StringGadget(#String_0, 40, 50, 160, 60, "22")
  StringGadget(#String_1, 240, 50, 160, 60, "")
  SetActiveGadget(#String_0)
  
  SetWindowCallback(@MyWindowCallback())
  
  Repeat
    Event = WaitWindowEvent()
    Select Event
    
    Case #WM_LBUTTONUP
          Debug "Maus"
      Case #PB_Event_Gadget
        Select EventGadget()
          Case #String_0
            ueberpruefen()
          Case #String_1
            ueberpruefen()
          Case #BUTTON_CLOSE
            Quit = #True

        EndSelect
    EndSelect
  Until Event = #PB_Event_CloseWindow Or Quit = #True

EndIf
End