Problem beim Schließen von 2. Fenster: "#Gadget [gelöst

Anfängerfragen zum Programmieren mit PureBasic.
Lehrer
Beiträge: 5
Registriert: 05.10.2007 19:33

Beitrag von Lehrer »

Danke für Eure Hilfen, war echt SUPER :allright:

Tobe, eine Frage noch:
Wie hast Du den Fehler gefunden? Für die Zukunft ist das sicher hilfreich...

An Tomas:
Das mit der Dynamik sollte ich mir dann mal zu Gemüte führen :D
Also nochmals Danke!

Gruß,
Christoph
PB 4.00 - Win XP
Benutzeravatar
michel51
Beiträge: 84
Registriert: 01.11.2005 20:00
Wohnort: Dornhan-Weiden

Beitrag von michel51 »

Hallo Lehrer,
versuch es mal damit. Bei mir läuft es mit 3 Fenstern :-)
Vielleicht geht es ja auch auf anderen Plattformen...

Code: Alles auswählen

; Beispiel Umgang mit mehreren Fenstern (Kaskadierung) 
 ; PAMKKKKK 21.September.2005 
 ; PB 3.94. 
 ; getestet und angepasst an PB 4.10 Mac by michel51

 ;- 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, "Fenster 0",  #PB_Window_SystemMenu | #PB_Window_TitleBar ) = 0 
     MessageRequester("Fehler!","Fehler beim Oeffenen von Fenster 0") 
     ProcedureReturn 0 ; bei Fehler raus aus der Procedure 
   EndIf 
   If CreateGadgetList(WindowID(#Window_0)) = 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 fuer Fenster 1",#PB_Text_Center ) 
   ButtonGadget(#Button_0_1, 65, 60, 100, 30, "Aufmachen") 
   ProcedureReturn 1 ; alles OK 
 EndProcedure 

 Procedure Open_Window_1() 
   If OpenWindow(#Window_1, 220, 220, 200, 100, "Fenster 1",  #PB_Window_SystemMenu | #PB_Window_TitleBar ) = 0 
     MessageRequester("Fehler!", "Fehler beim Oeffenen von Fenster 1") 
     ProcedureReturn 0 ; bei Fehler raus aus der Procedure 
   EndIf 
   If CreateGadgetList(WindowID(#Window_1)) = 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 ein Fenster ?",#PB_Text_Center ) 
   ButtonGadget(#Button_1_1, 15, 60, 80, 30, "Abbruch") 
   ButtonGadget(#Button_1_2, 115, 60, 80, 30, "Weiter") 
   ProcedureReturn 1 ; alles OK 
 EndProcedure 

 Procedure Open_Window_2() 
   If OpenWindow(#Window_2, 240, 240, 200, 100, "Fenster 2",  #PB_Window_SystemMenu | #PB_Window_TitleBar ) = 0 
     MessageRequester("Fehler!", "Fehler beim oeffenen von Fenster 2") 
     ProcedureReturn 0 ; bei Fehler raus aus der Procedure 
   EndIf 
   If CreateGadgetList(WindowID(#Window_2)) = 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, "Zurueck") 
   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) 
   DisableWindow(#Window_0,1) 
   ;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 
   DisableWindow(#Window_0, 0) ; Fenster 0 wieder Aktivieren (Windows API) 
   ;UseWindow(#Window_0) ; Fenster 0 benutzen 
   SetActiveWindow(#Window_0) ; 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) 
   DisableWindow(#Window_1, 1) 
   ;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 
   DisableWindow(#Window_1, 0) ; Fenster 1 wieder Aktivieren 
   ;UseWindow(#Window_1) ; Fenster 1 benutzen 
   SetActiveWindow(#Window_1) ; 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 = EventWindow() ; 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_Event_Gadget ; Wenn das Ereignisvon einem Gadget kam 
       GadgetID = EventGadget() ; 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 2-1 
           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
michel51

Mac OS X Snow Leopard (10.6.8 ) Intel
PureBasic V 5.11(X64), V 5.21(x64)

Zum Lernen ist niemand zu alt.
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Wer automatische Eventhandling benötig siehe Signatur
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
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 »

mk-soft hat geschrieben:Wer automatische Eventhandling benötig siehe Signatur
Dein Generator ist sehr schön, aber wenn Einsteiger erstmal total auf
visuelle Designer verzichten würden, dann gäbe es solche Probleme nicht
:wink:
Ich erstelle meist Fenster, die komplette resizable sind, dort ist ein Designer
sowieso nicht angebracht, zumal meine Gadgets meist mit der größe:
0. 0. 0. 0 beginnen :mrgreen:
Da ist Rechnen und logisches Denken gefragt

Gruß
Thomas
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
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Visual Designer ist nicht unbedingt erforderlich. kommt auch mit Hand geschiebene Common.pb klar.

Beispiel minimale Common.pb datei

Code: Alles auswählen

; Simple common file
; Enumeration not used
; Safe as common.pb and run Visual Generate to create code

Procedure Open_MainWin() ; "Open_" is as primary key for open_window_xyz

  If OpenWindow(#MainWin, 0,0,600,400, "Main Window")
  
    If CreateImageMenu(#MenuBar, WindowID(#MainWin), #PB_Menu_ModernLook)
      MenuTitle("&File")
      MenuItem(#Menu_Exit, "E&xit\tAlt-F4")
    EndIf

    If CreatePopupImageMenu(#MenuSub, #PB_Menu_ModernLook)     
      MenuItem(#MenuSub_OpenFile, "Öffnen")   
      MenuItem(#MenuSub_CloseFile, "Schliessen")
      OpenSubMenu("Öffnen mit...")
        MenuItem(#MenuSub_OpenWithPB, "PureBasic")
        MenuItem(#MenuSub_OpenWithPB_Beta, "PureBasic beta",LoadImage(0, "D:\Winapp\PureBasic420beta\Examples\Sources\Data\CDPlayer.ico"))
      CloseSubMenu()       
      MenuItem(#MenuSub_SaveFile, "Speichern")
      MenuItem(#MenuSub_Exit, "Exit")
    EndIf
    
    If CreateStatusBar(#StatusBar, WindowID(#MainWin))
    
    EndIf

    If CreateGadgetList(WindowID(#MainWin))
      ButtonGadget(#Button, 10,10,120,25, "SubMenu")
    EndIf
    
  EndIf

EndProcedure
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
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 »

mk-soft hat geschrieben:Visual Designer ist nicht unbedingt erforderlich. kommt auch mit Hand geschiebene Common.pb klar.
Einsteiger sollten erstmal garkeine Hilfsmittel nutzen, ausser der Hilfe, div.
Tutorials usw.
Alles zu Fuß, sonst lernt man es einfach nicht. Anfänger kopieren sich oftmals
verschiedene Codes zusammen, und fügen den anderen Code eben falsch
ein, weil sie den Aufbau nicht verstehen. Besser ist es, wenn sie es lernen,
den Aufbau an Ihren Stil anzupassen. Für einen eigenen Stil ist es aber er-
forderlich auf Designer, Eventgeneratoren usw. zu verzichten.
Wenn man es dann so langsam kann, kann man auch Designer und Co ver-
wenden, wobei man dann aber zunehmend merkt, das diese garnicht so
nützlich sind.
Um mir eine Vorstellung der GUI zu verschaffen, wende ich sowas mal an,
könnte es aber auch mit einem Grafikprogramm zeichnen, weil die
koordinaten errechne ich im endeffekt alle im #WM_SIZE event. woanders
benötige ich sie nicht.
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
Benutzeravatar
tobe
Beiträge: 146
Registriert: 14.09.2006 17:33
Wohnort: Oktoberfest

Beitrag von tobe »

Wie hast Du den Fehler gefunden? Für die Zukunft ist das sicher hilfreich...
der error war bei mir in der zeile 84

Code: Alles auswählen

projekt_pfad$=arbeitspfad$+GetGadgetText(#Titel)+"_"+GetGadgetText(#komponist)+"_"+GetGadgetText(#arrangeur)
die zeile hab ich dann einfach mal abgeschaltet.
jetzt ging der code ohne fehler, aber das #arrangeur gadget war plötzlich verschwunden.
ab da war es nur noch etwas sucharbeit wie das neue fenster an die gadgets des anderen fensters kommt und da bin ich dann über die konstanten gestolpert und schon war das rätzel gelöst ;)

wie ts-soft schon sagte mit #PB_Any wär das nicht passiert, evtl hat mich der hinweis auch so schnell auf die konstanten gebracht :)
PureBasic 4.40 (Windows - x86)
Lehrer
Beiträge: 5
Registriert: 05.10.2007 19:33

Beitrag von Lehrer »

Hallo Tobe,

wenn ich es mir jetzt im Nachhinein betrachte, hätte ich vielleicht auch drauf kommen können. .. :oops:

An Thomas
Die Kritik gegen VisualDesigner <-> Anfänger kann ich verstehen.
Aber es ist schon recht verlockend, damit zu arbeiten.
Wenn ich nochmal ein "Projekt" angehe werde ich versuchen, Deinen Rat in die Tat umzusetzen.

Bislang habe ich allerdings auch viel aus anderen Codebeispielen gelernt.
Das heißt aber nicht, dass sie blind kopiert werden. Ich versuche auch mich "weiter zu entwickeln". Aber bei meinem Talent und vor allem Zeit, werde ich wohl immer Anfänger bleiben ;)

Also, ich denke, das Problem ist mehr als gut gelöst.
DANKE an alle!
PB 4.00 - Win XP
Antworten