hab mal die funktionen nochmal überarbeitet. bevor ich das ganze jetzt mit ruhigem gewissen einsetzen kann, möchte ich mir ein letztes mal von euch einen statement abholen:
Code: Alles auswählen
#void_number = -2147483648
Procedure.l object_attr( *attr, name.a, value.l = #void_number )
Define m.l, sz.l, edit.a = #False, pos.l, unitLen.a
; ***
CompilerSelect #PB_Compiler_Unicode
CompilerCase 1 : unitLen = 9 ; 8 Bytes für den Pointer, 1 für den Namen
CompilerCase 0 : unitLen = 5 ; 4 Bytes für den Pointer, 1 für den Namen
CompilerEndSelect
; ***
If value = #void_number
If *attr
sz = MemorySize(*attr) / unitLen
; ***
For m = 0 To sz - 1
If PeekA( *attr + (unitLen * m) + 0 ) = name
CompilerSelect #PB_Compiler_Unicode
CompilerCase 1 : ProcedureReturn PeekQ( *attr + (unitLen * m) + 1 )
CompilerCase 0 : ProcedureReturn PeekL( *attr + (unitLen * m) + 1 )
CompilerEndSelect
; ***
Break
EndIf
Next
EndIf
Else
If *attr = 0
*tmp = AllocateMemory( unitLen ) ; 1st Byte = Name, 2nd Long = Value
; ***
PokeA( *tmp + 0, name )
; ***
CompilerSelect #PB_Compiler_Unicode
CompilerCase 1 : PokeQ( *tmp + 1, value )
CompilerCase 0 : PokeL( *tmp + 1, value )
CompilerEndSelect
; ***
ProcedureReturn *tmp
Else
sz = MemorySize(*attr) / unitLen
; ***
If sz
For m = 0 To sz - 1
If PeekA( *attr + (unitLen * m) + 0 ) = name
edit = #True
; ***
pos = m
; ***
Break
EndIf
Next
EndIf
; ***
Select edit
Case #False ; Add an new entry
*tmp = AllocateMemory( MemorySize( *attr ) + unitLen )
; ***
FillMemory( *tmp, MemorySize( *attr ) + unitLen, 0, #PB_Ascii )
CopyMemory( *attr, *tmp, MemorySize(*attr) )
; ***
m = MemorySize(*attr)
; ***
PokeA( *tmp + m + 0, name )
; ***
CompilerSelect #PB_Compiler_Unicode
CompilerCase 1 : PokeQ( *tmp + m + 1, value )
CompilerCase 0 : PokeL( *tmp + m + 1, value )
CompilerEndSelect
Case #True ; Edit an existing entry
*tmp = AllocateMemory( MemorySize( *attr ) )
; ***
FillMemory( *tmp, MemorySize( *attr ), 0, #PB_Ascii )
CopyMemory( *attr, *tmp, MemorySize(*attr) )
; ***
CompilerSelect #PB_Compiler_Unicode
CompilerCase 1 : PokeQ( *tmp + (pos * unitLen) + 1, value )
CompilerCase 0 : PokeL( *tmp + (pos * unitLen) + 1, value )
CompilerEndSelect
EndSelect
; ***
FreeMemory( *attr )
; ***
ProcedureReturn *tmp
EndIf
EndIf
EndProcedure
Procedure.l object_attr_set_string( *attr, name.a, value.s )
Define m, sz, *ptr = 0, unitLen.a
; ***
CompilerSelect #PB_Compiler_Unicode
CompilerCase 1 : unitLen = 9 ; 8 Bytes für den Pointer, 1 für den Namen
CompilerCase 0 : unitLen = 5 ; 4 Bytes für den Pointer, 1 für den Namen
CompilerEndSelect
; ***
If *attr
sz = MemorySize(*attr) / unitLen
; ***
For m = 0 To sz - 1
If PeekA( *attr + (unitLen * m) + 0 ) = name
CompilerSelect #PB_Compiler_Unicode
CompilerCase 1 : *ptr = PeekQ( *attr + (unitLen * m) + 1 )
CompilerCase 0 : *ptr = PeekL( *attr + (unitLen * m) + 1 )
CompilerEndSelect
; ***
Break
EndIf
Next
; ***
If *ptr
FreeMemory(*ptr)
EndIf
; ***
CompilerSelect #PB_Compiler_Unicode
CompilerCase 1
*ptr = AllocateMemory( (Len(value) * 2) + 2 )
; ***
PokeS( *ptr, value, (Len(value) * 2) + 2, #PB_Unicode )
CompilerCase 0
*ptr = AllocateMemory( Len(value) + 1 )
; ***
PokeS( *ptr, value, Len(value) + 1, #PB_Ascii )
CompilerEndSelect
; ***
ProcedureReturn object_attr( *attr, name, *ptr )
EndIf
EndProcedure
Procedure.s object_attr_get_string( *attr, name.a )
Define m, sz, *ptr = 0, unitLen.a
; ***
CompilerSelect #PB_Compiler_Unicode
CompilerCase 1 : unitLen = 9 ; 8 Bytes für den Pointer, 1 für den Namen
CompilerCase 0 : unitLen = 5 ; 4 Bytes für den Pointer, 1 für den Namen
CompilerEndSelect
; ***
If *attr
sz = MemorySize(*attr) / unitLen
; ***
For m = 0 To sz - 1
If PeekA( *attr + (unitLen * m) + 0 ) = name
CompilerSelect #PB_Compiler_Unicode
CompilerCase 1 : *ptr = PeekQ( *attr + (unitLen * m) + 1 )
CompilerCase 0 : *ptr = PeekL( *attr + (unitLen * m) + 1 )
CompilerEndSelect
; ***
Break
EndIf
Next
; ***
If *ptr
CompilerSelect #PB_Compiler_Unicode
CompilerCase 1
ProcedureReturn PeekS( *ptr, MemorySize(*ptr) / 2, #PB_Unicode )
CompilerCase 0
ProcedureReturn PeekS( *ptr, MemorySize(*ptr), #PB_Ascii )
CompilerEndSelect
EndIf
EndIf
EndProcedure
Procedure.l object_attr_set_double( *attr, name.a, value.d )
Define m, sz, *ptr = 0, unitLen.a
; ***
CompilerSelect #PB_Compiler_Unicode
CompilerCase 1 : unitLen = 9 ; 8 Bytes für den Pointer, 1 für den Namen
CompilerCase 0 : unitLen = 5 ; 4 Bytes für den Pointer, 1 für den Namen
CompilerEndSelect
; ***
If *attr
sz = MemorySize(*attr) / unitLen
; ***
For m = 0 To sz - 1
If PeekA( *attr + (unitLen * m) + 0 ) = name
CompilerSelect #PB_Compiler_Unicode
CompilerCase 1 : *ptr = PeekQ( *attr + (unitLen * m) + 1 )
CompilerCase 0 : *ptr = PeekL( *attr + (unitLen * m) + 1 )
CompilerEndSelect
; ***
Break
EndIf
Next
; ***
If *ptr
FreeMemory(*ptr)
EndIf
; ***
*ptr = AllocateMemory( 8 )
; ***
PokeD( *ptr, value )
; ***
ProcedureReturn object_attr( *attr, name, *ptr )
EndIf
EndProcedure
Procedure.d object_attr_get_double( *attr, name.a )
Define m, sz, *ptr = 0, unitLen.a
; ***
CompilerSelect #PB_Compiler_Unicode
CompilerCase 1 : unitLen = 9 ; 8 Bytes für den Pointer, 1 für den Namen
CompilerCase 0 : unitLen = 5 ; 4 Bytes für den Pointer, 1 für den Namen
CompilerEndSelect
; ***
If *attr
sz = MemorySize(*attr) / unitLen
; ***
For m = 0 To sz - 1
If PeekA( *attr + (unitLen * m) + 0 ) = name
CompilerSelect #PB_Compiler_Unicode
CompilerCase 1 : *ptr = PeekQ( *attr + (unitLen * m) + 1 )
CompilerCase 0 : *ptr = PeekL( *attr + (unitLen * m) + 1 )
CompilerEndSelect
; ***
Break
EndIf
Next
; ***
If *ptr
ProcedureReturn PeekD( *ptr )
EndIf
EndIf
EndProcedure
Beispiele:
Code: Alles auswählen
Enumeration
#farbe
#typ
#position
#adresse
#string1
#string2
#kommaz
#plz
#ort
EndEnumeration
*eigenschaften = object_attr( *eigenschaften, #farbe, 345 )
*eigenschaften = object_attr( *eigenschaften, #typ, 20 )
*eigenschaften = object_attr( *eigenschaften, #position, 112 )
*eigenschaften = object_attr_set_double( *eigenschaften, #kommaz, 3078.94 )
*eigenschaften = object_attr_set_string( *eigenschaften, #string1, "Hallo Welt" )
*eigenschaften = object_attr_set_string( *eigenschaften, #string2, "Alles in Ordnung :-)" )
*eigenschaften = object_attr( *eigenschaften, #adresse, 80 )
*eigenschaften = object_attr( *eigenschaften, #plz, 99 )
*eigenschaften = object_attr( *eigenschaften, #ort, 174 )
Debug object_attr( *eigenschaften, #farbe )
Debug object_attr( *eigenschaften, #typ )
Debug object_attr( *eigenschaften, #position )
Debug object_attr( *eigenschaften, #adresse )
Debug object_attr( *eigenschaften, #plz )
Debug object_attr( *eigenschaften, #ort )
Debug ""
Debug object_attr( *eigenschaften, #plz )
Debug object_attr( *eigenschaften, #farbe )
Debug object_attr( *eigenschaften, #ort )
Debug object_attr( *eigenschaften, #typ )
Debug object_attr( *eigenschaften, #adresse )
Debug object_attr( *eigenschaften, #position )
Debug ""
*eigenschaften = object_attr( *eigenschaften, #position, 100 )
Debug object_attr( *eigenschaften, #position )
Debug ""
*eigenschaften = object_attr( *eigenschaften, #position, 150 )
Debug object_attr( *eigenschaften, #position )
Debug ""
*eigenschaften = object_attr( *eigenschaften, #position, 200 )
Debug object_attr( *eigenschaften, #position )
Debug ""
*eigenschaften = object_attr( *eigenschaften, #position, 250 )
Debug object_attr( *eigenschaften, #position )
Debug ""
Debug StrD(object_attr_get_double( *eigenschaften, #kommaz ), 2)
Debug ""
Debug object_attr_get_string( *eigenschaften, #string1 )
Debug object_attr_get_string( *eigenschaften, #string2 )
Debug ""