Bug bei Linked List entdeckt

Fragen und Bugreports zur PureBasic 4.0-Beta.
4DWelt
Beiträge: 6
Registriert: 25.03.2006 10:11

Bug bei Linked List entdeckt

Beitrag von 4DWelt »

Linked List ist nicht mehr global wirksam
wenn man sie in einer prozedur erstellt kann aus einer anderen
prozedur nicht mehr darauf zugegrifen werden.

folgendes Beispiel ist unter PB 3.94 lauffähig:

Code: Alles auswählen

Structure TableLine
  index.l
  y.l
  yl.l
EndStructure

Structure TableColumn
  x.l
  y.l
  xl.l
  yl.l
  name.s
  id.l
EndStructure

Enumeration
  #Window_0
EndEnumeration




Procedure TableGadget(GadgetNr,x,y,width,height,name$,SpaltenBreite)
  If CreateGadgetList(WindowID())
    ScrollAreaGadget(GadgetNr, x, y, width, height, 80, 20,  15, #PB_ScrollArea_Single)
    NewList TableColumnList.TableColumn()
    NewList TableLineList.TableLine()
    AddElement(TableLineList())
    AddElement(TableColumnList())
    TableColumnList()\x=30
    TableColumnList()\y=0
    TableColumnList()\xl=SpaltenBreite
    TableColumnList()\yl=20
    TableColumnList()\name=name$
    TableColumnList()\id=ButtonGadget(#PB_Any, TableColumnList()\x,TableColumnList()\y, TableColumnList()\xl, TableColumnList()\yl, TableColumnList()\name, #PB_Button_MultiLine)
    CloseGadgetList()
  EndIf
EndProcedure

Procedure AddTableColumn(GadgetNr,Position,name$,Breite)
  OpenGadgetList(GadgetNr)
  istbreite=GetGadgetAttribute(GadgetNr,#PB_ScrollArea_InnerWidth)
  SetGadgetAttribute(GadgetNr,#PB_ScrollArea_InnerWidth,Breite+istbreite)
  LastElement(TableColumnList())
  x=TableColumnList()\x
  y=TableColumnList()\y
  xl=TableColumnList()\xl
  yl=TableColumnList()\yl
  ;TableColumnList()\title=titel$
  AddElement(TableColumnList())
  TableColumnList()\x=x+xl
  TableColumnList()\y=y
  TableColumnList()\xl=Breite
  TableColumnList()\yl=yl
  TableColumnList()\name=name$
  TableColumnList()\id=ButtonGadget(#PB_Any, TableColumnList()\x, TableColumnList()\y, TableColumnList()\xl, TableColumnList()\yl, TableColumnList()\name, #PB_Button_MultiLine)
  CloseGadgetList()
EndProcedure


Procedure AddTableLine(GadgetNr)
  OpenGadgetList(GadgetNr)
  isthoehe=GetGadgetAttribute(GadgetNr,#PB_ScrollArea_InnerHeight)
  SetGadgetAttribute(GadgetNr,#PB_ScrollArea_InnerHeight,15+isthoehe)
  Spaltenanzahl = CountList(TableColumnList())
  LastElement(TableLineList())
  index=TableLineList()\index
  y=TableLineList()\y
  yl=TableLineList()\yl
  AddElement(TableLineList())
  TableLineList()\index=index+1
  TableLineList()\y=y+yl
  TableLineList()\yl=15
   indextaste=ButtonGadget(#PB_Any,0,TableLineList()\y+20,30,15,Str(TableLineList()\index))
   ForEach TableColumnList()
    x=TableColumnList()\x
    y=TableColumnList()\yl+TableLineList()\y
    xl=TableColumnList()\xl
    yl=TableLineList()\yl
    StringGadget(#PB_Any,x,y,xl-2,yl-1,"",#PB_String_MultiLine|#PB_String_BorderLess) 
  Next
  CloseGadgetList()
EndProcedure

Procedure SaveTable()
  
EndProcedure

Procedure LoadTable()
  
EndProcedure

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 74, 19, 459, 285,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "TableGadget")
    TableGadget(1,5,5,300,200,"Index",50)
    AddTableColumn(1,0,"Bemerkung",100)  
    AddTableColumn(1,0,"NotizAnweisung",100)
    AddTableColumn(1,0,"Bemerkung",100)
    AddTableColumn(1,0,"Bemerkung2",100)
    For xxx= 1 To 50
      AddTableLine(1)
    Next 
       EndIf
EndeProcedure


Open_Window_0()

Repeat
  
  Event = WaitWindowEvent()
  
  If Event = #PB_EventGadget
    
    ;Debug "WindowID: " + Str(EventWindowID())
    
    GadgetID = EventGadgetID()
     
    
  EndIf
  
Until Event = #PB_EventCloseWindow
End

dieses Beispiel ist auf PB4 umgestellt:

Code: Alles auswählen


Structure TableLine
  index.l
  y.l
  yl.l
EndStructure

Structure TableColumn
  x.l
  y.l
  xl.l
  yl.l
  name.s
  id.l
EndStructure

Enumeration
  #Window_0
EndEnumeration




Procedure TableGadget(GadgetNr,x,y,width,height,name$,SpaltenBreite)
  If CreateGadgetList(WindowID(#Window_0))
    ScrollAreaGadget(GadgetNr, x, y, width, height, 80, 20,  15, #PB_ScrollArea_Single)
    NewList TableColumnList.TableColumn()
    NewList TableLineList.TableLine()
    AddElement(TableLineList())
    AddElement(TableColumnList())
    TableColumnList()\x=30
    TableColumnList()\y=0
    TableColumnList()\xl=SpaltenBreite
    TableColumnList()\yl=20
    TableColumnList()\name=name$
    TableColumnList()\id=ButtonGadget(#PB_Any, TableColumnList()\x,TableColumnList()\y, TableColumnList()\xl, TableColumnList()\yl, TableColumnList()\name, #PB_Button_MultiLine)
    CloseGadgetList()
  EndIf
EndProcedure

Procedure AddTableColumn(GadgetNr,Position,name$,Breite)
  OpenGadgetList(GadgetNr)
  istbreite=GetGadgetAttribute(GadgetNr,#PB_ScrollArea_InnerWidth)
  SetGadgetAttribute(GadgetNr,#PB_ScrollArea_InnerWidth,Breite+istbreite)
  LastElement(TableColumnList())
  x=TableColumnList()\x
  y=TableColumnList()\y
  xl=TableColumnList()\xl
  yl=TableColumnList()\yl
  ;TableColumnList()\title=titel$
  AddElement(TableColumnList())
  TableColumnList()\x=x+xl
  TableColumnList()\y=y
  TableColumnList()\xl=Breite
  TableColumnList()\yl=yl
  TableColumnList()\name=name$
  TableColumnList()\id=ButtonGadget(#PB_Any, TableColumnList()\x, TableColumnList()\y, TableColumnList()\xl, TableColumnList()\yl, TableColumnList()\name, #PB_Button_MultiLine)
  CloseGadgetList()
EndProcedure


Procedure AddTableLine(GadgetNr)
  OpenGadgetList(GadgetNr)
  isthoehe=GetGadgetAttribute(GadgetNr,#PB_ScrollArea_InnerHeight)
  SetGadgetAttribute(GadgetNr,#PB_ScrollArea_InnerHeight,15+isthoehe)
  Spaltenanzahl = CountList(TableColumnList())
  LastElement(TableLineList())
  index=TableLineList()\index
  y=TableLineList()\y
  yl=TableLineList()\yl
  AddElement(TableLineList())
  TableLineList()\index=index+1
  TableLineList()\y=y+yl
  TableLineList()\yl=15
   indextaste=ButtonGadget(#PB_Any,0,TableLineList()\y+20,30,15,Str(TableLineList()\index))
   ForEach TableColumnList()
    x=TableColumnList()\x
    y=TableColumnList()\yl+TableLineList()\y
    xl=TableColumnList()\xl
    yl=TableLineList()\yl
    StringGadget(#PB_Any,x,y,xl-2,yl-1,"",#PB_String_MultiLine|#PB_String_BorderLess) 
  Next
  CloseGadgetList()
EndProcedure

Procedure SaveTable()
  
EndProcedure

Procedure LoadTable()
  
EndProcedure

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 74, 19, 459, 285,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "TableGadget")
    TableGadget(1,5,5,300,200,"Index",50) 
    AddTableColumn(1,0,"Bemerkung",100) 
    AddTableColumn(1,0,"NotizAnweisung",100)
    AddTableColumn(1,0,"Bemerkung",100)
    AddTableColumn(1,0,"Bemerkung2",100)
    For xxx= 1 To 50
      AddTableLine(1) 
      
    Next 
       EndIf
EndProcedureOpen_Window_0()
 ;Schleife
Repeat
  
  Event = WaitWindowEvent()
  
  If Event = #PB_Event_Gadget
    
    ;Debug "WindowID: " + Str(EventWindowID())
    
    GadgetID = EventGadget()
     
    
  EndIf
  
Until Event = #PB_Event_CloseWindow

End
;

Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Bug bei Linked List entdeckt

Beitrag von Kiffi »

4DWelt hat geschrieben:Linked List ist nicht mehr global wirksam
wenn man sie in einer prozedur erstellt kann aus einer anderen
prozedur nicht mehr darauf zugegrifen werden.
it's not a bug,
it's a feature!

Sprich: Das ist so gewollt, dass LLs nicht mehr global sind.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag von freedimension »

Wer die Beta benutzt sollte sich doch eigentlich auch mal die Readme reinziehen ;)

Also, zur Erklärung, LinkedLists und Arrays müssen nun - wie jede andere normale Variable auch - Global deklariert werden. Hat den Vorteil, dass man in Prozeduren nun auch lokale LLs und Arrays erstellen und benutzen kann (etwas was ich mir schon seeeeehr lange herbeigesehnt hatte).
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
4DWelt
Beiträge: 6
Registriert: 25.03.2006 10:11

Beitrag von 4DWelt »

Danke

Ihr habt recht. Ich habe das Readme noch nicht gelesen.
In der Hilfe stand das aber noch die alte Form.
In_Go
Beiträge: 20
Registriert: 06.02.2006 23:46
Wohnort: Eschau, Spessart

Beitrag von In_Go »

Hallo 4D !
Ich habe mir erlaubt Dein Programm umzuschreiben das es auch unter
Purebasic 4 läuft!
- Der Code ist nun erweiterbar!
- Übergabe von Listen wird demonstriert
- Das Fenster kann nun verändert werden
- Es sind Vorbereitungen getroffen die ein auslesen erleichtern!

Danke nochmal an Fred!

Code: Alles auswählen

;Beispiel für Parameterübergabe von Listen an Unterprogramme
;Beispiel für Errechnung der Indizes im Scrollgadget
;Beispiel für With und Endwith
;DIES SOLLTE ALLE DEINE FRAGEN BEANTWORTEN
;UND IST EIN GUTES BEISPIEL FÜR DIE NEUERUNGEN VON PB$
; DANKE FRED! 
Structure TableLine 
  index.l 
  y.l 
  yl.l 
EndStructure 

Structure TableColumn 
  x.l 
  y.l 
  xl.l 
  yl.l 
  name.s 
  id.l 
EndStructure 
Structure Gad
  x.l
  y.l
  b.l
  h.l
  Gadgetart.l 
  Spalte.l
  Zeile.l
  Nummer.l
EndStructure
Enumeration 
  #Window_0 
EndEnumeration
Global GGAD.l
Global GWB.l
Global GWH.l

Procedure PlusGadget(gadgetnummer.l,x.l,y.l,h.l,b.l,zeile.l,spalte.l,G.gad())
  GGAD.l + 1
  SetGadgetData(gadgetnummer.l,GGAD.l)
  AddElement(G())
  With G()  
  \Nummer=gadgetnummer.l :\x=x.l : \y=y.l :\h=h.l : \b=b.l :\Gadgetart=GadgetType(gadgetnummer) 
  \zeile=zeile.l : \spalte=spalte.l
  EndWith
EndProcedure
Procedure TableGadget(GadgetNr,x,y,width,height,name$,SpaltenBreite,TLL.TableLine(),TCL.TableColumn(),G.gad()) 
  If CreateGadgetList(WindowID(#Window_0)) 
    ScrollAreaGadget(GadgetNr, x, y, width, height, 80, 20,  15, #PB_ScrollArea_Single)
    plusgadget(Gadgetnr,x,y,width,height,-1,-1,G())
    AddElement(TLL()) ;Neue Zeile
    AddElement(TCL()) ;Neue Spalte
    With TCL()
    \x=30 : \y=0 : \xl=SpaltenBreite :\yl=20  :\name=name$ 
    \id=ButtonGadget(#PB_Any, \x, \y, \xl, \yl, \name, #PB_Button_MultiLine) 
    plusgadget(\id,\x,\y,\xl,\yl,0,1,G()) 
    EndWith
    CloseGadgetList() 
  EndIf 
EndProcedure 

Procedure AddTableColumn(GadgetNr,Position,name$,Breite,TCL.TableColumn(),G.Gad()) 
  OpenGadgetList(GadgetNr) 
  istbreite=GetGadgetAttribute(GadgetNr,#PB_ScrollArea_InnerWidth) 
  SetGadgetAttribute(GadgetNr,#PB_ScrollArea_InnerWidth,Breite+istbreite) 
  LastElement(TCL()) 
  With TCL()
  x = \x  : y = \y :xl= \xl : yl= \yl  
  AddElement(TCL()) 
  \x=x+xl : \y=y : \xl=Breite : \yl=yl : \name=name$ 
  \id=ButtonGadget(#PB_Any, \x, \y, \xl,\yl,\name, #PB_Button_MultiLine) 
  plusgadget(\id,\x,\y,\xl,\yl,0,CountList(TCL()),G())  
  EndWith
  CloseGadgetList() 
EndProcedure 
;Nun kann man Unterprogramme schreiben die allgemein gültig sind!
Procedure AddTableLine(GadgetNr,TLL.TableLine(),TCL.TableColumn(),G.gad()) 
  OpenGadgetList(GadgetNr) 
  isthoehe=GetGadgetAttribute(GadgetNr,#PB_ScrollArea_InnerHeight) 
  SetGadgetAttribute(GadgetNr,#PB_ScrollArea_InnerHeight,15+isthoehe) 
  Spaltenanzahl = CountList(TCL()) 
  LastElement(TLL()) 
  With TLL()
  index=\index : y=\y : yl=\yl 
  AddElement(TLL()) 
  \index=index+1 : \y=y+yl :\yl=15
  indextaste=ButtonGadget(#PB_Any,0,\y+20,30,15,Str(\index))
  plusgadget(indextaste,0,\y+20,30,15,  \index ,0,G()) 
  EndWith 
   ForEach TCL() 
    With TCL()
    x=\x :y=\yl+TLL()\y : xl=\xl  : yl=TLL()\yl
    EndWith
    mp=StringGadget(#PB_Any,x,y,xl-2,yl-1,"",#ES_MULTILINE|#PB_String_BorderLess) 
    plusgadget(mp,x,y , xl-2 , yl-1 , CountList(TLL())-1 , ListIndex(tcl())+1 , G() )
    ;#PB_String_MultiLine gibts nicht mehr, #ES_MULTILINE scheint identisch zu sein
  Next 
  CloseGadgetList() 
EndProcedure 

Procedure SaveTable()   
EndProcedure 

Procedure LoadTable()  
EndProcedure 

Procedure Open_Window_0(YTableLineList.TableLine(),XTableColumnList.TableColumn(),G.gad()) 
  GWB.l=459:GWH.l=285
  If OpenWindow(#Window_0, 74, 19, GWB.l, GWH.l,"TableGadget" , #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar)   
    TableGadget(1,5,5,300,200,"Index",50,YTableLineList(),XTableColumnList(),G()) 
    AddTableColumn(1,0,"Bemerkung",100,     XTableColumnList(),G())  
    AddTableColumn(1,0,"NotizAnweisung",100,XTableColumnList(),G()) 
    AddTableColumn(1,0,"Bemerkung",100,     XTableColumnList(),G()) 
    AddTableColumn(1,0,"Bemerkung2",100,    XTableColumnList(),G()) 
   ; CallDebugger
    For xxx= 1 To 50 
      AddTableLine(1,YTableLineList(),XTableColumnList(),G()) 
    Next 
  EndIf 
EndProcedure 
;Du siehst die Listen sind nicht global trotzdem werden sie in den Unterprogrammen verwendet! 
NewList TableColumnList.TableColumn() 
NewList TableLineList.TableLine() 
NewList gadgets.gad()
Open_Window_0(TableLineList(),TableColumnList(),gadgets()) 

Repeat 
  Event = WaitWindowEvent()  
  EventType = EventType() 
  Select event ;EventType
  Case #PB_Event_Gadget
    GadgetID = EventGadget() 
    D=GetGadgetData(gadgetid)   
    SelectElement(gadgets(),D-1)
    Debug "("+Str(gadgets()\zeile)+","+Str(gadgets()\spalte)+")"
  Case #PB_Event_Repaint
    If IsWindow(0) :UpdateWindow_(WindowID(0)) :EndIf
    Debug "Repaint"
  Case #WM_SIZE
    nwh.l=WindowHeight(0) :nwb.l=WindowWidth(0)
    If nwh.l<>GWH.l Or  nwb.l<>GWB.l
      ResizeGadget(1, 5*nwb.l/GWB.l  ,  5*nwh.l/GWH.l, 300*nwb.l/GWB.l , 200*nwh.l/GWH.l)
      ForEach gadgets()
        With gadgets()
        EndWith      
      Next
      Debug "Size"
    EndIf 
  EndSelect
Until Event = #PB_Event_CloseWindow 
End 
Shit happens: Let's try to make things better!
4DWelt
Beiträge: 6
Registriert: 25.03.2006 10:11

Beitrag von 4DWelt »

Danke dir und Fred

Ich hab denn Sinn jetzt verstanden.
Und den Vorteil auch.
Das heißt wenn ich Linked List in der Procedur benutzen will muß ich sie
über Parameter übergeben. :allright:
4DWelt
Beiträge: 6
Registriert: 25.03.2006 10:11

Beitrag von 4DWelt »

Das das programm auch noch die angeklikten
Gadgets wiedergibt ist super :allright: :allright:

Was ich noch vermisse ist:
Wie ich die Titelleiste fixiere damit sie nicht mit dem scroller nach oben verschwindet. Ich glaube da war was mit #PB_ScrollArea_Y
Muß ich aber noch probieren.
Ich will diesen selbstgemachten Gadget für meine Anwendungen benutzen
weil ich so die Daten direkt eingeben kann.
Die Längen der Felder wollte ich Automatisch der längsten Textlänge
anpassen.

Vielen Dank nochmal für den neuen Code
Gesperrt