Zwei Fenster - danach keine Ereignisabfrage mehr

Anfängerfragen zum Programmieren mit PureBasic.
Beforegod
Beiträge: 34
Registriert: 21.09.2005 12:12

Zwei Fenster - danach keine Ereignisabfrage mehr

Beitrag von Beforegod »

Moin,

versuche mich seit ein paar Tagen mit PureBasic und muss sage das ich begeistert bin. ;)

Nun folgendes Problem :

Möchte beim betätigen von einem Knopf ein neues Fenster aufmachen. Das klappt auch ganz gut, allerdings sobald das zweite Fenster geschlossen wird und das erste wieder aufgemacht wird, funktioniert die Ereignis Schleife nicht mehr.

Hier mal der Code:

Code: Alles auswählen

IncludeFile "Common.pb"
IncludeFile "Common-edit.pb"
IncludeFile "db_mysql.pb"

; Prozeduren die genutzt werden

Procedure getData()
  sqlquery$ = "SELECT DISTINCT artikel.artnr, sdesc1, price_shop, export.e_date FROM artikel LEFT JOIN export ON artikel.artnr = export.artnr ORDER BY artikel.artnr DESC"
              
  rows = SQLgetRows(sqlquery$)
  
  DatabaseQuery(sqlquery$)
  
  pbStep.f = 100 / rows
  
  For i = 1 To rows
    NextDatabaseRow()
    AddGadgetItem(#ListIcon_0, 0, GetDatabaseString(0) + Chr(10) + GetDatabaseString(1) + Chr(10) + GetDatabaseString(2) + Chr(10) + GetDatabaseString(3))
    
    SetGadgetState(#ProgressBar_0, GetGadgetState(#ProgressBar_0) + pbStep.f)
  Next i
EndProcedure

Procedure enterData()
  Open_Window_1()

  Repeat ; Start of the event loop
  
    Event = WaitWindowEvent() ; This line waits until an event is received from Windows
  
    WindowID = EventWindowID() ; The Window where the event is generated, can be used in the gadget procedures
  
    GadgetID = EventGadgetID() ; Is it a gadget event?
  
    EventType = EventType() ; The event type
  
  
    If Event = #PB_EventGadget
    
      If GadgetID = #Sdesc_1
      
      ElseIf GadgetID = #Sartnr_0
      
      ElseIf GadgetID = #Sdesc_2
      
      ElseIf GadgetID = #Sdesc_3
      
      ElseIf GadgetID = #Sprice_shop
      
      ElseIf GadgetID = #Sprice_store
      
      ElseIf GadgetID = #Radio_0
      
      ElseIf GadgetID = #Radio_1
      
      ElseIf GadgetID = #Radio_2
      
      ElseIf GadgetID = #Samount
      
      ElseIf GadgetID = #BPic_0
      
      ElseIf GadgetID = #BPic_1
      
      ElseIf GadgetID = #Shtml
      
      ElseIf GadgetID = #BEnter
      
      ElseIf GadgetID = #BClose
        CloseWindow(#Window_1)
        Open_Window_0()
      
      EndIf
    
    EndIf
  
  Until Event = #PB_Event_CloseWindow ; End of the event loop

  End
EndProcedure

; Die Repeat Schleife
Procedure mainWindow()
  Open_Window_0()

  Repeat ; Start of the event loop
  
    Event = WaitWindowEvent() ; This line waits until an event is received from Windows
  
    WindowID = EventWindowID() ; The Window where the event is generated, can be used in the gadget procedures
  
    GadgetID = EventGadgetID() ; Is it a gadget event?
  
    EventType = EventType() ; The event type
  
    ;You can place code here, and use the result as parameters for the procedures
  
    If Event = #PB_EventGadget
    
      If GadgetID = #ListIcon_0
      
      ElseIf GadgetID = #ProgressBar_0
      
      ElseIf GadgetID = #Button_2
        ClearGadgetItemList(#ListIcon_0)
        getData()
      
      ElseIf GadgetID = #Button_4
        CloseWindow(#Window_0)
        enterData()
      
      ElseIf GadgetID = #Button_5
      
      ElseIf GadgetID = #Button_6
      
      ElseIf GadgetID = #Image_0
      
      EndIf
    
    EndIf
  
  Until Event = #PB_Event_CloseWindow ; End of the event loop

  End
EndProcedure

; Start der Anwendung

InitDatabase()

SQLconnect("Wegerich_ODBC", "exroot", "figgen ;)")

mainWindow()
Zuletzt geändert von Beforegod am 21.09.2005 14:03, insgesamt 1-mal geändert.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Ich bin zwar auch nicht grad der Ober-Window-Event-Blicker ;) aber ich glaube es liegt ganz einfach daran:

Code: Alles auswählen

Until Event = #PB_Event_CloseWindow ; End of the event loop 
Es wird EIN Fenster geschlossen, aber es wird hier ja nicht nachgefragt, WELCHES Fenster geschlossen wird.

Sinnvoller wäre wohl ein "Forever" statt des "Until", und dann innerhalb der Schleife die Abfrage, If Event = #PB_Event_CloseWindow. Dort kannst Du dann erstmal noch abfragen, WELCHES Fenster geschlossen wurde (per EventWindowID). Dann kannst Du entsprechend handeln, also wenn z.B. Fenster 0 geschlossen wurde, DANN soll die Schleife verlassen werden, bei Fenster 1 soll die Schleife von Fenster 0 ja noch weiterarbeiten.

Bin mir aber nicht 100%ig sicher ob es daran liegt. Hab auch Deinen Code nicht getestet da ich gerade an einem PureBasic-losen PC sitze...
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Ach ja, noch ein Hinweis (der jetzt aber nix mit Deinem Problem zu tun hat):

Die vielen ElseIf-Abfragen kannst Du auch mit Select machen:

Code: Alles auswählen

Select GadgetID
Case #Sdesc_1
   ;blabla
Case #Sartnr_0
  ;ebenfalls bla
 ;...
Case #BClose
  CloseWindow(#Window_1)
  Open_Window_0()
EndSelect
Beforegod
Beiträge: 34
Registriert: 21.09.2005 12:12

Beitrag von Beforegod »

Da aber immer das andere Fenster geschlossen wird (closewindow) sollte das mit dem PB_EVENT_CloseWindow gehen oder?

Ansonsten wie kann ich prüfen welches Fenster geschlossen wird?
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

Beitrag von benpicco »

mit EventWindowID()
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.
Beforegod
Beiträge: 34
Registriert: 21.09.2005 12:12

Beitrag von Beforegod »

Gut das habe ich mir gedacht ;)

Allerdings meinte ich eher wie ich das Ereignis zuweisen kann: (sind ja hier im Anfängerforum)

Until Event = #PB_Event_CloseWindow(EventWindowID) ???

[Änderung]

Ich glaube das Problem liegt daran das er einfach nicht mehr in die Repeat schleife geht, aber ich weiss nicht warum :(
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Nein, wie gesagt:

Repeat
;...
Forever

Somit hast Du erstmal eine Endlosschleife.

Dann INNERHALB der Schleife:

If Event = #PB_Event_CloseWindow
If EventWindowID = #Window_0
Break
EndIf
EndIf

Natürlich kannst Du das auch anders gestalten, aber so würd ich das ganze machen...
Beforegod
Beiträge: 34
Registriert: 21.09.2005 12:12

Beitrag von Beforegod »

Aha.. Problem ist folgendes (bin blond ;))

Ich rufe in der Funktion "Open_Window_0" auf, allerdings sollte vielleicht einfach mainWindow aufgerufen werden.

Nun kommt das nächste Problem : mainWindow wird ja erst später als Prozedur deklariert. Tausche ich die zwei Prozeduren meckert er das er getData() nicht finden kann.. logisch wird ja unter mainWindow deklariert.

Wo ist der ausweg ;)

---

ARGG.. declare ;) Entshculdigt bitte Problem gelöst ;)
Benutzeravatar
unix
Beiträge: 361
Registriert: 15.02.2005 19:25
Wohnort: Zwischen Coburg und Bamberg :-)
Kontaktdaten:

Beitrag von unix »

und nach Sliesen des zweite festers musst du

Code: Alles auswählen

UseWindow(#Window1)
aufrufen da sonst alle beide verschwinden.
So war es zumindest bei mir (damals PB3.93)
könnte bei 3.94 wieder behoben sein
Hier steht normalerweise die Putzfrau drin,
die hat aber Urlaub.
MfG : Unix
Benutzeravatar
PAMKKKKK
Beiträge: 321
Registriert: 21.04.2005 22:08
Wohnort: Braunschweig
Kontaktdaten:

Beitrag von PAMKKKKK »

Mach mal so:

Code: Alles auswählen

; Beispiel Umgang mit mehreren Fenstern (Kaskadierung)
; PAMKKKKK 21.September.2005
; PB 3.94.

;- Window Constants
Enumeration
  #Window_0
  #Window_1
  #Window_2  
EndEnumeration

;- Gadget Constants
Enumeration
  #Text_0_1
  #Text_1_1
  #Text_2_1
  #Button_0_1
  #Button_1_1
  #Button_1_2
  #Button_2_1
EndEnumeration

; Die Fenster verpackt man, in Proceduren
; damit man Sie bei bedarf aufrufen kann 

Procedure Open_Window_0() ; Hauptfenster
  If OpenWindow(#Window_0, 200, 200, 200, 100,  #PB_Window_SystemMenu | #PB_Window_TitleBar , "Fenster 0") = 0
    MessageRequester("Fehler!", "Fehler beim öffenen von Fenster 0")
    ProcedureReturn 0 ; bei Fehler raus aus der Procedure
  EndIf
  If CreateGadgetList(WindowID()) = 0
    MessageRequester("Fehler!", "Gadget Liste Fenster 0 konte nicht erstellt werden!")
    ProcedureReturn 0 ; bei Fehler raus aus der Procedure
  EndIf
  TextGadget(#Text_0_1, 10, 10, 180, 20, "Klicken für Fenster 1",#PB_Text_Center )
  ButtonGadget(#Button_0_1, 65, 60, 70, 30, "Aufmachen")
  ProcedureReturn 1 ; alles OK
EndProcedure

Procedure Open_Window_1()
  If OpenWindow(#Window_1, 220, 220, 200, 100,  #PB_Window_SystemMenu | #PB_Window_TitleBar , "Fenster 1") = 0
    MessageRequester("Fehler!", "Fehler beim öffenen von Fenster 1")
    ProcedureReturn 0 ; bei Fehler raus aus der Procedure
  EndIf
  If CreateGadgetList(WindowID()) = 0
    MessageRequester("Fehler!", "Gadget Liste Fenster 1 konte nicht erstellt werden!")
    ProcedureReturn 0 ; bei Fehler raus aus der Procedure
  EndIf
  TextGadget(#Text_1_1, 10, 10, 180, 20, "Willst du noch´n Fenster ?",#PB_Text_Center )
  ButtonGadget(#Button_1_1, 15, 60, 70, 30, "Abbruch")
  ButtonGadget(#Button_1_2, 115, 60, 70, 30, "Weiter")
  ProcedureReturn 1 ; alles OK
EndProcedure

Procedure Open_Window_2()
  If OpenWindow(#Window_2, 240, 240, 200, 100,  #PB_Window_SystemMenu | #PB_Window_TitleBar , "Fenster 2") = 0
    MessageRequester("Fehler!", "Fehler beim öffenen von Fenster 2")
    ProcedureReturn 0 ; bei Fehler raus aus der Procedure
  EndIf
  If CreateGadgetList(WindowID()) = 0
    MessageRequester("Fehler!", "Gadget Liste Fenster 2 konte nicht erstellt werden!")
    ProcedureReturn 0 ; bei Fehler raus aus der Procedure
  EndIf
  TextGadget(#Text_2_1, 10, 10, 180, 20, "Nun ist aber gut!",#PB_Text_Center )
  ButtonGadget(#Button_2_1, 65, 60, 70, 30,  "Zurück")
  ProcedureReturn 1 ; alles OK
EndProcedure


; nun folgen die Proceduren die zur Steuerung des  Fensterwechsel nötig sind

Procedure Change_to_Window_1() ; Fenster 1 öffnen und  wechseln
  ; Fenster 0 deaktivieren (nicht schliessen) 
  EnableWindow_(WindowID( #Window_0), #False) 
  ;Fenster 0 sendet nun keine ereignisse mehr (ragiert nicht mehr)
  Open_Window_1() ; Fenster 1 Öffnen
EndProcedure

Procedure Close_Window_1() ; Fenster 1 schliessen
  CloseWindow(#Window_1) ; Fenster 1 schliessen 
  EnableWindow_(WindowID( #Window_0), #True) ; Fenster 0 wieder Aktivieren (Windows API)
  UseWindow(#Window_0) ; Fenster 0 benutzen            
  ActivateWindow() ; Fenster 0 nach vorne holen falls es Hinter anderen Fenstern war
EndProcedure 

Procedure Change_to_Window_2() ; Fenster 2 öffnen und  wechseln
  ; Fenster 1 deaktivieren (nicht schliessen) 
  EnableWindow_(WindowID( #Window_1), #False) 
  ;Fenster 1 sendet nun keine ereignisse mehr (ragiert nicht mehr)
  Open_Window_2() ; Fenster 2 Öffnen
EndProcedure

Procedure Close_Window_2() ; Fenster 2 schliessen
  CloseWindow(#Window_2) ; Fenster 2 schliessen 
  EnableWindow_(WindowID( #Window_1), #True) ; Fenster 1 wieder Aktivieren (Windows API)
  UseWindow(#Window_1) ; Fenster 1 benutzen            
  ActivateWindow() ; Fenster 1 nach vorne holen falls es Hinter anderen Fenstern war
EndProcedure 

;***********************************************
;- Programm start
;***********************************************

Open_Window_0() ; Hauptfenster öffnen

;***********************************************
;- Fenster Behandlung
;***********************************************
Repeat 
  EventID = WaitWindowEvent() ; Welches Ereignisse trat auf
  WinID = EventWindowID() ; Welches der Fenster (Nummer) sendet das ereignis?
  Select EventID ; Start der Ereignis Behandlung (Fenster und Gadget)
    ; Fenster Behandlung:
    Case #PB_Event_CloseWindow ; Wenn das Ereignis "Fenster schliessen" ist
      Select WinID ; Welches hat Fenster schliessen gesendet?
        Case #Window_0 ; Es war Fenster 0 (es kann nur geschlossen werden wenn es Aktiv ist)
          End ; Wenn Fenster 0 zu schliessen ist dann PROGRAMM ENDE.
        Case #Window_1 ; Es war Fenster 1
          Close_Window_1() ; Fenster 1 zumachen und zu Fenster 0 wechseln
        Case #Window_2 ; Es war Fenster 2
          Close_Window_2() ; Fenster 2 zumachen und zu Fenster 1 wechseln          
      EndSelect ; Ende der Fenster Behandlung
      ; Gadget Behandlung:
    Case #PB_EventGadget ; Wenn das Ereignisvon einem Gadget kam
      GadgetID = EventGadgetID() ; Gadgetnummer rausbekommen das gesendet hat
      Select GadgetID ; Nach Gadgetnummer reagieren
        Case #Button_0_1 ; Es war Knopf 0_1
          Change_to_Window_1() ; Fenster 0 deaktiviern und zu Fenster 1 wechseln
        Case #Button_1_1 ; Es war Knopf 1_1
          Close_Window_1() ; Fenster 1 schliessen zurück zu Fenster 0
        Case #Button_1_2 ; Es war Knopf 1_2
          Change_to_Window_2() ; Fenster 1 deaktiviern und zu Fenster 2 wechseln
        Case #Button_2_1 ; Es war Knopf 1_2
          Close_Window_2() ; Fenster 2 schliessen zurück zu Fenster 1 
      EndSelect ; Ende der Gadget Behandlung
  EndSelect ; Ende der Ereignis Behandlung
ForEver ; Endet nur wenn Fenster 0 geschlossen wird.
End
Wir Schreiben ein PureBasic Buch.
Auch du kannst mitmachen!
http://www.purearea.net/pb/english/pure ... :Main_Page
Antworten