Seite 1 von 3

UnbindGadgetEvent

Verfasst: 05.01.2014 19:07
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?

Re: UnbindGadgetEvent

Verfasst: 05.01.2014 19:19
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:

Re: UnbindGadgetEvent

Verfasst: 05.01.2014 20:07
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.

Re: UnbindGadgetEvent

Verfasst: 05.01.2014 20:19
von ts-soft
Wie es aussieht, tritt das Problem nach einem UnbindEvent immer noch auf, jedenfalls unter Linux :mrgreen:

// edit
sowie unter Win 7

Re: UnbindGadgetEvent

Verfasst: 05.01.2014 20:28
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.

Re: UnbindGadgetEvent

Verfasst: 05.01.2014 20:59
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:

Re: UnbindGadgetEvent

Verfasst: 05.01.2014 21:02
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.

Re: UnbindGadgetEvent

Verfasst: 05.01.2014 21:13
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?

Re: UnbindGadgetEvent

Verfasst: 05.01.2014 21:18
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

Re: UnbindGadgetEvent

Verfasst: 05.01.2014 21:51
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