BindgadgetEvent und Rückgabe einer Textvariable
-
- Beiträge: 214
- Registriert: 30.03.2014 19:57
- Computerausstattung: Purebasic 5.70
- Wohnort: 18314 Löbnitz
BindgadgetEvent und Rückgabe einer Textvariable
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
Re: BindgadgetEvent und Rückgabe einer Textvariable
Falls ich dich richtig verstanden haben sollte:
Oder:
Kannst du ein Beispielcode posten?
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
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
-
- Beiträge: 214
- Registriert: 30.03.2014 19:57
- Computerausstattung: Purebasic 5.70
- Wohnort: 18314 Löbnitz
Re: BindgadgetEvent und Rückgabe einer Textvariable
So habe nun mal ein Beispiel geschrieben, das aber so nicht funktioniert.
Wie müsste das richtig aussehen ?
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
Purebasic 5.51
Re: BindgadgetEvent und Rückgabe einer Textvariable
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.
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
-
- Beiträge: 214
- Registriert: 30.03.2014 19:57
- Computerausstattung: Purebasic 5.70
- Wohnort: 18314 Löbnitz
Re: BindgadgetEvent und Rückgabe einer Textvariable
wie dann ? mit gadgetEvent_newWindow() ?Andesdaf hat geschrieben:Du darfst meinText natürlich nicht mit dem Rückgabewert von newWindow()
befüllen, wenn newWindow() gar nichts zurückgibt.
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
Danke für den Tip. Werde ich machen.Außerdem solltest du deine gebundenen Events nach dem Schließen des Fensters
auch wieder freigeben.
Purebasic 5.51
Re: BindgadgetEvent und Rückgabe einer Textvariable
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.
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
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
-
- Beiträge: 214
- Registriert: 30.03.2014 19:57
- Computerausstattung: Purebasic 5.70
- Wohnort: 18314 Löbnitz
Re: BindgadgetEvent und Rückgabe einer Textvariable
Warum muss nur immer alles so aufwändig und kompliziert sein ?mk-soft hat geschrieben: Dafür habe ich mit aber ein SendEvent gebaut, was mit ein DispatchEvent ein Rückgabewert zurückgeben kann.

Gehts nicht einfacher ? Ein Beispiel würde für mich auch mehr bringen um es besser zu verstehen.
Purebasic 5.51
Re: BindgadgetEvent und Rückgabe einer Textvariable
Du hast da einen Fehler gemacht, sodass deine Variable meinText.s eigentlich nie gefüllt wird.
Problem hierbei ist : 1 ist der Button, nicht das StringGadget. Und da der Button einen Text enthält wird diese Bedingung nie erreicht !
Wenn man ein Fenster schliesst, werden alle Gadgets darauf ebenfalls geschlossen. Somit kommt es hier zu einer Fehlermeldung.
UnBindGadgetEvent() muss VOR dem CloseWindow() kommen.
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 :
Ich hoffe, dass ist Dir nicht zu kompliziert 
Code: Alles auswählen
Case 3
If GetGadgetText(1)<>""
meinText.s=GetGadgetText(2)
Code: Alles auswählen
Case 1
CloseWindow(1)
HideWindow(0, 0)
UnbindGadgetEvent(2, @gadgetEvent_newWindow())
UnbindGadgetEvent(3, @gadgetEvent_newWindow())
UnBindGadgetEvent() muss VOR dem CloseWindow() kommen.
Code: Alles auswählen
Declare.s gadgetEvent_newWindow()
[...]
Procedure.s gadgetEvent_newWindow()
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

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
-
- Beiträge: 214
- Registriert: 30.03.2014 19:57
- Computerausstattung: Purebasic 5.70
- Wohnort: 18314 Löbnitz
Re: BindgadgetEvent und Rückgabe einer Textvariable
Jetzt wo du mich darauf hingewiesen hast sehe ich die Fehler auch.
Dein Code funktioniert auch, aber wie bekommt man das hin das wenn
aufgerufen wird, das der Code wartet, bis die Variable meinText.s gefüllt ist ?
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
Purebasic 5.51
- 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
Code: Alles auswählen
...
Repeat
Event = WaitWindowEvent(100)
If meinText <> ""
Break
EndIf
ForEver
...
weil einfach einfach einfach ist ... mach' ich es anders