Seite 2 von 2

Verfasst: 03.05.2008 19:31
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

Verfasst: 03.05.2008 19:42
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

Verfasst: 03.05.2008 19:45
von mk-soft
Wer automatische Eventhandling benötig siehe Signatur

Verfasst: 03.05.2008 19:50
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

Verfasst: 03.05.2008 20:31
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

Verfasst: 03.05.2008 20:41
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.

Verfasst: 03.05.2008 21:26
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 :)

Verfasst: 03.05.2008 22:49
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!