Seite 1 von 2

Hauptfenster -> weitere Fenster aufrufen und zurückkehren

Verfasst: 25.08.2006 22:00
von ms
Meine bishereige Programmierumgebung ist / war VBA6. Purebasic gefällt mir wesentlich besser da schneller und kompakter.

Problem:
Hauptfenster mit MENU

Aus diesem Fenster möchte ich verschiedene Berechnungen in anderen Fenstern erstellen. Nach Beendigung der Berechnung im Sub-Fenster möchte ich mit einem "Button" z.b. "zurück" ins Hauptfenster zurückkehren aber den Inhalt des Hauptfensters wieder angezeigt bekommen. Aus dem Hauptfenster mit Menu möchte ich alle Aktionen starten : entweder über Buttons oder über MENUEinträge

Hat jemand eine Idee

Verfasst: 25.08.2006 22:08
von ts-soft
Ja, aber Deine Ausführungen sind nicht so klar
Also, erstelle alle 3 Fenster, invisible am besten. Bei dem 2ten und 3ten
Fenster die ParentID des ersten Fensters mit angeben. Je nach Button einfach
das entsprechende Fenster mit HideWindow(bla, #False) anzeigen.

Am besten eine Ereignisscleife für alle 3 Fenster, wobei du vor allem bei
#PB_Event_CloseWindow unterscheiden mußt, welches Fenster löste diese
Ereignis aus.
Am besten erstmal anfangen und dann etwas konkreter Fragen :wink:

Verfasst: 25.08.2006 23:03
von AND51
Tipp: Wenn ein "Chldfenster" oder "Subfenster" geöffnet ist, solange das Hauptfenster mit EnableWindow_(WindowID(), #False) sperren.

Dies bewirkt, dass das Hauptfenster keinerlei Eregnisse empfangen kann und man auch nicht von Childfenster zum hauptfenster wechseln kann. Ist ein Childwindow geöffnet und ich klicke auf deinHauptfenster blinkt dies automatisch kurz auf und es ist der WIndowssound "Ding" zu hören.

Danach das Childfenster wieder schließen und das Hauptfenster mit #True wieder aktivieren.

Verfasst: 26.08.2006 19:55
von mk-soft
Für faule Programmierer: (Werbung)
http://www.purearea.net/pb/showcase/sho ... p=0&sort=1

Mehrere Fenster Erzeugen mit unterschiedliche WindowID-Namen und dann Projekt erzeugen.

FF :wink:

Verfasst: 26.08.2006 20:34
von ms
Danke für Eure Info´s
Die Frage ist ob ich mich komplett auf dem "Holzweg" befinde, d.h. die Struktur des Programms falsch ist.

Also, habe ein Hauptfenster mit MENU einigen Texten und einer Tabelle.
Über einen Menueintrag wird die Subroutine geöffnet (=weiteres Fenster etc). Die Subroutine kann nur über einen Button "Beenden" verlassen werden. Verlassen der SR klappt auch. Anzeige von Window(0) klappt auch, aber die Texte, Tabelle etc. sind im Anzeigebereich von Window(1) nicht mehr vorhanden. (Funktioniert aber unter VBA6). Müssen die Inhalte von Window(0) neu generiert werden oder ist hier der Weg über eine Subroutine falsch. Procedure benutzen ?

Ein weiterer Punkt: Wenn ich im Hauptfenster zurück bin (das Menu ist noch vorhanden) und ich den gleichen Menupunkt noch einmal wähle kommt das Programm komplett "aus dem Tritt".

*********** Hauptfenster erstellen mit Menu, Text, etc *********

Code: Alles auswählen

;- Hauptfenster mit Menu

If OpenWindow(0, 200, 200, 1000, 750, "Lotto 2006", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered)
SetWindowColor(0,$E0FFFF) 
  
If CreateMenu(0, WindowID(0))
      MenuTitle("&System")
      MenuItem( 1, "Samstagslotto")
     ....
EndIf
 
 ;- Startbildschirm
If CreateGadgetList(WindowID(0))
Date$ = FormatDate("%dd.%mm.%yyyy", Date())
TextGadget(2, 680, 80, 250,25, "Lotto 2006     Stand:   "+Date$)

ButtonGadget(101, 680, 610,  120, 40, "Samstagslotto")
ButtonGadget(102, 820, 610,  120, 40, "Mittwochslotto") 

ListIconGadget(1, 60, 70, 590, 590,"Nr", 65, #PB_ListIcon_GridLines | #PB_Gadget_FrontColor)
AddGadgetColumn(1, 1, "Datum", 85)
...
EndIf
 
;- Auswertung MENU oder Schalter
  Repeat

    Select WaitWindowEvent()
    Case #PB_Event_Gadget
    
    Select EventGadget()                  ; Schalter auswählen
    Case 101
    Gosub Samstagslotto                   ; Samstagslotto  
    Case 102 
    Gosub Mittwochslotto                  ; Mittwochslotto
    EndSelect   
    
    
    Case #PB_Event_Menu                   ; Menupunkt auswählen
    Select EventMenu()                   
    Case 1                                ; Samstagslotto
    Gosub Samstagslotto
    Case 21                               
    Gosub Auswertung006                   ;Auswertung 006 -> Drucker
    ***** Hier wird ein Sub-Fenster eröffnet ****
     EndSelect
    Case #PB_Event_CloseWindow
    Quit=1
    EndSelect
    Until Quit=1  
EndIf
End  

*** Subfenster ************************************
;- Subroutine Auswertung aller Zahlen (006) => Drucker 
Auswertung006:

If entree.b =0:Return:EndIf

HideWindow(0,1)

If OpenWindow(1, 200, 200, 750, 700, Titel.s ,#PB_Window_MinimizeGadget ,0 )

If CreateGadgetList(WindowID(1))

Date$ = FormatDate("%dd.%mm.%yyyy", Date())
TextGadget(2, 450, 30, 300,25, "Lotto 2006     Stand:   "+Date$)
ButtonGadget(105, 450, 600,  100, 30, "Beenden")
......
EndIf 

Repeat
Select WaitWindowEvent()

Case #PB_Event_Gadget
Select EventGadget()                  
Case 105                               ; Beenden
CloseWindow(1):ende=1
HideWindow(0,0)
EndSelect   
Return

Edit Falko

Verfasst: 27.08.2006 08:49
von ts-soft
Bitte Codetags setzen, am anfang auf Code drücken und am Ende nochmal.
Und bitte die Bemerkungen mit Semikolon als solche Kennzeichnen, so das
der Code ausführbar ist, ohne Fehlermeldungen

Verfasst: 27.08.2006 20:29
von ms
Hier noch einmal ein Auszug des Programmcodes. Läßt sich compilieren und ausführen. Ins Subfenster mit Menupunkt Numerische Auswertung -->Auswertung006. Rückkehr ins Hauptfenster mit Button "Beenden".
--> Tabelle fehlt (ist normalerweise gefüllt mit Daten)
Nochmaliges aufrufen über Auswerutng006
--> Subfenster lässt sich über "Beenden" nicht mehr schließen.
Bei Bedarf könnte ich auch meine komplette Source per E-Mail senden
(ca. 450 Zeilen Code und dazugehörige Dateien). Das Gesamtprojekt ca. 10.000 Zeilen ist bereits unter VBA6 realisiert). Ich möchte es auf Purebasic portieren.

Code: Alles auswählen

;Hier ist der code
;- Hauptfenster mit Menu
If OpenWindow(0, 200, 200, 1000, 750, "Lotto 2006", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered)
SetWindowColor(0,$E0FFFF)
If CreateMenu(0, WindowID(0))
MenuTitle("&System")
MenuItem( 1, "Samstagslotto")
MenuTitle("&Numerische Auswertung")
MenuItem(21, "Auswertung006 -> Drucker")
MenuItem(22, "Auswertung007 -> Drucker")
EndIf
;- Startbildschirm
If CreateGadgetList(WindowID(0))
Date$ = FormatDate("%dd.%mm.%yyyy", Date())
TextGadget(2, 680, 80, 250,25, "Lotto 2006 Stand: "+Date$)
TextGadget(2, 680, 80, 250,25, "Lotto 2006     Stand:   "+Date$)
TextGadget(3, 680, 155, 200,25, "Keine Daten Geladen...")
TextGadget(4, 680, 230, 200,25, "Anzahl Ziehungen...")
TextGadget(5, 680, 260, 200,25, "Erste Ziehung...")
TextGadget(6, 680, 290, 200,25, "Letzte Ziehung...")
TextGadget(7, 680, 440, 200,25, "Version 1.2 - 21.08.2006")

ButtonGadget(101, 680, 610, 120, 40, "Samstagslotto")
ButtonGadget(102, 820, 610, 120, 40, "Mittwochslotto")

ListIconGadget(1, 60, 70, 590, 590,"Nr", 65, #PB_ListIcon_GridLines | #PB_Gadget_FrontColor)
AddGadgetColumn(1, 1, "Datum", 85)
EndIf

;- Auswertung MENU oder Schalter
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
Select EventGadget() ; Schalter auswählen
Case 101
;Gosub Samstagslotto ; Samstagslotto
Case 102
;Gosub Mittwochslotto ; Mittwochslotto
EndSelect

Case #PB_Event_Menu ; Menupunkt auswählen
Select EventMenu()
Case 1 ; Samstagslotto
;Gosub Samstagslotto
Case 21
Gosub Auswertung006 ;Auswertung 006 -> Drucker
;***** Hier wird ein SUB-Fenster eröffnet ****
EndSelect
Case #PB_Event_CloseWindow
Quit=1
EndSelect
Until Quit=1
EndIf
End

;- Subroutine Auswertung aller Zahlen (006) => Drucker
Auswertung006:

HideWindow(0,1)
If OpenWindow(1, 200, 200, 950, 700, Titel.s ,#PB_Window_MinimizeGadget ,0 )

If CreateGadgetList(WindowID(1))
Date$ = FormatDate("%dd.%mm.%yyyy", Date())
TextGadget(2, 450, 30, 300,25, "Lotto 2006 Stand: "+Date$)
ButtonGadget(105, 450, 600, 100, 30, "Beenden")
ListIconGadget(1, 30, 30, 345, 600,"Kombination", 100,#PB_ListIcon_GridLines | #PB_Gadget_FrontColor)
AddGadgetColumn(1, 1, "1. Zahl", 60)
AddGadgetColumn(1, 2, "2. Zahl", 60)
AddGadgetColumn(1, 3, "3. Zahl", 60)
AddGadgetColumn(1, 4, "x. Zahl", 60) 
EndIf 
EndIf

Repeat
Select WaitWindowEvent()

Case #PB_Event_Gadget
Select EventGadget()                  
Case 105                               ; Beenden
CloseWindow(1):ende=1
HideWindow(0,0)
EndSelect   

Case #PB_Event_CloseWindow
CloseWindow(1):ende=1
HideWindow(0,0)
EndSelect
Until ende=1

Return
edit Falko

Verfasst: 27.08.2006 21:01
von ts-soft
Code immer in Code Tags setzen
[code]
; ab hier wird normallerweise alles als code dargestellt
[/code]
Hier gehts normal weiter
PS: Deinen obigen Code kannste auch editieren, und die Tags noch einfügen
danke :wink:

Verfasst: 27.08.2006 21:14
von Falko
@ms, sorry, das ich bei dir die Codetags gesetzt habe, aber besser sieht's
schon aus.
Nur habe ich den Code so nicht getestet, weil da noch ... und ein Return
am Ende vorhanden ist, was so nicht läuft.
Wenn das nur Codeabschnitte sein sollten müsstest du jeweils die Codetags,
so wie ts-soft beschreibt, noch manuell anpassen. 8)

Gruß Falko

Verfasst: 28.08.2006 19:34
von ms
Man kann das gesamte Fenster kopieren in den PB4 Editor laden und testen. Das Problem mit der fehlenden Tabelle habe ich gelöst. ListIconGadget hat in beiden Fenstern die Identität 1 sowohl in Window 0 als auch in Window 1. Ich war aber der Meinung dass Purebasic für jedes Window die Zuordnungen selbst organisiert. Aber egal.
Aber die Sache mit dem 2-fach Aufruf des Subfensters ist noch offen.
Falko, was ist am Return=Rücksprung aus Subroutine am Ende zu ändern? Vielleicht liegt ja hier die Lösung für den Mehrfachaufruf.