Ist es auch moeglich mit SetGadgetData auch String zu speichern oder kann nur eine Zahl uebergeben werden? Ich will gerne lieber ein Text in einen Gadget speichern aber ist nicht moeglich oder? Oder kennt ihr ein Trick?

Code: Alles auswählen
Global text.s = "Hallo"
OpenWindow(0, #PB_Ignore, #PB_Ignore, 640, 480, "")
ButtonGadget(0, 10, 10, 100, 25, "Click mich")
SetGadgetData(0, @text)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow : Break
Case #PB_Event_Gadget
Select EventGadget()
Case 0
Select EventType()
Case #PB_EventType_LeftClick
Debug PeekS(GetGadgetData(0))
EndSelect
EndSelect
EndSelect
ForEver
Code: Alles auswählen
Structure __GadgetData
value.i
s.s
EndStructure
Procedure __SetGadgetData(GadgetID.i, Value.i)
Protected *data.__GadgetData = GetGadgetData(GadgetID)
If (Not *data)
*data = AllocateMemory(SizeOf(__GadgetData))
InitializeStructure(*data, __GadgetData)
EndIf
*data\value = Value
SetGadgetData(GadgetID, *data)
EndProcedure
Procedure.i __GetGadgetData(GadgetID.i)
Protected *data.__GadgetData = GetGadgetData(GadgetID)
If (Not *data)
*data = AllocateMemory(SizeOf(__GadgetData))
InitializeStructure(*data, __GadgetData)
EndIf
ProcedureReturn *data\value
EndProcedure
Procedure SetGadgetDataString(GadgetID.i, String.s)
Protected *data.__GadgetData = GetGadgetData(GadgetID)
If (Not *data)
*data = AllocateMemory(SizeOf(__GadgetData))
InitializeStructure(*data, __GadgetData)
EndIf
*data\s = String
SetGadgetData(GadgetID, *data)
EndProcedure
Procedure.s GetGadgetDataString(GadgetID.i)
Protected *data.__GadgetData = GetGadgetData(GadgetID)
If (Not *data)
*data = AllocateMemory(SizeOf(__GadgetData))
InitializeStructure(*data, __GadgetData)
EndIf
ProcedureReturn *data\s
EndProcedure
Macro SetGadgetData(GadgetID, Value)
__SetGadgetData(GadgetID, Value)
EndMacro
Macro GetGadgetData(GadgetID, Value)
__GetGadgetData(GadgetID)
EndMacro
Wenn es keine Container-Gadgets gäbe ^^, ja ...NicTheQuick hat geschrieben:Ja, stimmt. FreeGadget hätte ich auch noch als Macro dazu schreiben müssen. Das ist dann ja auch kein großer Aufwand mehr.
Code: Alles auswählen
Prototype CallOldFreeProc(Gadget)
Structure GadgetVT
GadgetType.l
SizeOf.l
GadgetCallback.i
FreeGadget.i
EndStructure
Structure Gadget
Gadget.i
*vt.GadgetVT
EndStructure
Structure FreeProcInfo
OldProc.CallOldFreeProc
NewProc.CallOldFreeProc
GadgedNR.i
EndStructure
Structure UserData
UserData.i[10]
size.i
EndStructure
Import ""
PB_Object_GetObject(obj, id)
PB_Gadget_Objects
EndImport
Global NewMap OldFreeProc.FreeProcInfo()
;-------------------------------------------
Procedure FreeProc(Gadget)
Protected GadgedNR
If Gadget
GadgedNR = OldFreeProc(Str(gadget))\GadgedNR
OldFreeProc(Str(gadget))\NewProc(GadgedNR)
DeleteMapElement(OldFreeProc(), Str(gadget))
If OldFreeProc(Str(gadget))\OldProc
ProcedureReturn OldFreeProc(Str(gadget))\OldProc(GadgedNR)
EndIf
EndIf
EndProcedure
;-------------------------------------------
Procedure SetFreeProc(Gadget, Proc)
Protected *g.Gadget
*g = PB_Object_GetObject(PB_Gadget_Objects, Gadget)
If *g
OldFreeProc(Str(*g))\GadgedNR = Gadget
OldFreeProc(Str(*g))\OldProc = *g\vt\FreeGadget
OldFreeProc(Str(*g))\NewProc = Proc
*g\vt\FreeGadget = @FreeProc()
EndIf
EndProcedure
;-------------------------------------------
;-------------------------------------------
;-------------------------------------------
;-------------------------------------------
;-------------------------------------------
Procedure MyFreeGadget(Gadget)
Debug "FreeGadget : " + Gadget
EndProcedure
;-------------------------------------------
Procedure Main()
Protected Window
Protected Gad1
Protected Gad2
Window = OpenWindow(#PB_Any, #PB_Ignore, #PB_Ignore, 200, 200, "")
If Window
Gad1 = ButtonGadget(#PB_Any, 10, 10, 180, 25, "hm?")
Gad2 = ListViewGadget(#PB_Any, 10, 35, 180, 150)
SetFreeProc(Gad1, @MyFreeGadget())
SetFreeProc(Gad2, @MyFreeGadget())
FreeGadget(Gad1)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
EndProcedure:End Main()
Z: 58 OldFreeProc(Str(*g))\OldProc = *g\vt\FreeGadgetedel hat geschrieben:Versuch doch mal folgenden Code unter Linux auszuführen.