WaitWindowEvent() und WindowCallback

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

WaitWindowEvent() und WindowCallback

Beitrag 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?
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
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: WaitWindowEvent() und WindowCallback

Beitrag 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.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: WaitWindowEvent() und WindowCallback

Beitrag 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?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Re: WaitWindowEvent() und WindowCallback

Beitrag von dysti »

Danke für die schnelle Antwort.

Das Problem tritt ja bei TS-Soft-Code deutlich hervor:
Die Anzeige "Debug ButtonClick erscheint nicht.
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
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: WaitWindowEvent() und WindowCallback

Beitrag 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.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: WaitWindowEvent() und WindowCallback

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
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: WaitWindowEvent() und WindowCallback

Beitrag 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.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: WaitWindowEvent() und WindowCallback

Beitrag von Kaeru Gaman »

ja bleibens doch kul, nehmens an Keks! Bild
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
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: WaitWindowEvent() und WindowCallback

Beitrag von ts-soft »

lecker :D
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Re: WaitWindowEvent() und WindowCallback

Beitrag 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
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Antworten