closewindow() will nicht ???

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
wie_jetzt?
Beiträge: 21
Registriert: 28.08.2017 17:23

closewindow() will nicht ???

Beitrag 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?
Was das Programmieren angeht, bin ich ein Anfänger mit fast 40 Jahren Erfahrung, mit gelegentlichen, mitunter jahrzehntelangen Unterbrechungen. Kann mich noch dunkel an den TI58 bei der Bundeswehr Anfang der 1980er erinnern. Habe da mit "Mondlandung" viele Stunden der Heimatverteidung verbracht - Insider werden's kennen.
... wir hatten doch sonst nix!
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: closewindow() will nicht ???

Beitrag 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....
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Re: closewindow() will nicht ???

Beitrag 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.
Benutzeravatar
udg
Beiträge: 560
Registriert: 20.06.2013 23:27

Re: closewindow() will nicht ???

Beitrag 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
Zuletzt geändert von udg am 10.10.2017 00:59, insgesamt 1-mal geändert.
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE! TOP. Kauft Eure Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: closewindow() will nicht ???

Beitrag 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 !!!
Antworten