Seite 1 von 2

BindgadgetEvent und Rückgabe einer Textvariable

Verfasst: 12.07.2016 15:53
von schleicher
Ich lasse mit BindgadgetEvent alle meine Unterfenster in der Hauptschleife laufen. Wie erreiche ich , das das ein Button das mit Bindgadgetevent verbunden ist z.B. ProcedureReturn eingabevomstringgadget.s zurückgibt ? Bei einer nomalen Procedure hat da immer finktioniert (Hauptschleife läuft auch in einer Procedure)

Re: BindgadgetEvent und Rückgabe einer Textvariable

Verfasst: 12.07.2016 16:09
von RSBasic
Falls ich dich richtig verstanden haben sollte:

Code: Alles auswählen

EnableExplicit

Procedure Button_Click()
  Debug GetGadgetText(1)
EndProcedure

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  StringGadget(1, 10, 10, 100, 20, "Eingabe", 0)
  ButtonGadget(2, 120, 10, 100, 20, "Button", 0)
  
  BindGadgetEvent(2, @Button_Click())
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf
Oder:

Code: Alles auswählen

EnableExplicit

Procedure Button_Click()
  Debug GetGadgetText(GetGadgetData(EventGadget()))
EndProcedure

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  StringGadget(1, 10, 10, 100, 20, "Eingabe", 0)
  ButtonGadget(2, 120, 10, 100, 20, "Button", 0)
  
  SetGadgetData(2, 1)
  BindGadgetEvent(2, @Button_Click())
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf
Kannst du ein Beispielcode posten?

Re: BindgadgetEvent und Rückgabe einer Textvariable

Verfasst: 12.07.2016 17:12
von schleicher
So habe nun mal ein Beispiel geschrieben, das aber so nicht funktioniert.

Code: Alles auswählen

Global meinText.s

Declare gadgetEvent_newWindow()
Declare.s newWindow()

Procedure.s newWindow()
  OpenWindow(1, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  StringGadget(2, 10, 10, 100, 20, "", 0)
  ButtonGadget(3, 120, 10, 100, 20, "OK", 0)
  
  BindGadgetEvent(2, @gadgetEvent_newWindow())
  BindGadgetEvent(3, @gadgetEvent_newWindow())
EndProcedure

Procedure gadgetEvent_newWindow()
  Select EventGadget()
    Case 2
      
    Case 3
      If GetGadgetText(1)<>""
        meinText.s=GetGadgetText(2)
        CloseWindow(1)
        HideWindow(0, 0)
        ;ProcedureReturn meinText.s
      EndIf
      
  EndSelect
  
  
EndProcedure


If OpenWindow(0, 0, 0, 300, 100, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ButtonGadget(1, 75, 10, 150, 20, "Button other Window", 0)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Select EventWindow()
          Case 0
            End  
          Case 1
            CloseWindow(1)
            HideWindow(0, 0)
        EndSelect
        
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1  
            meinText.s=newWindow() 
               if meinText.s<>""
            Debug "Meine Text lautet : "+meinText.s
              endif
            HideWindow(0, 1)
            
        EndSelect
    EndSelect
  ForEver
EndIf
Wie müsste das richtig aussehen ?

Re: BindgadgetEvent und Rückgabe einer Textvariable

Verfasst: 12.07.2016 17:21
von Andesdaf
Du darfst meinText natürlich nicht mit dem Rückgabewert von newWindow()
befüllen, wenn newWindow() gar nichts zurückgibt.

Außerdem solltest du deine gebundenen Events nach dem Schließen des Fensters
auch wieder freigeben.

Re: BindgadgetEvent und Rückgabe einer Textvariable

Verfasst: 12.07.2016 17:46
von schleicher
Andesdaf hat geschrieben:Du darfst meinText natürlich nicht mit dem Rückgabewert von newWindow()
befüllen, wenn newWindow() gar nichts zurückgibt.
wie dann ? mit gadgetEvent_newWindow() ?
So gibt es eine Fehlermeldung !

[18:33:18] [ERROR] Die in '@Callback()' angegebene Prozedur hat nicht das benötigte Argument bzw. den Rückgabetyp.
Laut Hilfedatei gibt bindgadgetevent( keine Rückgabewert zurück. Wie kann man das denn anders machen ?

Code: Alles auswählen


Global meinText.s

Declare.s gadgetEvent_newWindow()
Declare newWindow()

Procedure newWindow()
  OpenWindow(1, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  StringGadget(2, 10, 10, 100, 20, "", 0)
  ButtonGadget(3, 120, 10, 100, 20, "OK", 0)
  
  BindGadgetEvent(2, @gadgetEvent_newWindow())
  BindGadgetEvent(3, @gadgetEvent_newWindow())
EndProcedure

Procedure.s gadgetEvent_newWindow()
  Select EventGadget()
    Case 2
      
    Case 3
      If GetGadgetText(1)<>""
        meinText.s=GetGadgetText(2)
        CloseWindow(1)
        HideWindow(0, 0)
        ProcedureReturn meinText.s
      EndIf
      
  EndSelect
  
  
EndProcedure


If OpenWindow(0, 0, 0, 300, 100, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ButtonGadget(1, 75, 10, 150, 20, "Button other Window", 0)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Select EventWindow()
          Case 0
            End  
          Case 1
            CloseWindow(1)
            HideWindow(0, 0)
             UnbindGadgetEvent(2, @gadgetEvent_newWindow())
              UnbindGadgetEvent(3, @gadgetEvent_newWindow())
        EndSelect
        
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1  
            newWindow()
            meinText.s=gadgetEvent_newWindow() 
            
            Debug "Meine Text laute : "+meinText.s
            HideWindow(0, 1)
            UnbindGadgetEvent(2, @gadgetEvent_newWindow())
             UnbindGadgetEvent(3, @gadgetEvent_newWindow())
            
        EndSelect
    EndSelect
  ForEver
EndIf
Außerdem solltest du deine gebundenen Events nach dem Schließen des Fensters
auch wieder freigeben.
Danke für den Tip. Werde ich machen.

Re: BindgadgetEvent und Rückgabe einer Textvariable

Verfasst: 12.07.2016 20:14
von mk-soft
Bei BindGadgetEvent kann es keine Rückgabewert geben da der Sender des Event damit nichts anfangen kann.
Zum Beispiel Mausklick...

Mit BindGadgetEvent kann man nur die für das Gadget verfügbaren Events verarbeiten.

Anders sieht es nicht BindEvent und PostEvent aus. Bei PostEvent kann man erweiterte Daten mit übergeben und mit der Callback von BindEvent auswerten.

Ein PostEvent hat aber auch kein Rückgabewert. Shoot and Forget...

Dafür habe ich mit aber ein SendEvent gebaut, was mit ein DispatchEvent ein Rückgabewert zurückgeben kann.

Re: BindgadgetEvent und Rückgabe einer Textvariable

Verfasst: 12.07.2016 23:30
von schleicher
mk-soft hat geschrieben: Dafür habe ich mit aber ein SendEvent gebaut, was mit ein DispatchEvent ein Rückgabewert zurückgeben kann.
Warum muss nur immer alles so aufwändig und kompliziert sein ? :bluescreen:
Gehts nicht einfacher ? Ein Beispiel würde für mich auch mehr bringen um es besser zu verstehen.

Re: BindgadgetEvent und Rückgabe einer Textvariable

Verfasst: 13.07.2016 07:44
von Bisonte
Du hast da einen Fehler gemacht, sodass deine Variable meinText.s eigentlich nie gefüllt wird.

Code: Alles auswählen

    Case 3
      If GetGadgetText(1)<>""
        meinText.s=GetGadgetText(2)
Problem hierbei ist : 1 ist der Button, nicht das StringGadget. Und da der Button einen Text enthält wird diese Bedingung nie erreicht !

Code: Alles auswählen

          Case 1
            CloseWindow(1)
            HideWindow(0, 0)
             UnbindGadgetEvent(2, @gadgetEvent_newWindow())
              UnbindGadgetEvent(3, @gadgetEvent_newWindow())
Wenn man ein Fenster schliesst, werden alle Gadgets darauf ebenfalls geschlossen. Somit kommt es hier zu einer Fehlermeldung.
UnBindGadgetEvent() muss VOR dem CloseWindow() kommen.

Code: Alles auswählen

Declare.s gadgetEvent_newWindow()

[...]
Procedure.s gadgetEvent_newWindow()
Hier ist das .s die Ursache für die Fehlermeldung. Es darf nicht sein. Rückgabewert ist und bleibt Integer.

Um das ganze dann für Dich funktionsfähig zu machen, hast du den richtigen Ansatz bereits drin. Die globale Variable
meinText.s.

Und um dieses kleine Beispiel komplett mit "Callbacks" zuzupflastern hier ein komplett geändertes Beispiel :

Code: Alles auswählen

EnableExplicit

Global meinText.s

Declare newWindow()

Enumeration Windows 1
  #Window_Main
  #Window_New
EndEnumeration
Enumeration Gadgets 1
  #Button_NewWindow
  #String
  #Button_Ok
EndEnumeration

Procedure Events_Gadgets()
  
  Select EventGadget()
    Case #Button_NewWindow
      newWindow()
    Case #Button_Ok
      If GetGadgetText(#String)<>""
        meinText.s=GetGadgetText(#String)
        CloseWindow(1)
        HideWindow(0, 0)
        Debug "Mein Text lautet : " + meinText.s
        meinText = ""
      EndIf    
  EndSelect
  
EndProcedure
Procedure Event_CloseWindow()
  
  Select EventWindow()
    Case 0
      End
    Case 1
      UnbindGadgetEvent(2, @Events_Gadgets())
      UnbindGadgetEvent(3, @Events_Gadgets())
      CloseWindow(1)
      HideWindow(0, 0)
  EndSelect
        
EndProcedure

Procedure newWindow()
  OpenWindow(1, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  StringGadget(#String, 10, 10, 100, 20, "", 0)
  ButtonGadget(3, 120, 10, 100, 20, "OK", 0)
  BindGadgetEvent(3, @Events_Gadgets())
EndProcedure

Define Event

If OpenWindow(0, 0, 0, 300, 100, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ButtonGadget(#Button_NewWindow, 75, 10, 150, 20, "Button other Window", 0)
  BindGadgetEvent(#Button_NewWindow, @Events_Gadgets())
  BindEvent(#PB_Event_CloseWindow, @Event_CloseWindow())
  
  Repeat
    Event = WaitWindowEvent()
  ForEver
EndIf
Ich hoffe, dass ist Dir nicht zu kompliziert ;)

Re: BindgadgetEvent und Rückgabe einer Textvariable

Verfasst: 14.07.2016 12:51
von schleicher
Jetzt wo du mich darauf hingewiesen hast sehe ich die Fehler auch.

Dein Code funktioniert auch, aber wie bekommt man das hin das wenn

Code: Alles auswählen

If OpenWindow(0, 0, 0, 300, 100, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ButtonGadget(#Button_NewWindow, 75, 10, 150, 20, "Button other Window", 0)
  BindGadgetEvent(#Button_NewWindow, @Events_Gadgets())
  BindEvent(#PB_Event_CloseWindow, @Event_CloseWindow())
 
  Repeat
    Event = WaitWindowEvent()
  ForEver
 
; Hier soll die Variable meinText.s übernommen werden zum weiterverarbeiten  
EndIf
aufgerufen wird, das der Code wartet, bis die Variable meinText.s gefüllt ist ?

Re: BindgadgetEvent und Rückgabe einer Textvariable

Verfasst: 14.07.2016 15:26
von Imhotheb

Code: Alles auswählen

...

  Repeat
    Event = WaitWindowEvent(100)
    If meinText <> ""
      Break
    EndIf
  ForEver

...