Seite 1 von 1

closewindow() will nicht ???

Verfasst: 04.10.2017 00:26
von wie_jetzt?
Hallo Leute!

Ja, der schon wieder, wird wohl so mancher denken. Ja, der hat wieder eine Hürde zu nehmen, nämlich:

Code: Alles auswählen

Procedure datumpicker(titel.s)
  LoadFont(11, "Arial", 16)
  If OpenWindow(1, 0, 0, 370, 320, titel, #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    CalendarGadget(11, 10, 10, 350, 300)
    SetWindowLongPtr_(GadgetID(11),#GWL_STYLE,GetWindowLongPtr_(GadgetID(11),#GWL_STYLE)|#MCS_NOTODAY)
    SetWindowLongPtr_(GadgetID(11),#GWL_STYLE,GetWindowLongPtr_(GadgetID(11),#GWL_STYLE)|#MCS_WEEKNUMBERS)
    SetWindowLongPtr_(GadgetID(11), #GWL_EXSTYLE, GetWindowLongPtr_(GadgetID(11), #GWL_EXSTYLE) &(~#WS_EX_CLIENTEDGE))
    SetWindowPos_(GadgetID(11), 0, 0, 0, 0, 0, #SWP_SHOWWINDOW | #SWP_NOZORDER | #SWP_NOSIZE | #SWP_NOMOVE | #SWP_FRAMECHANGED)
    SetWindowTheme_(GadgetID(11), @"", @"")
    SendMessage_(GadgetID(11), #MCM_SETCOLOR, #MCSC_TITLETEXT, RGB(255,255,255))
    SendMessage_(GadgetID(11), #MCM_SETCOLOR, #MCSC_TITLEBK, RGB(255, 0, 0))
    SendMessage_(GadgetID(11), #MCM_SETCOLOR, #MCSC_TRAILINGTEXT, RGB(180, 180, 180))
    SetGadgetFont(11, FontID(11))
    Repeat
      datumpicker=GetGadgetState(11)
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          ProcedureReturn datumpicker
      EndSelect
    Until EventID = #PB_Event_CloseWindow
  EndIf
  CloseWindow(1)
EndProcedure
Der Datumpicker funktioniert soweit, jedoch will sich das Fenster nicht schließen. Warum funktioniert closewindow(1) nicht?
Außerdem: Wenn ich das Datumpickerfenster per Klick auf das Fenster-X schließe, beendet es auch das Prog (aufrufendes Fenster) - wie kann ich das verhindern?

Re: closewindow() will nicht ???

Verfasst: 04.10.2017 00:44
von Bisonte
Aaaalso ;)

In deiner Eventschleife geht es folgendermassen ab ... :

Ich warte auf ein Ereignis.

Oh da ist eins.... Ich schau mal nach und führe dann den entsprechenden Befehl aus .. (Select WaitWindowEvent())

Ah es ist ein "Fenster Zu" Ereignis... na dann hops ich mal aus der Prozedur raus....

Und fertig.

Dein CloseWindow(1) wird nie ausgeführt, weil du beim Ereignis sofort aus der Prozedur springst, mit ProcedureReturn.

Um rauszubekommen, warum das auch dein Hauptfenster schliesst, lässt sich ohne weiteren Code nicht wirklich sagen.
Aber wenn die Eventschleife genauso aussieht, wie die in der Prozedur, dann liegt es daran, dass du nicht nachfragst, welches Fenster denn
nun "CloseWindow" gesendet hat.

Oder hast du da ein "If EventWindow() = HauptFensterNummer" in deiner Eventschleife stehen ;)

Desweiteren sollte man nur eine Eventschleife in seinen Programmen nutzen (Außnahmen bestätigen die Regel).
Und ein wenig mehr Abfragen schaden auch nicht... z.B. ob es wirklich das Fenster x war, das ein Event gesendet hat....

Re: closewindow() will nicht ???

Verfasst: 04.10.2017 10:57
von Kukulkan
Du kannst nicht

Until EventID = #PB_Event_CloseWindow

schreiben, wenn Du der Variable EventID obendran nirgends den Inhalt von WaitWindowEvent() zuweist. Ansonsten solltest Du auch Bisontes Antwort lesen. Wenn Du mit ProcedureReturn die Funktion verlässt, wird natürlich nie der darunter liegende Code ausgeführt.

Mein Tipp: Schau dir in der Hilfe mal die Beispiele zu OpenWindow, WaitWindowEvent etc an. Da kannst Du viel draus lernen.

Ansonsten gehe deinen Code zur Fehlersuche immer strukturiert durch, in der Reihenfolge in der die Befehle aufgerufen werden. Dann findest man das Problem meist ganz schnell.

Re: closewindow() will nicht ???

Verfasst: 09.10.2017 20:47
von udg

Code: Alles auswählen

EnableExplicit

Enumeration EnumWindow 1
  #Wnd_Main
EndEnumeration
Enumeration EnumGadgets 1
  #Fnt_Arial_16
  #Kalender
EndEnumeration

Define Event

LoadFont(#Fnt_Arial_16, "Arial", 16, #PB_Font_HighQuality)

Procedure Datumpicker()
  
  If OpenWindow(#Wnd_Main, 0, 0, 370, 320, "Pick Date", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
     CalendarGadget(#Kalender, 10, 10, 350, 300)
     SetWindowLongPtr_(GadgetID(#Kalender),#GWL_STYLE,GetWindowLongPtr_(GadgetID(#Kalender),#GWL_STYLE)|#MCS_NOTODAY)
     SetWindowLongPtr_(GadgetID(#Kalender),#GWL_STYLE,GetWindowLongPtr_(GadgetID(#Kalender),#GWL_STYLE)|#MCS_WEEKNUMBERS)
     SetWindowLongPtr_(GadgetID(#Kalender), #GWL_EXSTYLE, GetWindowLongPtr_(GadgetID(#Kalender), #GWL_EXSTYLE) &(~#WS_EX_CLIENTEDGE))
     SetWindowPos_(GadgetID(#Kalender), 0, 0, 0, 0, 0, #SWP_SHOWWINDOW | #SWP_NOZORDER | #SWP_NOSIZE | #SWP_NOMOVE | #SWP_FRAMECHANGED)
     SetWindowTheme_(GadgetID(#Kalender), @"", @"")
     SendMessage_(GadgetID(#Kalender), #MCM_SETCOLOR, #MCSC_TITLETEXT, RGB(255,255,255))
     SendMessage_(GadgetID(#Kalender), #MCM_SETCOLOR, #MCSC_TITLEBK, RGB(255, 0, 0))
     SendMessage_(GadgetID(#Kalender), #MCM_SETCOLOR, #MCSC_TRAILINGTEXT, RGB(180, 180, 180))
     SetGadgetFont(#Kalender, FontID(#Fnt_Arial_16))
  EndIf
EndProcedure
Datumpicker()
Repeat
  Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow

Re: closewindow() will nicht ???

Verfasst: 09.10.2017 22:26
von Nino
@wie_jetzt ???
Bist du sicher, dass du verstehst was der Code macht den du gepostet hast ???
Das sieht mir ehrlich gesagt mehr nach "copy and paste" aus ...
Das ist eine gute Methode, um nicht programmieren zu lernen !!!