Hier etwas abgespeckter Code, aber darin nachvollziehbar.
Ganz oben im Modul "Container" befinden sich 2 Child Strukturen.
Wird die erste (im Moment aktive) verwendet, kommt es zu dem Fehler.
Wird die zweite (darunter) verwendet, entsteht kein Error, bzw. Warnung. 
Der Grund für den Error ist, dass im letzten Rekursionsschritt ein Null-Zeiger übergeben wird.
Die Rekursions wird in "ModWdgClass" in der Proc. "checkName(Name.s)" angestoßen in der
Seltsam, dass die Anordnung der Elemente in der Struktur den Error auslöst.
Code: Alles auswählen
; ==================================== Modul Container ==========================================================
DeclareModule Container            
  Enumeration Container
    #getChildId
    #getChildName
    #PB_ContainerType_Panel
  EndEnumeration
  
  Structure widget 
    Name.s : wdgId.i : RefStrukt.i : StartX.i : StartY.i : StartW.i : StartH.i : Type.i : ParentId.i : RefParentStrukt.i : isContainer.i : ParentWin.i
    x.i : y.i : w.i : h.i : Text.s : Format.s : Verzeichnis.s : Url.s : FirstDate.i : CellW.i : cellH.i : imageId.i
    Min.i : Max.i : pgBFarbe.i : ScrollW.i :  ScrollH.i : ScrollStep.i : sLaenge.i : sc1.i : sc2.i
    Gadget1.i : Gadget2.i : TabCount.i : flag1.i : flag2.i : flag3.i : flag4.i : flag5.i : flag6.i  : Farbe.i                        
    textFont.i : textSize.i : textAttribut.i : RefCallback.i : Ref1.i : Ref2.i : tempId.s : TabsCount.i
  EndStructure   
  
  Structure Child
    
     Name.s 
     wdgId.i 
     RefStrukt.i 
     Type.i  
     ParentId.i 
     RefParentStrukt.i 
     ParentWin.i
     isContainer.i
     StartX.i  
     StartY.i  
     StartW.i  
     StartH.i 
     Text.s   
     textFont.i  
     textSize.i  
     textAttribut.i  
    EndStructure 
  
;   Structure Child
;     Name.s
;     wdgId.i
;     RefStrukt.i
;     StartX.i                           ; - Key der Map entspricht Gadget-Id im Programm
;     StartY.i                           ; - WinId -> Identifikation des Fensters in welchem das Gadgets sich befindet
;     StartW.i                           ; 
;     StartH.i                           ; -------------------------------------------
;     Text.s                             ; -> Über die Map-Einträge sind Änderung der Fenstergröße auf alle Gadgets problemlos anwendbar
;     textFont.i
;     textSize.i
;     textAttribut.i                        ; 
;     Type.i
;     ParentId.i
;     RefParentStrukt.i
;     isContainer.i
;     ParentWin.i 
;   EndStructure
    
  Structure Container
    Map childMap.Child()   
    Name.s
    wdgId.i
    RefStrukt.i
    StartX.i                           ; - Key der Map entspricht Gadget-Id im Programm
    StartY.i                           ; - WinId -> Identifikation des Fensters in welchem das Gadgets sich befindet
    StartW.i                           ; 
    StartH.i                           ; -------------------------------------------     
    Text.s                                   ; 
    Type.i
    ParentId.i
    RefParentStrukt.i
    isContainer.i
    ParentWin.i
  EndStructure
EndDeclareModule
Module Container
  
EndModule
;===========================================================================================================
;========================================== ModWdgCustom =====================================================
;                                                
; =================================================== Modul TreeByKey =============================================================
DeclareModule TreeByKey
  Enumeration 1001
    #GadgetType_TreeView
  EndEnumeration
  Structure treeParams
    Key.s
    wdgId.i
    Text.s
    ImageId.i
    Vg.s
    subLevel.i
  EndStructure
  
  Structure treeView
    Map treeIn.treeParams()
    List treeOut.treeParams()
    RefStrukt.i
    StartX.i                           ; - Key der Map entspricht Gadget-Id im Programm
    StartY.i                           ; - WinId -> Identifikation des Fensters in welchem das Gadgets sich befindet
    StartW.i                           ; 
    StartH.i  
    Name.s
    wdgId.i
    ParentWin.i
    ParentId.i
  EndStructure
  
  ArraySizeFlag.i = #False
  Declare createTreeByKey(x,y,w,h,flag1 = #False,flag2 = #False,flag3 = #False,flag4 = #False,flag5 = #False,flag6 = #False)
  Declare TreeAddItem(Map myMap.treeParams(),key.s,Vg.s,Text.s,ImageId.i)
  Declare showTreeExpanded(wdgId)
  Declare parseTreeView(wdgId.i,pBar.i)
  Declare showTreeView(wdgId.i)
  Declare Width(wdgId.i)
  Declare Height(wdgId.i)
  Declare X(wdgId.i)
  Declare Y(wdgId.i)
  Declare EntferneItem(wdgId.i,number.i)
  Declare ClearItems(wdgId.i)
  Declare GetCountItems(wdgId.i)
  Declare.s GetTextByNumber(wdgId.i,number.i)
  Declare.s GetSelectText(wdgId.i)
  Declare GetSublevelbyNumber(wdgId.i,number.i)
  Declare SetTextByNumber(wdgId.i,number.i)
  Declare SetSelectText(wdgId.i)
  Declare GetItemNumber(wdgId.i)
  Declare GetItemStatus(wdgId.i,number.i)
;   Declare.s getKey(wdgId.i)
EndDeclareModule
Module TreeByKey
  
  Procedure Height(wdgId)
    ProcedureReturn GadgetHeight(wdgId.i)
  EndProcedure
  
  Procedure Width(wdgId.i)
    ProcedureReturn GadgetWidth(wdgId)
  EndProcedure
  
  Procedure x(wdgId.i)
    ProcedureReturn GadgetX(wdgId)
  EndProcedure
  
  Procedure y(wdgId.i)
    ProcedureReturn GadgetY(wdgId)
  EndProcedure
  
  Procedure ClearItems(wdgId.i)
    ClearGadgetItems(wdgId)
  EndProcedure
  
  Procedure EntferneItem(wdgId.i,number.i)
    RemoveGadgetItem(wdgId,number)
  EndProcedure
  
  Procedure GetCountItems(wdgId.i)
    ProcedureReturn CountGadgetItems(wdgId)
  EndProcedure
  
  Procedure GetItemNumber(wdgId.i)
    ProcedureReturn GetGadgetState(wdgId)
  EndProcedure
  
  Procedure GetItemStatus(wdgId.i,number.i) ;#PB_Tree_Selected,#PB_Tree_Expanded,#PB_Tree_Collapsed,#PB_Tree_Checked
    ProcedureReturn GetGadgetItemState(wdgId,number);     ;#PB_Tree_Inbetween: If Ergebnis & #PB_Tree_Checked
  EndProcedure
  
  Procedure.s GetTextByNumber(wdgId.i,number.i)
    ProcedureReturn GetGadgetItemText(wdgId,number)
  EndProcedure
  
  Procedure.s GetSelectText(wdgId.i)
    ProcedureReturn GetGadgetText(wdgId)
  EndProcedure
  
  Procedure GetSublevelbyNumber(wdgId.i,number.i)
    ProcedureReturn GetGadgetItemAttribute(wdgId,number,#PB_Tree_SubLevel) ;#PB_Tree_SubLevel
  EndProcedure
  Procedure SetTextByNumber(wdgId.i,number.i)
    SetGadgetItemText(wdgId,number.i,Text.s)
  EndProcedure
  
  Procedure SetSelectText(wdgId.i)
    SetGadgetText(wdgId,Text.s)
  EndProcedure
  
;-----------------------------------------------------------------------------------------------
  
  
  Procedure createTreeByKey(x,y,w,h,flag1 = #False,flag2 = #False,flag3 = #False,flag4 = #False,flag5 = #False,flag6 = #False)
    wdgId = TreeGadget(#PB_Any, x, y, w, h,flag1 | flag2 | flag3| flag4 | flag5 | flag6)
    ProcedureReturn wdgId
  EndProcedure
  
  Procedure TreeAddItem(Map myMap.treeParams(),key.s,Vg.s,Text.s,ImageId.i)
    myMap(key)\Key=key
    myMap(key)\Vg=Vg
    myMap(key)\Text=Text
    myMap(key)\ImageId=ImageID
  EndProcedure
  
  Procedure copyElementMapToListSequentiell(key.s,Map quellMap.treeparams(),List treeOut.treeparams())
    AddElement(treeOut())
    With treeOut()
      \ImageId = quellMap()\ImageId 
      \Key = quellMap(key)\Key
      \wdgId = quellMap(key)\wdgId
      \subLevel = quellMap(key)\subLevel
      \Text = quellMap(key)\Text
      \Vg = quellMap(key)\Vg
    EndWith
  EndProcedure
  
  idCount=0
  subLevel=0
  
  Procedure testUnitKey(List workList.treeParams(),newKey.s)
    If ListSize(workList())>0
      PushListPosition(workList())
      ForEach workList()
        If workList()\Key=newKey
          MessageRequester("App-Meldung","Der Key '" + newKey + "' wird bereits verwendet",#PB_MessageRequester_Ok )
          PopListPosition(workList())
          ProcedureReturn #True
        EndIf
      Next
      PopListPosition(workList())
      ProcedureReturn #False
    EndIf
    ProcedureReturn #False
  EndProcedure
  
  Procedure showTreeExpanded(wdgId)
    For Counter = 0 To CountGadgetItems(wdgId) - 1
      SetGadgetItemState(wdgId, Counter, GetGadgetItemState(wdgId, Counter) | #PB_Tree_Expanded)
    Next
  EndProcedure
  
  Procedure.s GetTreeHeaderList(List treeOut.treeParams())
    ResetList(treeOut())
    NextElement(treeOut())
    If ListSize(treeOut())>=1
      ProcedureReturn treeOut()\Key
    EndIf
  EndProcedure
  
  Procedure GetTreeSizeMap(Map treeIn.treeParams())
    ProcedureReturn MapSize(treeIn())
  EndProcedure
  Procedure parseTree(key.s,Map In.treeParams(), List treeOut.treeParams(),pBar.i)
    NewMap RekurseMap.treeParams() ;jeder Rekursionsschritt benötigt seine eigene map->bei Rek.Rückschritt liegt sonst nicht
    con=CopyMap(In(),RekurseMap())     ;mehr die in diesem Schritt verwendete Map mit deren Elementen vor.
    Shared idCount, subLevel   ;shared, da diese sonst bei Rekursion zurückgesetzt würden.
    copyElementMapToListSequentiell(key,RekurseMap(),treeOut()) ;kopiert aktuellen Key von Map in Liste
    DeleteMapElement(RekurseMap(),key) ;reduziert die Map um die abgearbeiteten Elemene. Nicht notwendig ->reduziert Abarbeitungsaufwand
    ResetMap(RekurseMap())             ;setzt miz "while nextmapelement" die Map an den Anfang, um sie vollständig abzuarbeiten
    While NextMapElement(RekurseMap()) > 0 ;solange noch Elemente in der Map sind
      If RekurseMap()\Vg = key         ;sucht Element mit aktuellen Key als Vorgänger
        idCount=idCount+1          ;Laufvariable bei gefundenem Vorgänger erhöht um eins -> sequentielle Abfolge des Elemente
        subLevel=subLevel+1
        RekurseMap()\subLevel = subLevel
        RekurseMap()\wdgId = idCount
        parseTree(RekurseMap()\Key, RekurseMap(), treeOut(),pBar) ;RekurseMap()\Key -> Vorgänger Id = neuer Key
      EndIf
    Wend                           ;läuft bis nächstes Element = 0 -> Map = abgearbeitet; <> 0 -> setzt Zeiger auf nächstes
    subLevel=subLevel-1                                             ;                                               Element              
    
  EndProcedure
  
  Procedure parseTreeView(*TreeView.treeView,pBar.i)
    
    Shared idCount, subLevel ;,treeViewMap.treeParams()
    idCount=0
    subLevel = 0
    
    With *TreeView
      If GetTreeSizeMap(\treeIn())>=1
        ResetMap(\treeIn())
        NextMapElement(\treeIn())
        ForEach \treeIn()
          If \treeIn()\vg=""
            headKey.s= \treeIn()\Key
            Break
          EndIf
        Next
      Else
        headKey.s=GetTreeHeaderList(\treeOut())
      EndIf
      ClearList(\treeOut())
      parseTree(headKey,\treeIn(),\treeOut(),pBar)
    EndWith
    
  EndProcedure
  
  Procedure showTreeView(*TreeView.treeView)
    
;     Shared treeViewMap.treeParams()
    ClearGadgetItems(*TreeView\wdgId)
    counter.i=-1
    With *TreeView
      ResetList(\treeOut())
      NextElement(\treeOut())
      Repeat
        counter=counter+1
        key=\treeOut()\wdgId
        text.s=\treeOut()\Text
        subLevel=\treeOut()\subLevel
        AddGadgetItem(*TreeView\wdgId,\treeOut()\wdgId,\treeOut()\Text,\treeOut()\ImageId,\treeOut()\subLevel)    
        NextElement(\treeOut())
      Until ListIndex(\treeOut()) = Counter
    EndWith
;     FreeStructure(*TreeView)
  EndProcedure
  
EndModule
;============================================= Modul Panel ==========================================================
DeclareModule Panel
  
  UseModule Container
  
  Structure Tab
    Map Wdg.widget()
    TabIndex.i
    TabText.s
  EndStructure
  
  Structure Panel ;Extends widget
    Map Tabs.Tab()   
    Name.s
    wdgId.i
    RefStrukt.i
    TabsCount.i
    StartX.i                           
    StartY.i                           
    StartW.i                           
    StartH.i                          
    Text.s                                   ; 
    Type.i
    ParentId.i
    RefParentStrukt.i
    isContainer.i
    ParentWin.i
    tempId.s
  EndStructure
  
   workTab.i
  Declare createPanel(x,y,w,h,TabCount.i=0)
  Declare removeTab(wdgId,TabItem)
  Declare setTabText(wdgId,TabIndex,Text.s)
  Declare removeAllTabs(wdgId)
  Declare setTab(ZielTab.i)
  Declare addTab(newWidgetFunktion.i,setTab.i)
  Declare createTab(PanelAdress.i,tabIndex.i)
;   Declare makeWidget(Map Wdg.widget(),wdgTyp)
  
EndDeclareModule
Module Panel
  
  UseModule TreeByKey
  
  Procedure setTab(IndexZielTab.i)
    Shared workTab
    workTab = IndexZielTab
    ProcedureReturn IndexZielTab
  EndProcedure
  
  
  Procedure createPanel(x,y,w,h,TabCount.i=0)
    
    wdgId = PanelGadget(#PB_Any, x, y, w, h)
    If TabCount > 0
      For i = 0 To TabCount-1
        AddGadgetItem(wdgId,i,"Tab " + Str(i))
      Next
    EndIf 
    
    ProcedureReturn wdgId
    
  EndProcedure  
  
  
  Procedure removeTab(wdgId,TabItem)
    
    If TabItem < CountGadgetItems(wdgId) : RemoveGadgetItem(wdgId,TabItem) : EndIf
    
  EndProcedure
  
  Procedure setTabText(wdgId,TabIndex,Text.s)
    
    SetGadgetItemText(wdgId,TabIndex,Text)
    
  EndProcedure
  
  Procedure removeAllTabs(wdgId)
    
    ClearGadgetItems(wdgId)
    
  EndProcedure
  
  Procedure addTab(newWidgetFunktion.i,setTab.i)
    ;dummy, Kreiert das Widget und merkt sich den Tab in Class-Variable
    
  EndProcedure
  
  Procedure makeWidget(Map WdgMap.widget(),wdgTyp)
     With WdgMap()
       Select wdgTyp
          
        Case #PB_GadgetType_Button
          wdgId = ButtonGadget(#PB_Any, \x, \y, \w, \h, \Text,\flag1 | \flag2 | \flag3| \flag4 | \flag5 | \flag6)
        Case #PB_GadgetType_Container
          wdgId = ContainerGadget(#PB_Any, \x, \y, \w, \h, \flag1 | \flag2 | \flag3| \flag4 | \flag5 | \flag6)
        Case #PB_GadgetType_Panel
          wdgId = createPanel(\x, \y, \w, \h,\TabCount)
        Case #PB_GadgetType_ScrollArea
          wdgId = ScrollAreaGadget(#PB_Any, \x, \y, \w, \h, \ScrollW, \ScrollH,\ScrollStep,\flag1 | \flag2 | \flag3| \flag4 | \flag5 | \flag6)
        Case #PB_GadgetType_String
          wdgId = StringGadget(#PB_Any, \x, \y, \w, \h, \Text,\flag1 | \flag2 | \flag3| \flag4 | \flag5 | \flag6)
        Case #GadgetType_TreeView
          wdgId = TreeByKey::createTreeByKey(\x,\y,\w,\h,\flag1,\flag2,\flag3,\flag4,\flag5,\flag6)
        Case #PB_GadgetType_Web
          wdgId = WebGadget(#PB_Any, \x, \y, \w, \h, \Url)
  ;       Case #PB_Type_Window
  ;         wdgId = OpenWindow(#PB_Any, x, y, w, h, Text,flag1 | flag2 | flag3| flag4 | flag5 | flag6)
      EndSelect
    EndWith
    ProcedureReturn wdgId
  EndProcedure
  
  Procedure createTab(*Panel.Panel,tabIndex.i)
    ClearGadgetItems(*Panel\wdgId)
    OpenGadgetList(*Panel\wdgId)
    
    For i=0 To *Panel\TabsCount
      With *Panel\Tabs(Str(i))
      AddGadgetItem(*Panel\wdgId,i,\TabText)
        ForEach \Wdg()
          \Wdg()\wdgId = makeWidget(\Wdg(),\Wdg()\Type)
          Delay(0.002)
        Next
      EndWith
    Next
    CloseGadgetList()
  EndProcedure
  
EndModule
;======================================================================================================
;======================================= ModWdgClass ==================================================
DeclareModule wdgClass
Enumeration 1717171717 Step 17                    ;Parameter: 
  #PB_ContainerType_Window  
  #PB_ContainerType_Container
  #PB_ContainerType_ScrollArea
  #PB_ContainerType_Canvas  
EndEnumeration
UseModule Panel
UseModule Container
UseModule TreeByKey
NewMap WdgMap.widget()
Global NewMap winMap.Container()
Declare New_Window(Name.s,x,y,w,h,Text.s,flag1 = #False,flag2 = #False,flag3 = #False,flag4 = #False,flag5 = #False,flag6 = #False)
Declare New_Button(ParentId,Name.s,x,y,w,h,Text.s,flag1 = #False,flag2 = #False,flag3 = #False,flag4 = #False,flag5 = #False,flag6 = #False)
Declare New_Container(ParentId,Name.s,x,y,w,h,flag1 = #False,flag2 = #False,flag3 = #False,flag4 = #False,flag5 = #False,flag6 = #False)
Declare New_Panel(ParentId,Name.s,x,y,w,h,TabCount=0)
Declare New_ScrollArea(ParentId,Name.s,x,y,w,h,ScrollW, ScrollH,ScrollStep=1,flag1 = #False,flag2 = #False,flag3 = #False,flag4 = #False,flag5 = #False,flag6 = #False)
Declare New_String(ParentId,Name.s,x,y,w,h,Text.s,flag1 = #False,flag2 = #False,flag3 = #False,flag4 = #False,flag5 = #False,flag6 = #False)
Declare New_TreeByKey(ParentId,Name.s,x,y,w,h,flag1 = #False,flag2 = #False,flag3 = #False,flag4 = #False,flag5 = #False,flag6 = #False)
;-------------------------------
Declare GetWdgRefStrukt(wdgId.i)
Declare wdgOnFly(Map WdgMap.widget(),wdgTyp)
EndDeclareModule
Module wdgClass
  Procedure parseStruktName(*workStrukt.Container,Name.s="") ;sucht in Window oder Container nach StrukturReferenz zu GadgetId
    ;UseModule Container
  
;     With *workStrukt
      If MapSize(*workStrukt\childMap()) > 0
        ForEach *workStrukt\childMap()
          If *workStrukt\childMap()\Name=Name 
            ProcedureReturn #True : Break
          EndIf
          If *workStrukt\childMap()\isContainer
;             Debug *workStrukt
            If parseStruktName(*workStrukt\childMap()\RefStrukt,Name) = #True
              ProcedureReturn #True: Break
            EndIf
          EndIf
        Next
      EndIf
;     EndWith
  
  EndProcedure
  
  Procedure GetWdgName(Name.s)
    UseModule Container
    Shared winMap()
    ForEach winMap()
      *winContainer.Container = AllocateStructure(Container)
      adressWinCon.i = *winContainer
      Debug *winContainer
      AddMapElement(*winContainer\childMap(),MapKey(winMap()))
      If MapSize(winMap(MapKey(winMap()))\childMap())>0 
        *winContainer=winMap(MapKey(winMap())) 
      EndIf
      If parseStruktName(*winContainer,Name) 
        Debug *winContainer
        FreeStructure(adressWinCon)
        ProcedureReturn #True 
        Break  
      EndIf
;             If parseStruktName(@winMap(MapKey(winMap())),Name) : ProcedureReturn #True : Break : EndIf
    Next
    ProcedureReturn #False
  EndProcedure
  
  Procedure checkName(Name.s)
    
    If GetWdgName(Name) = #True 
      MessageRequester("Warnung!","Das Widget " + Chr(34)  + Name + Chr(34) + " ist bereits vorhanden.") 
      ProcedureReturn #True
    EndIf
    
  EndProcedure
  
  Procedure parseStruktId(wdgId.i,*workStrukt.Container) ;sucht in Window oder Container nach StrukturReferenz zu GadgetId
    ;UseModule Container
  
    With *workStrukt
      If MapSize(\childMap()) > 0
        If \childMap(Str(wdgId))\RefStrukt
          ProcedureReturn \childMap(Str(wdgId))\RefStrukt
        Else
          ForEach \childMap()
            If \childMap()\isContainer
              wdgStrukt = parseStruktId(wdgId.i,*workStrukt\childMap()\RefStrukt)
              If wdgStrukt > 0 : ProcedureReturn wdgStrukt : EndIf  
              Break
            EndIf
          Next
        EndIf
      EndIf 
    EndWith
    
  EndProcedure
  
  Procedure GetWdgRefStrukt(wdgId.i)
    
    Shared winMap()
    ForEach winMap()
      wdgStrukt = parseStruktId(wdgId,@winMap(MapKey(winMap())))
      If wdgStrukt > 0 
        ProcedureReturn wdgStrukt
      EndIf 
    Next
    
  EndProcedure
  
  Procedure getConWindow(ParentConId.i)
    ;UseModule Container
    ende.i = #False
    Repeat
      *Parent.Container = GetGadgetData(ParentConId)
      If IsWindow(*Parent\ParentId)
        ende=#True : ProcedureReturn *Parent\ParentId
      Else 
        ende=#True : getConWindow(*Parent\ParentId)
      EndIf 
    Until ende = #True
  EndProcedure
  
  Procedure InWdgMapEintragen(Map WdgMap.widget(),ParentId,Name.s,Type.i,x,y,w,h,flag1 = #False,flag2 = #False,
                              flag3 = #False,flag4 = #False,flag5 = #False,flag6 = #False)
    
    ClearMap(WdgMap())
    AddMapElement(WdgMap(), Name)
    With WdgMap()
      \x=x : \y=y : \w=w : \h=h : \flag1=flag1 : \flag2=flag2  : \Name=Name
      \flag3=flag3 : \flag4=flag4 : \flag5=flag5 : \flag6=flag6 : \ParentId=ParentId : \Type=Type
    EndWith
    
  EndProcedure
  
  Procedure InWinMapEintragen(Map WdgMap.widget())
    
    Shared WinMap()
    AddMapElement(winMap(Str(WdgMap()\ParentId))\childMap(),Str(WdgMap()\wdgId))
    With winMap()\childMap()
      \StartX=WdgMap()\x : \StartY=WdgMap()\y : \StartW=WdgMap()\w : \StartH=WdgMap()\h : \Name = WdgMap()\Name 
      \ParentId = WdgMap()\ParentId : \wdgId = WdgMap()\wdgId : \RefStrukt = WdgMap()\RefStrukt
      \isContainer=WdgMap()\isContainer : \ParentWin = WdgMap()\ParentWin
    EndWith
    
  EndProcedure
  
  Procedure InPanelMapEintragen(Map WdgMap.widget())
    ;UseModule Panel
    dummyId = Random(10000,1000)
    WdgMap()\wdgId = dummyId
    *Panel.Panel = GetWdgRefStrukt(WdgMap()\ParentId)
  
    *Panel\tempId = Str(dummyId)
    If panel::workTab > *Panel\TabsCount : *Panel\TabsCount = Panel::workTab : EndIf
    If FindMapElement(*Panel\Tabs(),Str(panel::workTab)) = #False
      AddMapElement(*Panel\Tabs(),Str(Panel::workTab))
    EndIf
    AddMapElement(*Panel\Tabs(Str(Panel::workTab))\Wdg(),Str(dummyId))
    *Panel\Tabs(Str(Panel::workTab))\TabIndex = panel::workTab
    *Panel\Tabs(Str(Panel::workTab))\Wdg(Str(dummyId)) = WdgMap()
  
    ProcedureReturn *Panel
    
  EndProcedure
  
  Procedure InConMapEintragen(Map WdgMap.widget())
    
    ;UseModule Container
    *Parent.Container = GetWdgRefStrukt(WdgMap()\ParentId) ;getParentContainer(ParentId)
    AddMapElement(*Parent\childMap(),Str(WdgMap()\wdgId))
    With *Parent\childMap(Str(WdgMap()\wdgId))
      \StartX=WdgMap()\x : \StartY=WdgMap()\y : \StartW=WdgMap()\w : \StartH=WdgMap()\h : \Name = WdgMap()\Name 
      \ParentId = WdgMap()\ParentId : \wdgId = WdgMap()\wdgId : \RefStrukt = WdgMap()\RefStrukt
      \isContainer=WdgMap()\isContainer : \ParentWin = WdgMap()\ParentWin
    EndWith
    
  EndProcedure
  
  Procedure allocContainerWriteStructur(Map WdgMap.widget())
    
    ;UseModule Container
    With WdgMap()
      Select \Type
        Case #PB_GadgetType_Container,#PB_GadgetType_ScrollArea
          CloseGadgetList()
          *Container.Container = AllocateStructure(Container)
          \RefStrukt = *Container : \isContainer = #True
          *Container\wdgId= \wdgId : *Container\RefStrukt= *Container :*Container\ParentId = \ParentId :*Container\StartX = \x
          *Container\StartY = \y : *Container\StartW = \w : *Container\StartH = \h : *Container\isContainer = #True
          If IsWindow(\ParentId) : *Container\ParentWin = \ParentId :Else: *Container\ParentWin = getConWindow(\ParentId):EndIf
          SetGadgetData(\wdgId ,*Container)
        Case #PB_GadgetType_Panel
          CloseGadgetList() ;neue PanelGadgetList muss geschlossen werden, da ansonsten alle weiteren Gadgets darin platziert würden.
          *Panel.Panel = AllocateStructure(Panel)
          \RefStrukt = *Panel : \isContainer = #True
          *Panel\wdgId=\wdgId : *Panel\RefStrukt = *Panel : *Panel\ParentId = \ParentId : *Panel\StartX = \x 
          *Panel\StartY = \y : *Panel\StartW = \w : *Panel\StartH = \h : *Panel\Name = \Name
          If IsWindow(\ParentId) : *Panel\ParentWin = \ParentId : Else: *Panel\ParentWin = getConWindow(\ParentId):EndIf
        Case #GadgetType_TreeView
          *treeView.treeView = AllocateStructure(treeView)
          \RefStrukt = *treeView
          *treeView\wdgId=\wdgId : *treeView\RefStrukt = *TreeView : *treeView\ParentId = \ParentId : *treeView\StartX = \x 
          *treeView\StartY = \y : *treeView\StartW = \w : *treeView\StartH = \h : *treeView\Name = \Name
          If IsWindow(\ParentId) : *TreeView\ParentWin = \ParentId : Else: *TreeView\ParentWin = getConWindow(\ParentId):EndIf
      EndSelect  
    EndWith
  EndProcedure
     
  Procedure WdgHandler(Map WdgMap.widget())
    
    If checkName(WdgMap()\Name) : ProcedureReturn : EndIf
    With WdgMap()
      If IsWindow(\ParentId)
        UseGadgetList(WindowID(\ParentId))
        \wdgId = wdgOnFly(WdgMap(),\Type)
        allocContainerWriteStructur(WdgMap())
        InWinMapEintragen(WdgMap())
      ElseIf GadgetType(\ParentId) <> #PB_GadgetType_Panel
        OpenGadgetList(\ParentId)
          \wdgId = wdgOnFly(WdgMap(),\Type)
        CloseGadgetList()
        allocContainerWriteStructur(WdgMap())
        InConMapEintragen(WdgMap())
      ElseIf  GadgetType(\ParentId)=#PB_GadgetType_Panel
        *Panel.Panel = InPanelMapEintragen(WdgMap())
        Panel::createTab(*Panel,panel::workTab) : ProcedureReturn
      EndIf
    EndWith
    
  EndProcedure
  Procedure wdgOnFly(Map WdgMap.widget(),wdgTyp)
     With WdgMap()
     Select wdgTyp
        
      Case #PB_GadgetType_Button
        wdgId = ButtonGadget(#PB_Any, \x, \y, \w, \h, \Text,\flag1 | \flag2 | \flag3| \flag4 | \flag5 | \flag6)
      Case #PB_GadgetType_Container
        wdgId = ContainerGadget(#PB_Any, \x, \y, \w, \h, \flag1 | \flag2 | \flag3| \flag4 | \flag5 | \flag6)
      Case #PB_GadgetType_Panel
        wdgId = createPanel(\x, \y, \w, \h,\TabCount)
      Case #PB_GadgetType_ScrollArea
        wdgId = ScrollAreaGadget(#PB_Any, \x, \y, \w, \h, \ScrollW, \ScrollH,\ScrollStep,\flag1 | \flag2 | \flag3| \flag4 | \flag5 | \flag6)
      Case #PB_GadgetType_String
        wdgId = StringGadget(#PB_Any, \x, \y, \w, \h, \Text,\flag1 | \flag2 | \flag3| \flag4 | \flag5 | \flag6)
      Case #GadgetType_TreeView
        wdgId = TreeByKey::createTreeByKey(\x,\y,\w,\h,\flag1,\flag2,\flag3,\flag4,\flag5,\flag6)
    EndSelect
   EndWith
   ProcedureReturn wdgId
  EndProcedure
  Procedure New_Window(Name.s,x,y,w,h,Text.s,flag1 = #False,flag2 = #False,flag3 = #False,flag4 = #False,flag5 = #False,flag6 = #False)
    
    Shared WinMap()
    
    wdgId = OpenWindow(#PB_Any, x, y, w, h, Text,flag1 | flag2 | flag3| flag4 | flag5 | flag6)
    AddMapElement(winMap(),Str(wdgId))
    With winMap()
      \StartX=x : \StartY=y : \StartW=w : \StartH=h : \Text = Text : \Type = #PB_ContainerType_Window : \Name = Name : \wdgId = wdgId
    EndWith
    ProcedureReturn wdgId
    
  EndProcedure
  
  Procedure New_Button(ParentId,Name.s,x,y,w,h,Text.s,flag1 = #False,flag2 = #False,flag3 = #False,flag4 = #False,flag5 = #False,flag6 = #False)
    
    Shared WdgMap()
    InWdgMapEintragen(WdgMap(),ParentId, Name, #PB_GadgetType_Button, x,y,w,h,flag1,flag2,flag3,flag4,flag5,flag6)
    WdgMap()\Text=Text
    WdgHandler(WdgMap()) : ProcedureReturn WdgMap()\wdgId
    
  EndProcedure
  
  
  Procedure New_Container(ParentId,Name.s,x,y,w,h,flag1 = #False,flag2 = #False,flag3 = #False,flag4 = #False,flag5 = #False,flag6 = #False)
    
    Shared WdgMap()
    InWdgMapEintragen(WdgMap(),ParentId, Name, #PB_GadgetType_Container, x,y,w,h,flag1,flag2,flag3,flag4,flag5,flag6)
    WdgHandler(WdgMap()) : ProcedureReturn WdgMap()\wdgId
    
  EndProcedure
  
  
  Procedure New_Panel(ParentId,Name.s,x,y,w,h,TabCount=0)
    
    Shared WdgMap()
    InWdgMapEintragen(WdgMap(),ParentId, Name, #PB_GadgetType_Panel, x,y,w,h,flag1,flag2,flag3,flag4,flag5,flag6)
    WdgMap()\TabCount = TabCount
    WdgHandler(WdgMap()) : ProcedureReturn WdgMap()\wdgId
    
  EndProcedure
  
  
  Procedure New_ScrollArea(ParentId,Name.s,x,y,w,h,ScrollW, ScrollH,ScrollStep=1,flag1 = #False,flag2 = #False,flag3 = #False,flag4 = #False,flag5 = #False,flag6 = #False)
    
    Shared WdgMap()
    InWdgMapEintragen(WdgMap(),ParentId, Name, #PB_GadgetType_ScrollArea, x,y,w,h,flag1,flag2,flag3,flag4,flag5,flag6)
    WdgMap()\ScrollW = scrollW : WdgMap()\ScrollH = scrollH : WdgMap()\ScrollStep = ScrollStep
    WdgHandler(WdgMap()) : ProcedureReturn WdgMap()\wdgId
    
  EndProcedure
  
  
  Procedure New_String(ParentId,Name.s,x,y,w,h,Text.s,flag1 = #False,flag2 = #False,flag3 = #False,flag4 = #False,flag5 = #False,flag6 = #False)
    
    Shared WdgMap()
    InWdgMapEintragen(WdgMap(),ParentId, Name, #PB_GadgetType_String, x,y,w,h,flag1,flag2,flag3,flag4,flag5,flag6)
    WdgMap()\Text = Text
    WdgHandler(WdgMap()) : ProcedureReturn WdgMap()\wdgId
    
  EndProcedure
  
  
  Procedure New_TreeByKey(ParentId,Name.s,x,y,w,h,flag1 = #False,flag2 = #False,flag3 = #False,flag4 = #False,flag5 = #False,flag6 = #False)
    
    Shared WdgMap()
    InWdgMapEintragen(WdgMap(),ParentId, Name, #GadgetType_TreeView, x,y,w,h,flag1,flag2,flag3,flag4,flag5,flag6)
    WdgHandler(WdgMap()) : ProcedureReturn WdgMap()\wdgId
    
  EndProcedure
  
EndModule
;=============================================================================================================
;================================================= myWindow ==================================================
Global  app_Name.s = "dbAdmin",ini$ = app_Name + ".setting",Dim mysp.s(0),activeGadget.i
Global dbName.s,mainWin,dbTreeView
UseModule wdgClass
UseModule Panel
UseModule TreeByKey
Enumeration fenster
  #mainWin
  #_Type_menu
  #_unvis_menu
;   #MenuEvent_ReturnKey
EndEnumeration
Procedure DoEventReturnKey()
  PostEvent(#PB_Event_Gadget, GetActiveWindow(), GetActiveGadget(), #PB_EventType_ReturnKey)
EndProcedure
Procedure windowOpen()
  mainWin=New_Window("mainWin",0,0,500,300,"dbAdmin",#PB_Window_SystemMenu)
  Container1 = New_ScrollArea(mainWin,"Container1",10, 55, 400, 190,500,200,#PB_ScrollArea_Flat)
  Container2 = New_Container(Container1,"Container2",15,15,350,150,#PB_Container_Single )
  Container3 = New_Container(Container2,"Container3",15,15,300,120,#PB_Container_Single )
  Container4 = New_Container(Container3,"Container4",15,15,270,100,#PB_Container_Single )
  Container5 = New_ScrollArea(Container4,"Container5",15, 15, 250, 80,500,200,#PB_ScrollArea_Flat)
  Button_2=New_Button(Container1,"Button_2",10,10,80,30,"Bu 1")
  inContainer1 = New_Panel(Container1,"inContainer1",200, 40, 300, 150,2)
  UseModule panel
  Button_5 = panel::addTab(New_Button(inContainer1,"Button_5",5,5,80,30,"Button_5"),setTab(0))
  Button_6 = panel::addTab(New_Button(inContainer1,"Button_6",85,5,80,30,"Button_6"),setTab(0))
  Button_7 = panel::addTab(New_Button(inContainer1,"Button_7",5,5,80,30,"Button_7"),setTab(1))
  Text_10 = panel::addTab(New_string(inContainer1,"Text_10",5,40,80,30,"Hallo"),setTab(0))
  dbTreeView2=panel::addTab(New_TreeByKey(inContainer1,"dbTreeView2",5,50,150,100),setTab(1))
  Button_3=New_Button(Container1,"Button_3",10,10,80,30,"inBu")
  Button_4=New_Button(Container1,"Button_3",10,10,80,30,"inBu2")
EndProcedure
;=========================================================================================================
;======================================== Main ===========================================================
UseModule wdgClass
windowOpen()
Repeat
myEvent=WaitWindowEvent()
   
Until myEvent = #PB_Event_CloseWindow ; Beenden, wenn eines der Fenster geschlossen wird.
;=======================================================================================================