UnbindGadgetEvent

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Ameisen23
Beiträge: 50
Registriert: 19.10.2013 12:04

UnbindGadgetEvent

Beitrag von Ameisen23 »

Hallo! Ich finde die neuen Eventfunktionen mit dem BindGadgetEvent sehr gut und erleichtert das verknüpfen von Events.

In der Hilfe habe ich eines nicht gefunden ob UnbindGadgetEvent erforderlich ist wenn man ein bestimmtes Fenster öffnen und schliessen möchte.
Ich habe eine Fenster Prozedur und verknüpfe ein Event mit BindGadgetEvent. Ich öffne das Fenster und schliesse es danach wieder. Wird die Verknüpfung zur Callback Prozedur automatisch beim schliessen freigegeben oder muss ich selber UnbindGadgetEvent benutzen wenn das Fenster geschlossen wird?
Ich mein wenn nicht automatisch UnbindGadgetEvent ausgeführt wird dann gibt es nach 10x öffnen 10 Callbacks die gleichzeitig laufen oder? Oder wird es bei jeden öffnen ersetzt? Ich weiss leider nicht wie PB das handhabt ob er automatisch unbindet wenn das Fenster geshlossen wird.

Weiss jemand wie man es richtig macht oder ob UnbindGadgetEvent() immer zwingend erforderlich beim schliessen 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: UnbindGadgetEvent

Beitrag von ts-soft »

Ich würde in jedem Falle, beim schliessen des Fensters, auch die Event-Bindung aufheben, abgesehen davon verstehe ich
allerdings nicht, warum ein Fenster mehrmals erstellt werden sollte. HideWindow ist doch wesentlich sinnvoller :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: UnbindGadgetEvent

Beitrag von RSBasic »

@Ameisen23
Du kannst das ganz leicht selber feststellen, ob das Problem tatsächlich auftritt:

Code: Alles auswählen

EnableExplicit

Define EventID
Define CurrentWindow

Procedure ButtonHandler()
  Debug "Klick"
EndProcedure

Procedure Window1()
  If OpenWindow(1, 0, 0, 400, 300, "SubWindow", #PB_Window_SystemMenu | #PB_Window_WindowCentered, WindowID(0))
    ButtonGadget(2, 10, 10, 100, 20, "Button", 0)
    
    BindGadgetEvent(2, @ButtonHandler())
    
  EndIf
  
EndProcedure

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ButtonGadget(1, 10, 10, 100, 20, "SubWindow", 0)
  
  Repeat
    EventID = WaitWindowEvent()
    CurrentWindow = EventWindow() 
    If EventID = #PB_Event_Gadget
      Select EventGadget()
        Case 1
          Window1()
      EndSelect
    EndIf
    If EventID = #PB_Event_CloseWindow
      If CurrentWindow = 0
        End
      Else
        CloseWindow(CurrentWindow)
        Debug "--------------------------------------------------"
      EndIf
    EndIf
  ForEver
EndIf
Wie es aussieht, tritt das Problem auf und du musst auf jeden Fall UnbindGadgetEvent() verwenden, damit du keine mehrfachen Events bekommst.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
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: UnbindGadgetEvent

Beitrag von ts-soft »

Wie es aussieht, tritt das Problem nach einem UnbindEvent immer noch auf, jedenfalls unter Linux :mrgreen:

// edit
sowie unter Win 7
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: UnbindGadgetEvent

Beitrag von RSBasic »

Dann ist das wohl ein Bug.
Unter Windows gibt es immer nur eine Klick-Debugausgabe, wenn man vor dem Schließen UnbindGadgetEvent() benutzt.

\\Edit:
Bei mir funktioniert es unter Win7. :roll:
Vorausgesetzt man schließt das Unterfenster auch vorher.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
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: UnbindGadgetEvent

Beitrag von ts-soft »

Naja, wenn man vor dem erstellen des neuen Fensters, auf existenz prüft und unbind ausführt, funktioniert es.
Also kein Bug, aber ein Beweis mehr, besser das Fenster nur verstecken und nicht neu erstellen, was ich sowieso
als Unfug empfinde :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Sicro
Beiträge: 964
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: UnbindGadgetEvent

Beitrag von Sicro »

RSBasic hat geschrieben:Bei mir funktioniert es unter Win7. :roll:
Unter Linux funktioniert es hier auch korrekt.
RSBasic hat geschrieben:Vorausgesetzt man schließt das Unterfenster auch vorher.
Ja, wenn man zweimal das Unterfenster öffnet, ohne das vorherige zu schließen, wird zweimal "BindGadgetEvent(2, @ButtonHandler())" aufgerufen und beim späterem Schließem des Unterfensters nur einmal "UnbindGadgetEvent(2, @ButtonHandler())" ausgeführt. Gut zu wissen, dass beim erneutem Binden der vorherige Bind nicht überschrieben wird, sondern zur Event-Liste nochmal hinzugefügt wird.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
Ameisen23
Beiträge: 50
Registriert: 19.10.2013 12:04

Re: UnbindGadgetEvent

Beitrag von Ameisen23 »

Danke für die schnelle Antworten! Jetzt weiss ich wie das funktioniert und das man das nicht vergessen darf.

@tssoft: Das wäre auch eine Möglichkeit! Wie machst du das genau? Erstellst du alle Fenster schon beim start oder beim ersten aufruf?
Wenn ich zb. 20 Fenster mit vielen Gadgets beim start erstelle dann wird der Start stark verzögert. Aber wenn ich das Fenster beim ersten aufruf erstelle dann muss ich auch auf Existenz prüfen, entweder soll er wenn das Fenster noch nicht erstellt wurde erstellen andernfalls sichtbar machen. Wie machst du das genau?
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: UnbindGadgetEvent

Beitrag von ts-soft »

Ameisen23 hat geschrieben:@tssoft: Das wäre auch eine Möglichkeit! Wie machst du das genau? Erstellst du alle Fenster schon beim start oder beim ersten aufruf?
Je nach Situtation, normallerweise beim Start des Programmes, alle Fenster gleich erstellen, mit dem Flag
#PB_Window_Invisible (ein Programm mit 20 Fenstern und vielen Gadgets ist etwas merkwürdig, da liegt dann
eher ein Planungsfehler vor :wink: )

Dann brauchste nur noch Anzeigen oder Verstecken, je nachdem, was Du benötigst. UnbindEvent wird überflüssig, auf
den Button eines versteckten Fensters drückt keine :mrgreen:

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Ameisen23
Beiträge: 50
Registriert: 19.10.2013 12:04

Re: UnbindGadgetEvent

Beitrag von Ameisen23 »

Danke für deine information! Warum meinst du es läge ein Planungsfehler vor wenn man 20 Fenster hat? Darf man mit Purebasic keine grössere Programmen schreiben? :D Und meine Aussage "viele Gadgets" ist eh relativ. Es können auch nur 20 Gadgets pro Fenster sein aber wenn man für sein Program viele Fenster hat die dann alle aufeinmal beim start erstellt werden müssen muss ich dann zusätzlich ein Splashscreen erstellen.
Wenn ich all meine Fenster ein und ausblende dann muss ich zusätzlich alle Gadgets zurücksetzen wenn es Eingabe Sachen sind. Wie zb. Hinzufügen Fenster muss ich alle Eingabefelder leeren usw. Ich empfinde das umständlicher. UnbindEvent wird zwar überflüssig aber dafür Zurücksetzfunks für die Gadgets wenn es Eingabefelder sind. Hmmmm ich weiss nicht... ich lese deine Methode zum ersten Mal und habe kein Windoof Program gefunden das diese Methode mit dem verstecken und anzeigen nutzt. Du fragst dich bestimmt woher ich das weiss. In einen anderen Thread wurde ein Tool für externe Fenster vorgestellt um das Handle eines Fensters herauszufinden und alle Programme die ich getestet habe schliessen seine Fenster wenn man auf X klickt. :D
Antworten