arbeiten. Du musst dir nur ein paar Procedures stricken, die das Array und
das ListIconGadget gleichzeitig verwalten und dann nur noch die benutzen.
So mache ich es in meinem aktuellen Projekte auch.
In einer LinkedList sind alle Elemente in einer Structure für das ListIconGadget gespeichert. Im ListIconGadget verlinke ich die Pointer zu jedem Element dann über 'SetGadgetItemData()'. Wenn ich dann ein Element irgendwo hinzufügen möchte, brauche ich nur mit 'GetGadgetItemData()' das LinkedList-Element auswählen und mit 'InsertElement()' davor setzen.
Code: Alles auswählen
EnableExplicit
Structure Element
Col.s[5]
EndStructure
Global NewList Elements.Element()
Enumeration ;Windows
#W_Main
EndEnumeration
Enumeration ;Gadgets
#G_Main_List
#G_Main_Add
#G_Main_Del
#G_Main_Open
#G_Main_Save
EndEnumeration
Enumeration ;Menus
#M_Main
EndEnumeration
Enumeration ;MenuItems
#MI_Sort_Col0
#MI_Sort_Col1
#MI_Sort_Col2
#MI_Sort_Col3
#MI_Sort_Col4
#MI_Del
EndEnumeration
Procedure Main_RefreshEntry(pos.l)
Protected *Element.Element, a.l
*Element = GetGadgetItemData(#G_Main_List, pos)
If *Element
For a = 0 To 4
SetGadgetItemText(#G_Main_List, pos, *Element\Col[a], a)
Next
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure Main_Refresh()
Protected max.l, a.l
max = CountGadgetItems(#G_Main_List) - 1
For a = 0 To max
Main_RefreshEntry(a)
Next
ProcedureReturn #True
EndProcedure
Procedure Main_Add(pos.l, *Element.Element = 0)
Protected *In.Element, a.l
If pos = -1
pos = CountGadgetItems(#G_Main_List)
LastElement(Elements())
If AddElement(Elements()) = 0 : ProcedureReturn #False : EndIf
Else
*In = GetGadgetItemData(#G_Main_List, pos)
If *In
ChangeCurrentElement(Elements(), *In)
If InsertElement(Elements()) = 0 : ProcedureReturn #False : EndIf
Else
ProcedureReturn #False
EndIf
EndIf
If *Element
For a = 0 To 4
Elements()\Col[a] = *Element\Col[a]
Next
EndIf
AddGadgetItem(#G_Main_List, pos, "")
SetGadgetItemData(#G_Main_List, pos, @Elements())
Main_RefreshEntry(pos)
ProcedureReturn pos
EndProcedure
Procedure Main_Del(pos.l)
Protected *Element.Element
If pos < 0 : ProcedureReturn #False : EndIf
*Element = GetGadgetItemData(#G_Main_List, pos)
If *Element
ChangeCurrentElement(Elements(), *Element)
DeleteElement(Elements())
RemoveGadgetItem(#G_Main_List, pos)
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure Main_Set(pos.l, *Element.Element)
Protected *In.Element, a.l
*In = GetGadgetItemData(#G_Main_List, pos)
If *In
For a = 0 To 4
*In\Col[a] = *Element\Col[a]
Next
Main_RefreshEntry(pos)
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure Main_Get(pos.l)
If pos >= 0
ProcedureReturn GetGadgetItemData(#G_Main_List, pos)
EndIf
ProcedureReturn #False
EndProcedure
Procedure Main_Sort(Col.l)
SortStructuredList(Elements(), 0, Col * SizeOf(String), #PB_Sort_String)
Main_Refresh()
ProcedureReturn #True
EndProcedure
Procedure File_WriteString(FileID.l, String.s)
WriteLong(FileID, Len(String))
WriteString(FileID, String)
EndProcedure
Procedure.s File_ReadString(FileID.l)
Protected l.l, s.s
l = ReadLong(FileID)
s = Space(l)
ReadData(FileID, @s, l)
ProcedureReturn s
EndProcedure
Procedure Main_Save()
Protected File.s, FileID.l, a.l
File = SaveFileRequester("Speichern unter...", "\", "Alle Dateien (*.*)|*.*", 0)
If File = "" : ProcedureReturn #False : EndIf
FileID = CreateFile(#PB_Any, File)
If FileID
WriteLong(FileID, CountList(Elements()))
ForEach Elements()
For a = 0 To 4
File_WriteString(FileID, Elements()\Col[a])
Next
Next
CloseFile(FileID)
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure Main_Open()
Protected File.s, FileID.l, max.l, a.l, Element.Element, b.l
File = OpenFileRequester("Öffnen...", "\", "Alle Dateien (*.*)|*.*", 0)
If File = "" : ProcedureReturn #False : EndIf
FileID = ReadFile(#PB_Any, File)
If FileID
ClearList(Elements())
ClearGadgetItemList(#G_Main_List)
max = ReadLong(FileID)
For a = 1 To max
For b = 0 To 4
Element\Col[b] = File_ReadString(FileID)
Next
Main_Add(-1, @Element)
Next
CloseFile(FileID)
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure Main_Change(pos.l)
Protected s.s, a.l, r.s, *Element.Element
*Element = Main_Get(pos)
If *Element = #False : ProcedureReturn #False : EndIf
For a = 0 To 4
If a : s + ";" : EndIf
s + *Element\Col[a]
Next
r = InputRequester("Inhalt...", "Ändern sie den Text des Eintrages:", s)
If r
For a = 0 To 4
*Element\Col[a] = StringField(r, a + 1, ";")
Next
Main_RefreshEntry(pos)
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Define s.s, Element.Element, a.l
If OpenWindow(#W_Main, 0, 0, 400, 300, "ListIcon-Test", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
If CreatePopupMenu(#M_Main)
MenuItem(#MI_Del, "Del")
MenuBar()
MenuItem(#MI_Sort_Col0, "Sort Col 0")
MenuItem(#MI_Sort_Col1, "Sort Col 1")
MenuItem(#MI_Sort_Col2, "Sort Col 2")
MenuItem(#MI_Sort_Col3, "Sort Col 3")
MenuItem(#MI_Sort_Col4, "Sort Col 4")
EndIf
If CreateGadgetList(WindowID(#W_Main))
ListIconGadget(#G_Main_List, 0, 0, 400, 280, "Col 0", 50, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
AddGadgetColumn(#G_Main_List, 1, "Col 1", 50)
AddGadgetColumn(#G_Main_List, 2, "Col 2", 50)
AddGadgetColumn(#G_Main_List, 3, "Col 3", 50)
AddGadgetColumn(#G_Main_List, 4, "Col 4", 50)
ButtonGadget(#G_Main_Add, 0, 280, 50, 20, "Add")
ButtonGadget(#G_Main_Del, 50, 280, 50, 20, "Del")
ButtonGadget(#G_Main_Open, 100, 280, 50, 20, "Open")
ButtonGadget(#G_Main_Save, 150, 280, 50, 20, "Save")
For a = 1 To 10000
Element\Col[0] = Str(a)
Element\Col[1] = Chr(64 + a % 26)
Element\Col[2] = RSet(Str(Random(9999)), 4, "0")
Element\Col[3] = Chr(93 + Random(25))
Element\Col[4] = "blubber"
Main_Add(-1, @Element)
Next
Repeat
a = GetGadgetState(#G_Main_List)
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
Select EventGadget()
Case #G_Main_List
Select EventType()
Case #PB_EventType_RightClick
DisplayPopupMenu(#M_Main, WindowID(#W_Main))
Case #PB_EventType_LeftDoubleClick
Main_Change(a)
EndSelect
Case #G_Main_Add
a = Main_Add(a)
Main_Change(a)
SetGadgetState(#G_Main_List, a)
Case #G_Main_Del
Main_Del(a)
Case #G_Main_Open
Main_Open()
Case #G_Main_Save
Main_Save()
EndSelect
Case #PB_Event_Menu
Select EventMenu()
Case #MI_Del : Main_Del(a)
Case #MI_Sort_Col0 : Main_Sort(0)
Case #MI_Sort_Col1 : Main_Sort(1)
Case #MI_Sort_Col2 : Main_Sort(2)
Case #MI_Sort_Col3 : Main_Sort(3)
Case #MI_Sort_Col4 : Main_Sort(4)
EndSelect
EndSelect
ForEver
EndIf
CloseWindow(0)
EndIf
habe.