BindgadgetEvent und Rückgabe einer Textvariable

Anfängerfragen zum Programmieren mit PureBasic.
schleicher
Beiträge: 214
Registriert: 30.03.2014 19:57
Computerausstattung: Purebasic 5.70
Wohnort: 18314 Löbnitz

BindgadgetEvent und Rückgabe einer Textvariable

Beitrag 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)
Purebasic 5.51
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: BindgadgetEvent und Rückgabe einer Textvariable

Beitrag 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?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
schleicher
Beiträge: 214
Registriert: 30.03.2014 19:57
Computerausstattung: Purebasic 5.70
Wohnort: 18314 Löbnitz

Re: BindgadgetEvent und Rückgabe einer Textvariable

Beitrag 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 ?
Purebasic 5.51
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: BindgadgetEvent und Rückgabe einer Textvariable

Beitrag 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.
Win11 x64 | PB 6.20
schleicher
Beiträge: 214
Registriert: 30.03.2014 19:57
Computerausstattung: Purebasic 5.70
Wohnort: 18314 Löbnitz

Re: BindgadgetEvent und Rückgabe einer Textvariable

Beitrag 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.
Purebasic 5.51
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: BindgadgetEvent und Rückgabe einer Textvariable

Beitrag 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.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
schleicher
Beiträge: 214
Registriert: 30.03.2014 19:57
Computerausstattung: Purebasic 5.70
Wohnort: 18314 Löbnitz

Re: BindgadgetEvent und Rückgabe einer Textvariable

Beitrag 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.
Purebasic 5.51
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: BindgadgetEvent und Rückgabe einer Textvariable

Beitrag 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 ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
schleicher
Beiträge: 214
Registriert: 30.03.2014 19:57
Computerausstattung: Purebasic 5.70
Wohnort: 18314 Löbnitz

Re: BindgadgetEvent und Rückgabe einer Textvariable

Beitrag 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 ?
Purebasic 5.51
Benutzeravatar
Imhotheb
Beiträge: 192
Registriert: 10.10.2014 13:14
Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
Wohnort: Wolfenbüttel

Re: BindgadgetEvent und Rückgabe einer Textvariable

Beitrag von Imhotheb »

Code: Alles auswählen

...

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

...
weil einfach einfach einfach ist ... mach' ich es anders
Antworten