windows mal 2

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
drunken-duck
Beiträge: 10
Registriert: 15.09.2004 08:12
Wohnort: Berlin
Kontaktdaten:

windows mal 2

Beitrag von drunken-duck »

moin,
purebasic ver.: immernoch 3.30
folgendes ich hab was kleines geschrieben und möchte eine hilfe bzw ein about window öffnen. wenn das jeweils "andere" fenster aufgerufen wird, soll das child_window geschlossen werden.

------------------------------------

Code: Alles auswählen

;-Konstanten
#window_main = 110
#window_help = 220
#window_about = 330
.
.
.
;-mainwindow      
If OpenWindow(#window_main,200,200,400,400 #pb_window_systemmenu|#PB_Window_SizeGadget,
.
.
.
;-Help  
    If EventMenuID() = 26 
      Gosub help   ;text holen ;o)
      If WindowID(#window_about) <> 0
        CloseWindow(#window_about)
      EndIf
      If OpenWindow(#window_help,200,200,358,360,#pb_window_systemmenu,"Help")
        If CreateGadgetList(WindowID(#window_help))
          TextGadget(40, 2, 2, 356, 358,helptext.s,#PB_Text_Border) 
        EndIf 
      EndIf
    EndIf
;-About BFL  
    If EventMenuID() = 27
      Gosub about ;text holen...
      If WindowID(#window_help) <> 0
        CloseWindow(#window_help)
      EndIf
      If OpenWindow(#window_about,200,200,260,202,#pb_window_systemmenu,"About BFL")
        If CreateGadgetList(WindowID(#window_about))
          TextGadget(40, 2, 2, 258, 200,abouttext.s,#PB_Text_Center|#PB_Text_Border) 
        EndIf 
    EndIf
  EndIf
.
.
.
Select eventid
      Case #pb_eventclosewindow
              Select EventWindowID()
                Case #window_help
                  CloseWindow(#window_help) 
                  UseWindow(#window_main) 
                ; UseGadgetList(#window_main) ; hat nix geholfen
                Case #window_about
                  CloseWindow(#window_about)
                  UseWindow(#window_main)
                ; UseGadgetList(#window_main) ; hat nix geholfen
               Case #window_main
                 quit = 1
          EndSelect
.        
.
.    
       
mein eigentliches problem sind nun die child_windows. während das alles so wie gewollt auf meinem winxp läuft crasht das proggy unter windows2000server und auf dem winxp eines freundes. mach ich was großartiges hier falsch? oder kann der fehler vielleicht "tieferliegende" OS-gründe haben?

sry wenn der code nicht ganz mmmh...professionell aussieht.


wenn wir schon hier zusammenkommen...
sollte man aus performancegründen eher gosub - return oder procedure() benutzen? ;)
-=DD=-
"Nicht der Fortschritt ist entscheidend, sondern seine Richtung."
"Ja, ja ich weiß...dir wäre das nicht passiert." ;)
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag von nicolaus »

hm du hast in deinem code weder eine repeatschleife noch ein menu doch fragst du in dem code von dir ein EventMenuID ab.
Als erstes brauchst du mal eine repeatschleife in der die verschiedenen events auch immer abgefragt werden können.
Benutzeravatar
drunken-duck
Beiträge: 10
Registriert: 15.09.2004 08:12
Wohnort: Berlin
Kontaktdaten:

Beitrag von drunken-duck »

obwohl das prog mit 89 kb ziemlich klein ist wollte ich es mir / euch ersparen 680 zeilen gepostet zu haben. also beschränkte ich mich auf die, meiner meinung nach, wichtigsten teile, sprich alles was die child_windows betrifft.
es gibt eine repeat schleife, die auch diese routinen abfragt.
glaub mir.... ;)

oder meinst du der fehler könnte ganz woanders liegen? :?
-=DD=-
"Nicht der Fortschritt ist entscheidend, sondern seine Richtung."
"Ja, ja ich weiß...dir wäre das nicht passiert." ;)
sobi
Beiträge: 170
Registriert: 05.02.2005 23:41
Wohnort: passau
Kontaktdaten:

Re: windows mal 2

Beitrag von sobi »

drunken-duck hat geschrieben:wenn wir schon hier zusammenkommen...
sollte man aus performancegründen eher gosub - return oder procedure() benutzen? ;)
Ähm, das würde mich auch intressieren, was besser, schneller, einfacher... ist?
Sorgen sind wie Blumen, wenn man sie nicht gießt, gehen sie ein.
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag von nicolaus »

ok das kann ich halt jetzt nich genau sagen wo ich nich den ganzen code sehe aber ich werde dir mal eben ein beispiel basteln und das gleich posten. hoffe das hilft dir dann
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag von nicolaus »

ok nachfolgend ein kleines beispiel wobei es bekanntlich viele weg nach rom gibt.
Also das ist ein weg wie man es machen kann und das liegt auch immer an jedem selber. Ich persönlich arbeite immer mit proceduren und das is eigentlich auch recht schnell.

Code: Alles auswählen

Enumeration
  #MainWindow
  #HelpWindow
  #AboutWindow
  #txg_help
  #txg_About
  #MainMenu
  #muID_help
  #muID_about
  #btn_about
  #btn_help
EndEnumeration

Dim WindowStats.l(1)

Procedure HelpWindow()
  OpenWindow(#HelpWindow,0,0,200,100,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"HelpWindow",WindowID(#MainWindow))
  CreateGadgetList(WindowID(#HelpWindow))
  TextGadget(#txg_help,10,10,180,15,"Ist nur ein testtext für Help")
  ButtonGadget(#btn_help,10,40,100,20,"Help-Test")
EndProcedure
Procedure AboutWindow()
  OpenWindow(#AboutWindow,0,0,200,100,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"AboutWindow",WindowID(#MainWindow))
  CreateGadgetList(WindowID(#AboutWindow))
  TextGadget(#txg_About,10,10,180,15,"Ist nur ein testtext für About")
  ButtonGadget(#btn_about,10,40,100,20,"About-Test")
EndProcedure

OpenWindow(#MainWindow,0,0,200,200,#PB_Window_ScreenCentered|#PB_Window_SystemMenu,"Mainwindow")
CreateMenu(#MainMenu,WindowID(#MainWindow))
MenuTitle("Test")
MenuItem(#muID_help,"Open Helpwindow")
MenuItem(#muID_about,"Open Aboutwindow")

Repeat
  Delay(1)
  EventID = WindowEvent()
  If EventID = #PB_Event_Menu
    MenuID = EventMenuID()
    If MenuID = #muID_help
      If WindowStats(1) = 0
        HelpWindow()
        WindowStats(0) = 1
      ElseIf WindowStats(1) = 1
        CloseWindow(#AboutWindow)
        WindowStats(1) = 0
        HelpWindow()
        WindowStats(0) = 1
      EndIf
    ElseIf MenuID = #muID_about
      If WindowStats(0) = 0
        HelpWindow()
        WindowStats(1) = 1
      ElseIf WindowStats(0) = 1
        CloseWindow(#HelpWindow)
        WindowStats(0) = 0
        AboutWindow()
        WindowStats(1) = 1
      EndIf
    EndIf
  ElseIf EventID = #PB_Event_Gadget
    GadgetID = EventGadgetID()
    If GadgetID = #btn_help
      MessageRequester("Info","der button im helpfenster mit der id " +Str(#btn_help)+ " wurde gedrückt",0)
    ElseIf GadgetID = #btn_about
      MessageRequester("Info","der button im aboutfenster mit der id " +Str(#btn_about)+ " wurde gedrückt",0)
    EndIf
  EndIf
  
Until EventID = #PB_Event_CloseWindow
wenn noch fragen offen sind einfach fragen

Gruß Nico :wink:
Benutzeravatar
drunken-duck
Beiträge: 10
Registriert: 15.09.2004 08:12
Wohnort: Berlin
Kontaktdaten:

Beitrag von drunken-duck »

danke erstmal...
...ich glaub dafür brauch ich aber etwas länger... ;)
-=DD=-
"Nicht der Fortschritt ist entscheidend, sondern seine Richtung."
"Ja, ja ich weiß...dir wäre das nicht passiert." ;)
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag von nicolaus »

noch ein tip nich das es zu verwirrungen führt. ich habe hier (mit DIM) array´s angelegt wobei du das auch mit variablen machen kannst.
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag von nco2k »

warum kompliziert wenn es auch einfach geht?? :?

Code: Alles auswählen

;- Window Constants
#Window_Main = 0
#Window_Child = 1

;- Shortcut Constants
#Shortcut_Escape = 0
#Shortcut_Return = 1

;- Gadget Constants
#Button_Click = 0
#Button_Quit = 1
#Button_Ok = 2

;- Close Child Window
Procedure Close_Window_Child()
  If WindowID(#Window_Child)
    CloseWindow(#Window_Child)
  EndIf
  EnableWindow_(WindowID(#Window_Main), #True)
  UseWindow(#Window_Main)
  ActivateWindow()
EndProcedure

;- Close Main Window
Procedure Close_Window_Main()
  If WindowID(#Window_Main)
    End
  EndIf
EndProcedure

;- Open Child Window
Procedure Open_Window_Child()
  EnableWindow_(WindowID(#Window_Main), #False)
  If OpenWindow(#Window_Child, 0, 0, 300, 200, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_WindowCentered, "Child", WindowID(#Window_Main))
    If CreateGadgetList(WindowID(#Window_Child))
      ButtonGadget(#Button_Ok, 20, 20, 100, 25, "Ok", #PB_Button_Default)
    EndIf
    AddKeyboardShortcut(#Window_Child, #PB_Shortcut_Escape, #Shortcut_Escape)
    AddKeyboardShortcut(#Window_Child, #PB_Shortcut_Return, #Shortcut_Return)
  Else
    MessageRequester("", "Error", #MB_ICONERROR)
    End
  EndIf
  UseWindow(#Window_Child)
  ActivateWindow()
EndProcedure

;- Open Main Window
Procedure Open_Window_Main()
  If OpenWindow(#Window_Main, 0, 0, 400, 300, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered, "Main")
    If CreateGadgetList(WindowID(#Window_Main))
      ButtonGadget(#Button_Click, 20, 20, 100, 25, "Click Me!")
      ButtonGadget(#Button_Quit, 20, 70, 100, 25, "Quit")
    EndIf
    AddKeyboardShortcut(#Window_Main, #PB_Shortcut_Escape, #Shortcut_Escape)
  Else
    MessageRequester("", "Error", #MB_ICONERROR)
    End
  EndIf
  UseWindow(#Window_Main)
  ActivateWindow()
EndProcedure

;- Event Child Window
Procedure Event_Window_Child(EventID)
  Select EventID
    Case #PB_Event_Menu
      Select EventMenuID()
        Case #Shortcut_Escape
          Close_Window_Child()
        Case #Shortcut_Return
          Close_Window_Child()
      EndSelect
    Case #PB_Event_Gadget
      Select EventGadgetID()
        Case #Button_Ok
          Close_Window_Child()
      EndSelect
    Case #PB_Event_CloseWindow
      Close_Window_Child()
  EndSelect
EndProcedure

;- Event Main Window
Procedure Event_Window_Main(EventID)
  Select EventID
    Case #PB_Event_Menu
      Select EventMenuID()
        Case #Shortcut_Escape
          Close_Window_Main()
        Case #Shortcut_Return
          Close_Window_Main()
      EndSelect
    Case #PB_Event_Gadget
      Select EventGadgetID()
        Case #Button_Click
          Open_Window_Child()
        Case #Button_Quit
          Close_Window_Main()
      EndSelect
    Case #PB_Event_CloseWindow
      Close_Window_Main()
  EndSelect
EndProcedure

;- Start
Open_Window_Main()

;- Event Loop
Repeat
  EventID.l = WaitWindowEvent()
  If EventID
    Select EventWindowID()
      Case #Window_Main
        Event_Window_Main(EventID)
      Case #Window_Child
        Event_Window_Child(EventID)
    EndSelect
  EndIf
ForEver

;- Error
End
musst nur noch auf MenuID umstellen, aber das dürfte kein problem sein. :wink:

p.s.: hoffe das es unter PB 3.30 läuft.

@nicolaus
- warum WindowEvent() statt WaitWindowEvent() ?? sollte man nicht machen und wenn, dann sollte das Delay() nach den aktionen, am ende der schleife sein. Delay(1) ist ausserdem ein zu niedriger wert, es verbrät zuviel cpu leistung. Delay(10) wäre optimal. :|
- warum Dim bei so einem einfachen programm ?? ist doch völlig überflüssig hier. :?
- warum wird dein programm geschlossen, wenn man das help bzw. about fenster schliesst ?? ist nicht gerade der korrekte weg. :lol:

c ya,
nco2k
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag von nicolaus »

@nicolaus
- warum WindowEvent() statt WaitWindowEvent() ?? sollte man nicht machen und wenn, dann sollte das Delay() nach den aktionen, am ende der schleife sein. Delay(1) ist ausserdem ein zu niedriger wert, es verbrät zuviel cpu leistung. Delay(10) wäre optimal.
- warum Dim bei so einem einfachen programm ?? ist doch völlig überflüssig hier.
- warum wird dein programm geschlossen, wenn man das help bzw. about fenster schliesst ?? ist nicht gerade der korrekte weg.
zu 1. habe mir WindowEvent angewöhnt weil du bestimmte sachen NICHT gehen wenn kein event auftritt daher nehm ich immer WindowEvent.
Delay(1) reicht voll aus und dein prgramm wird mit Delay(10) wensentlich langsamer (10mal langsamer als mein Delay(1) ) und ob das delay() am anfang oder ende steht is egal kannst es versuchen.

zu 2. Habe extra dazugeschrieben das man es auch mit variablen machen kann doch finde ich es für mich besser mit dim zu arbeiten denn wenn ich große programme mit viel code habe habe ich 100te variablen die anlegen muß so habe ich das nich wenn ich DIM benutze

zu 3. sorry hatte vergessen die abfrage mit einzubauen in welchem window das event #PB_event_closewindow auftritt war aber auch nur ein beispiel und es steht ja auch extra da viele wege führen nach rom

gruß nico
Antworten