GetGadgetItemData - Strukturen und Listen speichern [gelöst]
Verfasst: 19.08.2014 18:47
Hallo Forum!
Nach langer Abstinenz melde ich mich mal wieder im Forum mit einem Code-Schnippsel:
1. Erweiterte Daten in GadgetItemData speichern:
Dieser Code scheint zu funktionieren und seine Arbeit zu tun.
Da ich an sich kein großer "Pointerer" bin, bitte ich um Rückmeldung, ob der Code so passt.
Ich möchte euch bitten, ihn zu nutzen/testen und Fehler zu melden.
Für mich eine wichtige Frage ist auch: "Ist da ein Memory leak ???"
2. Linked Lists in GadgetItemData speichern:
Ich habe dann versucht, den Code auf Linked Lists zu erweitern, ab da scheitert alles völlig.
Die Stellen habe ich in der richtigen Reihenfolge nummeriert (auch im Code - man muss die Stellen auskommentieren) und zu Beginn auskommentiert:
LG Puretom.
Nach langer Abstinenz melde ich mich mal wieder im Forum mit einem Code-Schnippsel:
1. Erweiterte Daten in GadgetItemData speichern:
Dieser Code scheint zu funktionieren und seine Arbeit zu tun.
Da ich an sich kein großer "Pointerer" bin, bitte ich um Rückmeldung, ob der Code so passt.
Ich möchte euch bitten, ihn zu nutzen/testen und Fehler zu melden.
Für mich eine wichtige Frage ist auch: "Ist da ein Memory leak ???"
Code: Alles auswählen
;**********************************************************
;* Include file: Extended Gadget Item Data
;**********************************************************
; PureTom, 19.8.2014
EnableExplicit
Structure item_data
item_int.i
item_string.s
EndStructure
Procedure AddGadgetItemEx(gadget, item, text.s, image_id=0, flags=0)
Protected *mem.item_data
; add gadget item
AddGadgetItem(gadget, item, text.s, image_id, flags)
; allocate pointer *mem with Memory of size of item_data
; -> save *mem to GadgetItemData
If item=-1: item=CountGadgetItems(gadget)-1: EndIf
*mem = AllocateMemory(SizeOf(item_data))
SetGadgetItemData(gadget, item, *mem)
EndProcedure
Procedure RemoveGadgetItemEx(gadget, item)
Protected *mem.item_data
; get the previos saved pointer *mem
; to free allocated memory
*mem = GetGadgetItemData(gadget, item)
FreeMemory(*mem)
; remove item
RemoveGadgetItem(gadget, item)
EndProcedure
Procedure SetGadgetItemDataEx(gadget, item, *value.item_data)
Protected *mem.item_data
; reads *mem pointer out of Gadget Item Data
*mem = GetGadgetItemData(gadget, item)
; saves structure (indirect) in Gadget Item Data,
; direct in allocated memory *mem.item_data
*mem\item_int = *value\item_int
*mem\item_string = *value\item_string
EndProcedure
;**********************************************************
;* Test Program
;**********************************************************
Procedure Test_Program()
Protected *mem.item_data, value.item_data, Event, i
OpenWindow(0, #PB_Ignore, #PB_Ignore, 400, 200, "tests")
ListViewGadget(1, 0, 0, 400, 200)
; Add items (allocate memory)
AddGadgetItemEx(1, -1, "item 0")
AddGadgetItemEx(1, -1, "item 1")
AddGadgetItemEx(1, -1, "item 2")
AddGadgetItemEx(1, -1, "item 3")
; set gadget item data in memory
value\item_int = 0
value\item_string = "ITEM 0"
SetGadgetItemDataEx(1, 0, value)
value\item_int = 1
value\item_string = "ITEM 1"
SetGadgetItemDataEx(1, 1, value)
value\item_int = 2
value\item_string = "ITEM 2"
SetGadgetItemDataEx(1, 2, value)
value\item_int = 3
value\item_string = "ITEM 3"
SetGadgetItemDataEx(1, 3, value)
; windows event loop
Repeat
Event = WaitWindowEvent()
If Event=#PB_Event_Gadget And EventGadget()=1
Select EventType()
Case #PB_EventType_LeftDoubleClick
If GetGadgetState(1)>=0
*mem = GetGadgetItemData(1, GetGadgetState(1))
Debug "clicked: Pointer= "+Str(*mem)+", "+Str(*mem\item_int) + " - "+*mem\item_string
EndIf
Case #PB_EventType_RightClick
If GetGadgetState(1)>=0
RemoveGadgetItemEx(1, GetGadgetState(1))
EndIf
EndSelect
EndIf
Until Event=#PB_Event_CloseWindow
EndProcedure
Test_Program()
; click in ListViewGadget :
; #PB_EventType_LeftDoubleClick -> shows all item_data
; #PB_EventType_RightClick -> delets selected (!) item
2. Linked Lists in GadgetItemData speichern:
Ich habe dann versucht, den Code auf Linked Lists zu erweitern, ab da scheitert alles völlig.
Die Stellen habe ich in der richtigen Reihenfolge nummeriert (auch im Code - man muss die Stellen auskommentieren) und zu Beginn auskommentiert:
- Das funktioniert, zeigt mir also, dass die Struktur übergeben wurde.
- Wenn ich das auskommentierte, erhalte ich die Fehlermeldung "Verknüpfte Liste nicht initialisiert"
- Nun, denke ich mir, dann fügen wir mal bei der Erstellung ein Listenelement hinzu.
"Ungültiger Speicherzugriff. Lesefehler an ..." ist die Folge. - Auch der Versuch, eine theoretisch erstellte, aber leere Liste mit ForEach abzuklappern, führt zu "Ungültiger Speicherzugriff. Lesefehler an ..."
LG Puretom.
Code: Alles auswählen
;**********************************************************
;* Include file: Extended Gadget Item Data (with LISTS)
;**********************************************************
; PureTom, 19.8.2014
EnableExplicit
Structure item_data
item_int.i
item_string.s
List item_list.s()
EndStructure
Procedure AddGadgetItemEx(gadget, item, text.s, image_id=0, flags=0)
Protected *mem.item_data
; add gadget item
AddGadgetItem(gadget, item, text.s, image_id, flags)
; AddElement(*mem\item_list()) ; <--------------------- [3] "Ungültiger Speicherzugriff. Lesefehler an ..."
;
; ForEach *mem\item_list() ; <--------------------- [4] "Ungültiger Speicherzugriff. Lesefehler an ..."
; Debug *mem\item_list()
; Next
; allocate pointer *mem with Memory of size of item_data
; -> save *mem to GadgetItemData
If item=-1: item=CountGadgetItems(gadget)-1: EndIf
*mem = AllocateMemory(SizeOf(item_data))
SetGadgetItemData(gadget, item, *mem)
EndProcedure
Procedure RemoveGadgetItemEx(gadget, item)
Protected *mem.item_data
; get the previos saved pointer *mem
; to free allocated memory
*mem = GetGadgetItemData(gadget, item)
FreeMemory(*mem)
; remove item
RemoveGadgetItem(gadget, item)
EndProcedure
Procedure SetGadgetItemDataEx(gadget, item, *value.item_data)
Protected *mem.item_data
; reads *mem pointer out of Gadget Item Data
*mem = GetGadgetItemData(gadget, item)
; saves structure (indirect) in Gadget Item Data,
; direct in allocated memory *mem.item_data
*mem\item_int = *value\item_int
*mem\item_string = *value\item_string
; ForEach *value\item_list() ; <--------------------- [1] geht problemlos (siehe Debug-Ausgabe)
; Debug *value\item_list(); Liste wurde also problemlos übergeben
; Next
; CopyList(*value\item_list(), *mem\item_list()); <-------------- [2] "Verknüpfte Liste nicht initialisiert"
EndProcedure
;**********************************************************
;* Test Program
;**********************************************************
Procedure Test_Program()
Protected *mem.item_data, value.item_data, Event, i
OpenWindow(0, #PB_Ignore, #PB_Ignore, 400, 200, "tests")
ListViewGadget(1, 0, 0, 400, 200)
; Add items (allocate memory)
AddGadgetItemEx(1, -1, "item 0")
AddGadgetItemEx(1, -1, "item 1")
AddGadgetItemEx(1, -1, "item 2")
AddGadgetItemEx(1, -1, "item 3")
; set gadget item data in memory
value\item_int = 0
value\item_string = "ITEM 0"
AddElement(value\item_list())
value\item_list()="ITEM 0 - List Element 0"
AddElement(value\item_list())
value\item_list()="ITEM 0 - List Element 1"
SetGadgetItemDataEx(1, 0, value)
ClearList(value\item_list())
value\item_int = 1
value\item_string = "ITEM 1"
AddElement(value\item_list())
value\item_list()="ITEM 1 - List Element 0"
AddElement(value\item_list())
value\item_list()="ITEM 1 - List Element 1"
SetGadgetItemDataEx(1, 1, value)
ClearList(value\item_list())
value\item_int = 2
value\item_string = "ITEM 2"
AddElement(value\item_list())
value\item_list()="ITEM 2 - List Element 0"
AddElement(value\item_list())
value\item_list()="ITEM 2 - List Element 1"
SetGadgetItemDataEx(1, 2, value)
ClearList(value\item_list())
value\item_int = 3
value\item_string = "ITEM 3"
AddElement(value\item_list())
value\item_list()="ITEM 3 - List Element 0"
AddElement(value\item_list())
value\item_list()="ITEM 3 - List Element 1"
SetGadgetItemDataEx(1, 3, value)
ClearList(value\item_list())
; windows event loop
Repeat
Event = WaitWindowEvent()
If Event=#PB_Event_Gadget And EventGadget()=1
Select EventType()
Case #PB_EventType_LeftDoubleClick
If GetGadgetState(1)>=0
*mem = GetGadgetItemData(1, GetGadgetState(1))
Debug "clicked: Pointer= "+Str(*mem)+", "+Str(*mem\item_int) + " - "+*mem\item_string
EndIf
Case #PB_EventType_RightClick
If GetGadgetState(1)>=0
RemoveGadgetItemEx(1, GetGadgetState(1))
EndIf
EndSelect
EndIf
Until Event=#PB_Event_CloseWindow
EndProcedure
Test_Program()
; click in ListViewGadget :
; #PB_EventType_LeftDoubleClick -> shows all item_data
; #PB_EventType_RightClick -> delets selected (!) item