Fehler im 1. Fenster nach Öffnen eines 2. Fensters [gelöst]

Für allgemeine Fragen zur Programmierung mit PureBasic.
hiltwin
Beiträge: 311
Registriert: 06.10.2005 11:08
Wohnort: D-31177 Harsum
Kontaktdaten:

Fehler im 1. Fenster nach Öffnen eines 2. Fensters [gelöst]

Beitrag von hiltwin »

Hallo,

warum gibt es hier eine Änderung der Funktionalität, dass gleichlautende Befehle nach Öffnen eines weiteren Fensters nicht mehr korrekt ausgeführt werden?

Programm aufrufen und als erstes ALT+H oder auf "Ein" klicken ...
Danach das zweite Fenster mit "Korrektur" aufrufen und danach erneut ALT+H aufrufen, dann wird das Problem erkennbar.

Mit einem SetActivWindow lässt sichs nicht lösen, deshalb ists im Quelltext auskommentiert ...

Code: Alles auswählen

;- Window Constants
;
Enumeration
  #Window_0
  #Window_EK
EndEnumeration

;- Gadget Constants
;
Enumeration
  #F3DI
  #Button_OK
  #Button_Dlte
  #EKButton_OK
  #EKButton_L
  #F3Help
  #Helpin
  #HelpButton
  #EKF3DI
EndEnumeration


#LVM_FIRST = $1000 
#LVM_GETHEADER = #LVM_FIRST + 31 

;- Fonts
;

Global FontID1
FontID1 = LoadFont(1, "Arial", 18)
Global FontID2
FontID2 = LoadFont(2, "Arial", 18, #PB_Font_Bold)
Global FontID3
FontID3 = LoadFont(3, "Arial", 6)
Global FontID4
FontID4 = LoadFont(4, "Arial", 8)
Global FontID5
FontID5 = LoadFont(5, "Arial", 7)



Procedure Open_Window_0()
  If OpenWindow(#Window_0, 0, 0, 1024, 650, "Hilfe", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget| #PB_Window_SizeGadget | #PB_Window_ScreenCentered  | #PB_Window_WindowCentered | #PB_Window_TitleBar)
    If CreateGadgetList(WindowID(0))
    
    Frame3DGadget(#F3Help, 7,  10, 40, 40, "&Hilfe")
    ButtonGadget(#HelpButton,  11, 25, 32, 20, "Ein",#PB_Button_Toggle)
    SetGadgetState(#HelpButton,0)
      hilfe$="Hilfe"+Chr(10)+"Hilfe"+Chr(10)+"Hilfe"+Chr(10)+Chr(10)+Chr(10)+Chr(10)+"Hilfe"+Chr(10)+Chr(10)+Chr(10)+"Hilfe"+Chr(10)+"Hilfe"+Chr(10)+Chr(10)+Chr(10)+Chr(10)+Chr(10)+"Hilfe"+Chr(10)+Chr(10)+"Hilfe"+Chr(10)+Chr(10)+Chr(10)+"Hilfe"+Chr(10)+Chr(10)+Chr(10)+"Hilfe"+Chr(10)+"Hilfe"+Chr(10)+"Hilfe"+Chr(10)+"Hilfe"+Chr(10)+Chr(10)+"Hilfe"+Chr(10)+"Hilfe"+Chr(10)+"Hilfe"+Chr(10)+"Hilfe"+Chr(10)+"Hilfe"+Chr(10)+"Hilfe"+Chr(10)+"Hilfe"+Chr(10)+"Hilfe"+Chr(10)+"Hilfe"+Chr(10)+"Hilfe"+Chr(10)+"usw."
      TextGadget(#Helpin,  10, 35, 34, 560, hilfe$)
      SetGadgetFont(#Helpin, FontID5)
          HideGadget(#Helpin,1)
          



      Frame3DGadget(#F3DI, 55,  10, 440, 600, "Erfassung")
    
        ButtonGadget(#Button_OK,  360, 240, 80, 24, "Erfassen")
        ButtonGadget(#Button_Dlte,  360, 300, 80, 24, "Korrigieren")


      EndIf
  EndIf
EndProcedure

Procedure Open_Window_EK()
  If OpenWindow(#Window_EK, 0, 0, 500, 420, "Korrektur", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget| #PB_Window_SizeGadget | #PB_Window_ScreenCentered  | #PB_Window_WindowCentered | #PB_Window_TitleBar)
    If CreateGadgetList(WindowID(#Window_EK))
    
      Frame3DGadget(#EKF3DI, 55,  10, 400, 400, "Korrektur")
    
        ButtonGadget(#EKButton_OK,  360, 240, 80, 24, "Korrigieren")
        ButtonGadget(#EKButton_L,  360, 300, 80, 24, "Abbrechen")
      EndIf
  EndIf
EndProcedure






Open_Window_0()
ShowWindow_(WindowID(0),#SW_MAXIMIZE) 

 CreateMenu(0, WindowID(0))
  MenuTitle("&Datei")
  MenuItem( 1, "&Neu")
  MenuItem( 2, "&Laden")
  MenuItem( 3, "&Speichern")
;  MenuItem( 4, "Nicht definiert")
  MenuBar()
;  MenuItem( 5, "Nicht definiert")
  MenuItem( 6, "&Beenden")
  
AddKeyboardShortcut(#Window_0, #PB_Shortcut_Alt |#PB_Shortcut_H, 734)





Programmschleifenstart:
Repeat

  
  Event = WaitWindowEvent()  
  WindowID = EventWindow()  
  GadgetID = EventGadget() ; Is it a gadget event? 
  EventType = EventType() ; The event type 



    If Event = #PB_Event_Menu
    
    If EventMenu()=734 And Event = #PB_Event_Menu
    If hilfe = 1
    Gosub hilfe1
    Else
    Gosub hilfe0
    EndIf
    EndIf
    EndIf
    
  
  If Event = #PB_Event_Gadget
    
    GadgetID = EventGadget()
    

    If GadgetID = #HelpButton
    If hilfe = 1
    Gosub hilfe1
    Else
    Gosub hilfe0
    EndIf
    EndIf


    If GadgetID = #Button_Dlte
    Gosub eintragloeschen
    EndIf


    If GadgetID = #Button_OK
    Gosub datensatzerzeugen
    EndIf

    
  EndIf
  
Until WindowID=#Window_0 And event= #PB_Event_CloseWindow

Ergebnis=MessageRequester("Programm beenden", "Programm schliessen?", #PB_MessageRequester_YesNoCancel)

If Ergebnis=7 Or Ergebnis=2
Goto Programmschleifenstart
EndIf 

End


hilfe0:
    hilfe=1
    ;SetActiveWindow(#Window_0)
    HideGadget(#Helpin,0)
    Frame3DGadget(#F3Help, 7,  10, 40, 600, "&Hilfe")
    ButtonGadget(#HelpButton,  11, 585, 32, 20, "Aus",#PB_Button_Toggle)
    SetGadgetState(#HelpButton,1)
Return
hilfe1:
    hilfe=0
    ;SetActiveWindow(#Window_0)
    HideGadget(#Helpin,1)
    Frame3DGadget(#F3Help, 7,  10, 40, 40, "&Hilfe")
    ButtonGadget(#HelpButton,  11, 25, 32, 20, "Ein",#PB_Button_Toggle)
    SetGadgetState(#HelpButton,0)
Return

datensatzerzeugen:




datensatzende:
Return
;------------------------------------------------------------------------------------------
eintragloeschen:

Open_Window_EK()


SetWindowTitle(#Window_EK, "Korrektur: "+ abc$)


repcor:
Repeat

  
  Event = WaitWindowEvent()  
  WindowID = EventWindow()  
  GadgetID = EventGadget() ; Is it a gadget event? 
  EventType = EventType() ; The event type 



    If Event = #PB_Event_Menu
        
 
    EndIf
    
  
  If Event = #PB_Event_Gadget
    
    GadgetID = EventGadget()
    

    If GadgetID = #EKButton_OK
    Goto startchange
    EndIf


    If GadgetID = #EKButton_L
    Goto elende
    EndIf

    
  EndIf

Until WindowID=#Window_EK And event= #PB_Event_CloseWindow
Goto elende:

elende:
CloseWindow(#Window_EK)

Return

startchange:
Return
Zuletzt geändert von hiltwin am 12.01.2007 17:29, insgesamt 1-mal geändert.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

1. Du hast zwei Eventschleifen. Für jedes Fenster eine. Das funktioniert
logischerweise nicht.
Wie soll das erste Fenster reagieren können, wenn du in der Schleife des
andere bist?

2. Trenn dich bitte von den ganzen GoSubs. Du machst zwar nichts falsch,
aber mit Procedures ist das Leben leichter.


Da ich gerade mal wieder zu viel Zeit hatte, hab ich den Code gleich mal so
umgeschrieben, wie ich es machen würde, damit es übersichtlich
programmiert ist und auch richtig funktioniert.
So wie ich die Eventschleife gestaltet habe, sollte man es machen.

Code: Alles auswählen

;- Window Constants
;
Enumeration
  #Window_0
  #Window_EK
EndEnumeration

;- Gadget Constants
;
Enumeration
  #F3DI
  #Button_OK
  #Button_Dlte
  #EKButton_OK
  #EKButton_L
  #F3Help
  #Helpin
  #HelpButton
  #EKF3DI
EndEnumeration


#LVM_FIRST = $1000
#LVM_GETHEADER = #LVM_FIRST + 31

;- Fonts
;

Global FontID1
FontID1 = LoadFont(1, "Arial", 18)
Global FontID2
FontID2 = LoadFont(2, "Arial", 18, #PB_Font_Bold)
Global FontID3
FontID3 = LoadFont(3, "Arial", 6)
Global FontID4
FontID4 = LoadFont(4, "Arial", 8)
Global FontID5
FontID5 = LoadFont(5, "Arial", 7)



Procedure Open_Window_0()
  If OpenWindow(#Window_0, 0, 0, 1024, 650, "Hilfe", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget| #PB_Window_SizeGadget | #PB_Window_ScreenCentered  | #PB_Window_WindowCentered | #PB_Window_TitleBar)
    If CreateGadgetList(WindowID(0))
      
      Frame3DGadget(#F3Help, 7, 10, 40, 40, "&Hilfe")
      ButtonGadget(#HelpButton, 11, 25, 32, 20, "Ein",#PB_Button_Toggle)
      SetGadgetState(#HelpButton, 0)
      hilfe$="Hilfe"+Chr(10)+"Hilfe"+Chr(10)+"Hilfe"+Chr(10)+Chr(10)+Chr(10)+Chr(10)+"Hilfe"+Chr(10)+Chr(10)+Chr(10)+"Hilfe"+Chr(10)+"Hilfe"+Chr(10)+Chr(10)+Chr(10)+Chr(10)+Chr(10)+"Hilfe"+Chr(10)+Chr(10)+"Hilfe"+Chr(10)+Chr(10)+Chr(10)+"Hilfe"+Chr(10)+Chr(10)+Chr(10)+"Hilfe"+Chr(10)+"Hilfe"+Chr(10)+"Hilfe"+Chr(10)+"Hilfe"+Chr(10)+Chr(10)+"Hilfe"+Chr(10)+"Hilfe"+Chr(10)+"Hilfe"+Chr(10)+"Hilfe"+Chr(10)+"Hilfe"+Chr(10)+"Hilfe"+Chr(10)+"Hilfe"+Chr(10)+"Hilfe"+Chr(10)+"Hilfe"+Chr(10)+"Hilfe"+Chr(10)+"usw."
      TextGadget(#Helpin,  10, 35, 34, 550, hilfe$)
      SetGadgetFont(#Helpin, FontID5)
      HideGadget(#Helpin,1)
      
      Frame3DGadget(#F3DI, 55,  10, 440, 600, "Erfassung")
      
      ButtonGadget(#Button_OK,  360, 240, 80, 24, "Erfassen")
      ButtonGadget(#Button_Dlte,  360, 300, 80, 24, "Korrigieren")
    EndIf
  EndIf
EndProcedure

Procedure Open_Window_EK()
  If OpenWindow(#Window_EK, 0, 0, 500, 420, "Korrektur", #PB_Window_Invisible | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget| #PB_Window_SizeGadget | #PB_Window_WindowCentered, WindowID(#Window_0))
    If CreateGadgetList(WindowID(#Window_EK))
      
      Frame3DGadget(#EKF3DI, 55,  10, 400, 400, "Korrektur")
      
      ButtonGadget(#EKButton_OK,  360, 240, 80, 24, "Korrigieren")
      ButtonGadget(#EKButton_L,  360, 300, 80, 24, "Abbrechen")
      DisableWindow(#Window_EK, 1)
    EndIf
  EndIf
EndProcedure


Open_Window_0()
Open_Window_EK() ;zeigt das Fenster versteckt an
ShowWindow_(WindowID(0), #SW_MAXIMIZE)

If CreateMenu(0, WindowID(0))
  MenuTitle("&Datei")
  MenuItem( 1, "&Neu")
  MenuItem( 2, "&Laden")
  MenuItem( 3, "&Speichern")
  ;  MenuItem( 4, "Nicht definiert")
  MenuBar()
  ;  MenuItem( 5, "Nicht definiert")
  MenuItem( 6, "&Beenden")
  
  AddKeyboardShortcut(#Window_0, #PB_Shortcut_Alt | #PB_Shortcut_H, 734)
EndIf


Procedure Beenden() ;Fenster, ob man wirklich beenden will
  Protected Ergebnis.l
  
  Ergebnis = MessageRequester("Programm beenden", "Programm schliessen?", #PB_MessageRequester_YesNoCancel)
  
  If Ergebnis = 7 Or Ergebnis = 2
    ProcedureReturn #False
  EndIf
  
  ProcedureReturn #True
EndProcedure

Procedure ToggleHilfe() ;schaltet Hilfe an und aus
  If GetGadgetState(#HelpButton)
    HideGadget(#Helpin, 0)
    ResizeGadget(#F3Help, 7, 10, 40, 600)
    ResizeGadget(#HelpButton, 11, 585, 32, 20)
    SetGadgetText(#HelpButton, "Aus")
    SetGadgetState(#HelpButton, 1)
  Else
    HideGadget(#Helpin, 1)
    ResizeGadget(#F3Help, 7, 10, 40, 40)
    ResizeGadget(#HelpButton, 11, 25, 32, 20)
    SetGadgetText(#HelpButton, "Ein")
    SetGadgetState(#HelpButton, 0)
  EndIf
EndProcedure

Procedure DatensatzErzeugen() ;noch nichts
  MessageRequester("", "Datensatz erzeugen")
EndProcedure

Procedure EintragLoeschen(abc.s) ;öffnet das Korrekturfenster
  SetWindowTitle(#Window_EK, "Korrektur: " + abc)
  HideWindow(#Window_EK, 0)
  DisableWindow(#Window_EK, 0)
EndProcedure

Procedure StartChange() ;noch nichts
  MessageRequester("", "Start Change")
EndProcedure

Repeat
  Event = WaitWindowEvent() 
  WindowID = EventWindow() 
  GadgetID = EventGadget() ; Is it a gadget event?
  EventType = EventType()  ; The event type
  
  Select WindowID
    Case #Window_0 ;Alle Events des Hauptfensters abarbeiten
      Select Event
        Case #PB_Event_CloseWindow
          If Beenden() : Break : EndIf
        
        Case #PB_Event_Menu
          Select EventMenu()
            Case 734 : ToggleHilfe()
            Case 6   : If Beenden() : Break : EndIf
          EndSelect
        
        Case #PB_Event_Gadget
          Select EventGadget()
            Case #HelpButton : ToggleHilfe()
            Case #Button_Dlte : EintragLoeschen("test")
            Case #Button_OK : DatensatzErzeugen()
          EndSelect
      EndSelect
    
    Case #Window_EK ;alle Events des Korrekturfensters abarbeiten
      Select Event
        Case #PB_Event_CloseWindow
          HideWindow(#Window_EK, 1)
          DisableWindow(#Window_EK, 1)
        
        Case #PB_Event_Gadget
          Select EventGadget()
            Case #EKButton_OK : StartChange()
            Case #EKButton_L
              HideWindow(#Window_EK, 1)
              DisableWindow(#Window_EK, 1)
          EndSelect
      EndSelect
  EndSelect 
ForEver

End
hiltwin
Beiträge: 311
Registriert: 06.10.2005 11:08
Wohnort: D-31177 Harsum
Kontaktdaten:

Hi Nic ...

Beitrag von hiltwin »

... vielen Dank für die schnelle Antwort!

Also, nun funktioniert die Toggle-Funktion einwandfrei, allerdings ist nun ALT+H out of order in Deiner Version :-)

Zu 2.
Du sagst ja selber, das ich nichts falsch mache :-)
Ich hab vor 20 Jahren mit gosub mir meinen "Routinen" gebaut, und meine gosubs sind auch heute so aufgebaut, dass sie wie Routinen funktionieren. Für mich ist der Zugang so einfacher, mir übergebende Variablen zu merken, mit Werten zu bestücken und diese zurückzugeben, als wenn ich mit Proceduren arbeiten würde.

Zu 1.
Warum funktionieren zwei Eventschleifen nicht?
Ich möchte in meinem Programm gar nicht, dass sich im ersten Fenster etwas tut, wenn das zweite offen ist!

Evtl. hattest Du gar nicht mein eigentliches Problem erkannt! Mein Problem WAR, dass sich nach dem Aufruf des zweiten Fensters auf einmal die

Code: Alles auswählen

hilfe0: 
    hilfe=1 
    ;SetActiveWindow(#Window_0) 
    HideGadget(#Helpin,0) 
    Frame3DGadget(#F3Help, 7,  10, 40, 600, "&Hilfe") 
    ButtonGadget(#HelpButton,  11, 585, 32, 20, "Aus",#PB_Button_Toggle) 
    SetGadgetState(#HelpButton,1) 
Return 
hilfe1: 
    hilfe=0 
    ;SetActiveWindow(#Window_0) 
    HideGadget(#Helpin,1) 
    Frame3DGadget(#F3Help, 7,  10, 40, 40, "&Hilfe") 
    ButtonGadget(#HelpButton,  11, 25, 32, 20, "Ein",#PB_Button_Toggle) 
    SetGadgetState(#HelpButton,0) 
Return 
entsprechenden Gadgets trotz konkreter Anweisung an ganz anderer Position befunden haben, als vorgegeben.

Dank Deinem Posting habe ich mich allerdings selber noch mal auf die Fehlersuche gemacht und hab den Fehler gefunden!

Anstelle die Gadgets erneut zu definieren, müssen sie mit ResizeGadget und SetGadgetText neu bestückt werden, so dass der entscheidende Code so lauten muss ...

Code: Alles auswählen

hilfe0:
    hilfe=1
    HideGadget(#Helpin,0)
    ResizeGadget(#F3Help, #PB_Ignore, #PB_Ignore, #PB_Ignore, 600)
    ResizeGadget(#HelpButton, #PB_Ignore, 585, #PB_Ignore, #PB_Ignore)
    SetGadgetText(#HelpButton,"Aus")
    SetGadgetState(#HelpButton,1)
Return
hilfe1:
    hilfe=0
    HideGadget(#Helpin,1)
    ResizeGadget(#F3Help, #PB_Ignore, #PB_Ignore, #PB_Ignore, 40)
    ResizeGadget(#HelpButton, #PB_Ignore, 25, #PB_Ignore, #PB_Ignore)
    SetGadgetText(#HelpButton,"Ein")
    SetGadgetState(#HelpButton,0)
Return
Mein Projekt ist schon zu weit fortgeschritten, als das ich den Grundaufbau nochmal ändere. Allerdings hab ich mir vorgenommen, das nächste Programm mal nach Deinem Grundmuster zu beginnen :wink:

Allen ein schönes Wochenende
Hiltwin
Gisela
Beiträge: 33
Registriert: 02.04.2005 20:03

Beitrag von Gisela »

Jau prima, genau das hab ich gesucht. Besten Dank Nic. Jetzt ist mir beim Handling von mehreren Fenstern in einer Anwendung doch etliches klar geworden. Mit DisableWindow() auf das Hauptfenster bekomme ich dann auch meine modalen Dialoge hin :allright:
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

Beitrag von ts-soft »

@hiltwin
könntest Du bitte drauf achten, das so Codezeilen wie hilfe$ auch
Leerzeichen enthalten, diese Zeile sprengt die Boardansicht und macht das
lesen fast unmöglich.
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
Antworten