Seite 1 von 1

Probleme mit einer MDI-Anwendung

Verfasst: 14.01.2013 13:13
von Forsti
Hallo, liebe Forumer!

Ich möchte eine PB MDI-Anwendung als Ersatz für eine vorhandene ältere VB-Applikation erstellen. Theoretisch und praktisch sollte dies kein großes Problem dachte ich, aber ich scheitere immer wieder an der Fehlermeldung >keine aktuelle Gadgetliste vorhanden<. Ich habe das Beispiel MDI Gadget aus dem PureBasic CodeArchiv v4_0 beta etwas umgearbeitet und möchte das hier darstellen. Obwohl ich meine, mit den Gagdgetlisten richtig umzugehen zu können, meckert der Compiler mit der oben angegebenen Fehlermeldung. Ich kommen im Augenblick nicht weiter. Vielleicht könnt Ihr helfen. Nun das Codeschnipsel. Danke im Voraus

Code: Alles auswählen

; German forum: http://www.purebasic.fr/german/viewtopic.php?t=10149&postdays=0&postorder=asc&start=100
; Author: edel
; Date: 05. February 2007
; OS: Windows
; Demo: Yes


;- MDI Example 4.02

Global button1, button2, container, text1, string1, text2, string2

Enumeration
  #MAIN_WINDOW
EndEnumeration

Enumeration
  #MDI_MAIN
  #MDI_CHILD
  #MDI_CONTAIN
EndEnumeration

Enumeration
  #MAIN_MENU
EndEnumeration

Enumeration
  #MENU_NEW
  #MENU_OPEN
  #MENU_SAVE
  #MENU_SAVEAS
  #MENU_CLOSE
  #MENU_CLOSEALL
  #MENU_EXIT

  #MENU_CASCADE
  #MENU_TILEH
  #MENU_TILEV
  #MENU_ARRANGE
  #MENU_NEXT
  #MENU_PREV
  #MENU_NORMAL
  #MENU_NORMALALL
  #MENU_MAXIMIZE
  #MENU_MAXIMIZEALL
  #MENU_MINIMIZE
  #MENU_MINIMIZEALL

  #MENU_RESIZE_DEMO

  #MENU_WINDOW_POS
EndEnumeration

Define.l hwnd,event,window
NewList MDI_WINDOW_LIST.l()

;-

Procedure NewMdiChild()
  Shared MDI_WINDOW_LIST.l()

  AddElement(MDI_WINDOW_LIST())
  MDI_WINDOW_LIST() = AddGadgetItem(#MDI_MAIN,#PB_Any,"MDI - Childwindow") 
  
  child = MDI_WINDOW_LIST()
  UseGadgetList(WindowID(child))
  ButtonGadget(button1, 10, 10, 50, 20, "Anfang")
  ButtonGadget(button2, 20, 10, 100, 20, "Ende")  
  container = ContainerGadget(#PB_Any, 100, 75, 200, 100)
    text1 = TextGadget(#PB_Any, 10, 10, 50, 15, "Test MDI1")
    string1 = StringGadget(#PB_Any, 70, 10, 50, 20, "Anfang" )
    text2 = TextGadget(#PB_Any, 10, 50, 50, 15, "Test MDI2")
    string2 = StringGadget(#PB_Any, 70, 50, 50, 20, "Ende" )
    SetGadgetColor(container, #PB_Gadget_BackColor, #Green)
  CloseGadgetList()    
  
  UseGadgetList(#MDI_MAIN)

  ProcedureReturn MDI_WINDOW_LIST()
EndProcedure

Procedure CloseMdiChild(Child=-1)
  Shared MDI_WINDOW_LIST.l()

  If Child = -1 ; alle schliessen

    ForEach MDI_WINDOW_LIST()
      Child = MDI_WINDOW_LIST()
      CloseWindow(Child)
    Next

    ClearList(MDI_WINDOW_LIST())

  Else

    ForEach MDI_WINDOW_LIST()
      If Child = MDI_WINDOW_LIST()
        CloseWindow(Child)
        DeleteElement(MDI_WINDOW_LIST())
        Break
      EndIf
    Next

  EndIf

EndProcedure

;-

hwnd = OpenWindow(#MAIN_WINDOW,#PB_Ignore,#PB_Ignore,640,480,"MDI-Test")

If CreateMenu(#MAIN_MENU,hwnd)

  MenuTitle("File")
  MenuItem(#MENU_NEW        , "New"       +Chr(9)+"Ctrl+N")
  MenuItem(#MENU_OPEN       , "Open"      +Chr(9)+"Ctrl+O")
  MenuItem(#MENU_SAVE       , "Save"      +Chr(9)+"Ctrl+S")
  MenuItem(#MENU_SAVEAS     , "Save as"                   )
  MenuBar()
  MenuItem(#MENU_CLOSE      , "Close"     +Chr(9)+"Ctrl+W")
  MenuItem(#MENU_CLOSEALL   , "Close all"                 )
  MenuBar()
  MenuItem(#MENU_EXIT       , "Exit"      +Chr(9)+"Alt+F4")

  MenuTitle("Windows")
  MenuItem(#MENU_CASCADE    , "Cascade")
  MenuItem(#MENU_TILEH      , "Tile horizontally")
  MenuItem(#MENU_TILEV      , "Tile vertically")
  MenuItem(#MENU_ARRANGE    , "Arrange")
  MenuBar()
  MenuItem(#MENU_NEXT       , "Next")
  MenuItem(#MENU_PREV       , "Previous")
  MenuBar()
  MenuItem(#MENU_NORMAL     , "Restore")
  MenuItem(#MENU_NORMALALL  , "Restore all")
  MenuItem(#MENU_MAXIMIZE   , "Maximize")
  MenuItem(#MENU_MAXIMIZEALL, "Maximize all")
  MenuItem(#MENU_MINIMIZE   , "Minimize")
  MenuItem(#MENU_MINIMIZEALL, "Minimize all")
  MenuBar()
  MenuItem(#MENU_RESIZE_DEMO, "Resize Demo")

  AddKeyboardShortcut(#MAIN_WINDOW,#PB_Shortcut_Control|#PB_Shortcut_N,#MENU_NEW)
  AddKeyboardShortcut(#MAIN_WINDOW,#PB_Shortcut_Control|#PB_Shortcut_O,#MENU_OPEN)
  AddKeyboardShortcut(#MAIN_WINDOW,#PB_Shortcut_Control|#PB_Shortcut_S,#MENU_SAVE)
  AddKeyboardShortcut(#MAIN_WINDOW,#PB_Shortcut_Control|#PB_Shortcut_W,#MENU_CLOSE)

EndIf

;CreateGadgetList(hwnd)
MDIGadget(#MDI_MAIN,#PB_Ignore,#PB_Ignore,640,480-MenuHeight(),1,#MENU_WINDOW_POS)

NewMdiChild()

;-

Repeat
  event  = WaitWindowEvent()
  window = EventWindow()

  If window = #MAIN_WINDOW ; events fuer das Hauptfenster

    If event = #PB_Event_CloseWindow
      End
    EndIf

    If event = #PB_Event_Menu

      Select EventMenu()
        Case #MENU_NEW
          NewMdiChild()
        Case #MENU_OPEN
          Debug "not implemented"
        Case #MENU_SAVE
          Debug "not implemented"
        Case #MENU_SAVEAS
          Debug "not implemented"
        Case #MENU_CLOSE
          window = GetGadgetState(#MDI_MAIN)
          CloseMdiChild(window)
        Case #MENU_CLOSEALL
          CloseMdiChild(-1)
        Case #MENU_EXIT
          End
        Case #MENU_CASCADE
          SetGadgetState(#MDI_MAIN,#PB_MDI_Cascade)
        Case #MENU_TILEH
          SetGadgetState(#MDI_MAIN,#PB_MDI_TileHorizontally)
        Case #MENU_TILEV
          SetGadgetState(#MDI_MAIN,#PB_MDI_TileVertically)
        Case #MENU_ARRANGE
          SetGadgetState(#MDI_MAIN,#PB_MDI_Arrange)
        Case #MENU_NEXT
          SetGadgetState(#MDI_MAIN,#PB_MDI_Next)
        Case #MENU_PREV
          SetGadgetState(#MDI_MAIN,#PB_MDI_Previous)
        Case #MENU_NORMAL
          window = GetGadgetState(#MDI_MAIN)
          SetWindowState(window,#PB_Window_Normal)
        Case #MENU_NORMALALL
          ForEach MDI_WINDOW_LIST()
            window = MDI_WINDOW_LIST()
            SetWindowState(window,#PB_Window_Normal)
          Next
        Case #MENU_MAXIMIZE
          window = GetGadgetState(#MDI_MAIN)
          SetWindowState(window,#PB_Window_Maximize)
        Case #MENU_MAXIMIZEALL
          ForEach MDI_WINDOW_LIST()
            window = MDI_WINDOW_LIST()
            SetWindowState(window,#PB_Window_Maximize)
          Next
        Case #MENU_MINIMIZE
          window = GetGadgetState(#MDI_MAIN)
          SetWindowState(window,#PB_Window_Minimize)
        Case #MENU_MINIMIZEALL
          ForEach MDI_WINDOW_LIST()
            window = MDI_WINDOW_LIST()
            SetWindowState(window,#PB_Window_Minimize)
          Next
        Case #MENU_RESIZE_DEMO
          window = GetGadgetState(#MDI_MAIN)
          If IsWindow(window)
            ResizeWindow(window,#PB_Ignore,#PB_Ignore,Random(400)+100,Random(400)+100)
          EndIf
      EndSelect

    EndIf

  Else ; andere Fenster

    Select event
      Case #WM_SYSCOMMAND ; wenn das fenster ueber das eigene Menu geschlossen wird.
        If EventwParam() = #SC_CLOSE
          CloseMdiChild(window)
        EndIf
      Case #PB_Event_CloseWindow
        CloseMdiChild(window)
    EndSelect

  EndIf


ForEver
Edit by NicTheQuick: Code-Tags gesetzt.

Re: Probleme mit einer MDI-Anwendung

Verfasst: 14.01.2013 13:20
von STARGÅTE
an dieser stelle hier:

Code: Alles auswählen

ButtonGadget(button1, 10, 10, 50, 20, "Anfang")
Erstellst du einen Button mit der Nummer button1, aber diese Variable existiert nicht, und ist somit 0.
NUmmer 0 ist aber schon dein MDIGadget(), welches somit in dieser Zeile zerstört wird, deswegen kommt die Fehlermeldung.

Benutze also #PB_Any, oder eine kültige Konstante