Benutzung von GetGadgetItemData und SetGadgetItemData
Verfasst: 10.03.2010 09:36
Guten Morgen. Habe ein Verständnisproblem zu diesen beiden Funktionen. Könnte jemand bitte im folgenden Code nachschauen ob ich diese falsch benutze? Bemerkung: Bei manchen Zeilen habe ich einen Zeilenumbruch eingeschoben um das Fenster im Forum nicht unnötig in die Breite zu strecken. Vor dem Ausführen also wieder rückgangig machen. (siehe Syntax-Error beim kompilieren)
Im Programm einfach einen Button links drücken (egal welcher). Ist nur Beispielcode. Problem liegt in der Procedure setMonitor. Im ElseIf-teil setze ich die Daten des erstellten Eintrags und in der If Bedingung frage ich diesen Zustand ab. Dieser ist komischerweise immernoch null. Somit erstellt man bei einem Buttonklick jedesmal einen Eintrag. Mir gehts aber darum: falls ein Eintrag mit dem Identifier noch nicht existiert erstelle einen Neuen. Falls ein Eintrag mit diesem Identifier schon existiert mache ein update dieses Eintrags. Dachte diese Beiden Funktionen (siehe Threadtitel) seien wie dafür geschaffen. Nehme auch gerne eine andere Möglichkeit an um mein Ziel zu erreichen.
Gruss alDo
//EDIT: Formatierung des Codes angepasst
Code: Alles auswählen
Enumeration
#WINDOW_MAIN
#CAN_MESSAGE
#CAN_MESSAGERECBYTESString
#CAN_MESSAGERECBYTESText
#SELECTED_CAN_MESSAGE
#TRACER
#TRACERList
EndEnumeration
Structure MessageAttributes
Count.i
Period.w
Datalength.a
Databyte.s[8]
EndStructure
Dim CAN_Message$(7)
Dim CAN_Message(17)
Dim SelectedMessage(17)
Dim ButtonGadgetNumber(13)
NewMap Message.MessageAttributes()
Procedure createCANMessage(Array GadgetNumber(1), PosX, PosY, MaxWidth, AmountOfDataBytes, Title$, Array DataByteDesignation$(1))
Protected ID$ = "ID"
Protected Length = (MaxWidth-35)/(AmountOfDataBytes+1)
Protected n
;textgadgets
; TextGadget of the title
GadgetNumber(9) = TextGadget(#PB_Any, PosX, PosY, Len(Title$)*11, 20, Title$)
; TextGadget of ID
TextGadget(#PB_Any, PosX,20+PosY, Length, 20, ID$,#PB_Text_Center)
; TextGadget of D0...D7
For n=0 To AmountOfDataBytes-1
GadgetNumber(10+n) = TextGadget(#PB_Any, ((n+1)*Length)+15+PosX, 20+PosY, Length, 20, DataByteDesignation$(n), #PB_Text_Center)
Next
;stringgadgets
; GadgetNumber(8) => StringGadget# of ID
GadgetNumber(8) = StringGadget(#PB_Any, PosX, 40+PosY, Length, 20, "000", #PB_Text_Center|#SS_SUNKEN)
; GadgetNumber(0)...GadgetNumber(7) => StringGadget# of D0...D7
For n=0 To AmountOfDataBytes-1
GadgetNumber(n) = StringGadget(#PB_Any, ((n+1)*Length)+15+PosX, 40+PosY, Length, 20, "0" , #PB_Text_Center|#SS_SUNKEN)
Next
EndProcedure
Procedure createButton(Array GadgetNumber(1), PosX, PosY, Width, Height, Title$)
Protected LengthOfText = Len(Title$)*11
Protected HeightOfString = Height-30
Protected XOfString = ((LengthOfText-Width)/2)
TextGadget(#PB_Any, PosX, PosY, LengthOfText, 20, Title$, #PB_Text_Center)
GadgetNumber(0) = StringGadget(#PB_Any, XOfString+PosX, 20+PosY, Width, HeightOfString, "0", #PB_Text_Center|#SS_SUNKEN)
GadgetNumber(1) = ButtonGadget(#PB_Any, XOfString+PosX, Height-10+PosY, Width, 10,"")
SetGadgetColor(GadgetNumber(0), #PB_Gadget_BackColor, $00CCFF)
EndProcedure
Procedure createMainWindow()
Protected WindowWidth = 1600
Protected WindowHeight = 986
Protected CreateCANHeight = 60
Protected FrameCANPosX = WindowWidth-780
Protected FrameCANPosY = 10
Protected FrameCANWidth = WindowWidth-(10+FrameCANPosX)
Protected FrameCANHeight = 30+CreateCANHeight+10
Protected HalfFrameCANWidth = FrameCANPosX+(FrameCANWidth/2)
Protected FrameSelectedPosX = FrameCANPosX
Protected FrameSelectedPosY = FrameCANPosY+FrameCANHeight+10
Protected FrameSelectedWidth = WindowWidth-(10+FrameSelectedPosX)
Protected FrameSelectedHeight = 20+CreateCANHeight+10
Protected TracerPosX = FrameCANPosX
Protected TracerPosY = FrameSelectedPosY+FrameSelectedHeight+10
Protected TracerWidth = WindowWidth-(10+TracerPosX)
Protected TracerHeight = WindowHeight-(10+TracerPosY)
Protected ListPosX = TracerPosX+10
Protected ListPosY = TracerPosY+15
Protected ListWidth = TracerWidth-20
Protected ListHeight = TracerHeight-25
Protected Quotient.f = ListWidth/100
Protected ColumnWidth0 = Quotient* 8.77
Protected ColumnWidth1 = Quotient*12.28
Protected ColumnWidth2 = Quotient*10.53
Protected ColumnWidth3 = Quotient*12.63
Protected ColumnWidthRest = ListWidth-(ColumnWidth0 + ColumnWidth1 + ColumnWidth2 + ColumnWidth3)
Shared CAN_Message()
Shared SelectedMessage()
Shared CAN_Message$()
Shared ButtonGadgetNumber()
; window
If OpenWindow(#WINDOW_MAIN, 0, 0, WindowWidth, WindowHeight, "Beispiel", #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_SizeGadget)
; CAN_MESSAGE
Frame3DGadget(#CAN_MESSAGE, FrameCANPosX, FrameCANPosY, FrameCANWidth, FrameCANHeight, "CAN_MESSAGE")
createCANMessage(CAN_Message(), 10+FrameCANPosX, 30+FrameCANPosY, FrameCANWidth, 8, "", CAN_Message$())
; textgadget for CAN_Message
TextGadget(#CAN_MESSAGERECBYTESText, HalfFrameCANWidth-100, 20+FrameCANPosY, 100, 20, "Received Bytes:", #PB_Text_Center)
; stringgadget for CAN_Message
StringGadget(#CAN_MESSAGERECBYTESString, HalfFrameCANWidth, 20+FrameCANPosY, 75, 20, " " , #PB_Text_Center | #SS_SUNKEN)
; SELECTED_CAN_MESSAGE
Frame3DGadget(#SELECTED_CAN_MESSAGE, FrameSelectedPosX, FrameSelectedPosY, FrameSelectedWidth, FrameSelectedHeight, "SELECTED_CAN_MESSAGE")
createCANMessage(SelectedMessage(), 10+FrameSelectedPosX, 20+FrameSelectedPosY, FrameSelectedWidth, 8, " ", CAN_Message$())
; TRACER
Frame3DGadget(#TRACER, TracerPosX, TracerPosY, TracerWidth, TracerHeight, "TRACER")
ListIconGadget(#TRACERList, ListPosX, ListPosY, ListWidth, ListHeight, "No.", ColumnWidth0, #PB_ListIcon_FullRowSelect | #PB_ListIcon_GridLines)
AddGadgetColumn(#TRACERList,1,"Time (ms)",ColumnWidth1)
AddGadgetColumn(#TRACERList,2,"Identifier",ColumnWidth2)
AddGadgetColumn(#TRACERList,3,"Datalength",ColumnWidth3)
AddGadgetColumn(#TRACERList,4, "Data" ,ColumnWidthRest-4)
ButtonGadgetNumber(0) = ButtonGadget(#PB_Any,10, 10,70,20,"Button 43F",#PB_Text_Center)
ButtonGadgetNumber(1) = ButtonGadget(#PB_Any,10, 50,70,20,"Button 53F",#PB_Text_Center)
ButtonGadgetNumber(2) = ButtonGadget(#PB_Any,10, 90,70,20,"Button 63F",#PB_Text_Center)
ButtonGadgetNumber(3) = ButtonGadget(#PB_Any,10,130,70,20,"Button 7FF",#PB_Text_Center)
ButtonGadgetNumber(4) = ButtonGadget(#PB_Any,10,170,70,20,"Button 03F",#PB_Text_Center)
ButtonGadgetNumber(5) = ButtonGadget(#PB_Any,10,210,70,20,"Button 743",#PB_Text_Center)
ButtonGadgetNumber(6) = ButtonGadget(#PB_Any,10,250,70,20,"Button 753",#PB_Text_Center)
ButtonGadgetNumber(7) = ButtonGadget(#PB_Any,10,290,70,20,"Button 763",#PB_Text_Center)
ButtonGadgetNumber(8) = ButtonGadget(#PB_Any,10,330,70,20,"Button 703",#PB_Text_Center)
ButtonGadgetNumber(9) = ButtonGadget(#PB_Any,10,370,70,20,"Button 02F",#PB_Text_Center)
ButtonGadgetNumber(10) = ButtonGadget(#PB_Any,10,410,70,20,"Button 01F",#PB_Text_Center)
ButtonGadgetNumber(11) = ButtonGadget(#PB_Any,10,450,70,20,"Button 010",#PB_Text_Center)
ButtonGadgetNumber(12) = ButtonGadget(#PB_Any,10,490,70,20,"Button 013",#PB_Text_Center)
ButtonGadgetNumber(13) = ButtonGadget(#PB_Any,10,530,70,20,"Button 7EF",#PB_Text_Center)
Else
MessageRequester("ERROR!","Can't open Window!",#PB_Window_ScreenCentered|#PB_MessageRequester_Ok)
EndIf
EndProcedure
Procedure setMonitor(Map Message.MessageAttributes(), Identifier$)
Protected n
Protected AmountOfItems
For n=0 To 7
Message(Identifier$)\Databyte[n] = "DB"+Str(n)
Next
Message()\Datalength = 8
AmountOfItems = CountGadgetItems(#TRACERList)
;ClearGadgetItems(#TRACERList)
SetGadgetItemText(#TRACERList,-1,"Count",0)
SetGadgetItemText(#TRACERList,-1,"Period(ms)",1)
Debug "GetGadgetItemData(#TRACERList, 0) = " + Str(GetGadgetItemData(#TRACERList, 0)) ; hier liefert GetGadgetItemData immer 0
For n=0 To AmountOfItems
If GetGadgetItemData(#TRACERList, n) = Val( Chr(36) + Identifier$) ; schau, ob eintrag mit Identifier$ schon existiert
Message(Identifier$)\Count+1
SetGadgetItemText(#TRACERList, n, Str(Message(Identifier$)\Count), 0) ; update des Eintrags
SetGadgetItemText(#TRACERList, n, Str(Message()\Period), 1)
SetGadgetItemText(#TRACERList, n, Identifier$, 2)
SetGadgetItemText(#TRACERList, n, Str(Message()\Datalength), 3)
SetGadgetItemText(#TRACERList, n, Message()\Databyte[0] + " " + Message()\Databyte[1] + " " + Message()\Databyte[2] + " " + Message()\Databyte[3] + " " + Message()\Databyte[4] + " " + Message()\Databyte[5] + " " + Message()\Databyte[6] + " " + Message()\Databyte[7], 4)
ElseIf AmountOfItems-n = 0 ; Eintrag existiert noch nicht --> erstelle eintrag mit dem Identifier$
Message(Identifier$)\Count+1
AddGadgetItem(#TRACERList, -1, Str(Message(Identifier$)\Count) + Chr(10) + " " + Str(Message()\Period) + Chr(10) + " " + Identifier$ + Chr(10) + " " + Str(Message()\Datalength) + Chr(10) + Message()\Databyte[0] + " " + Message()\Databyte[1] + " " + Message()\Databyte[2] + " " + Message()\Databyte[3] + " " + Message()\Databyte[4] + " " + Message()\Databyte[5] + " " + Message()\Databyte[6] + " " + Message()\Databyte[7] + Chr(10))
SetGadgetItemData(#TRACERList, -1, Val(Chr(36) + Identifier$)) ; speichere Identifier$ zum späteren wiederfinden (in if-Bedingung)
EndIf
Next
EndProcedure
createMainWindow()
Repeat ; eventloop
Event = WaitWindowEvent(10)
EventWindow = EventWindow()
EventGadget = EventGadget()
Select Event
Case #PB_Event_Gadget
setMonitor(Message(),"53F")
Case #PB_Event_CloseWindow
EXIT = 1
EndSelect
Until EXIT
End
Gruss alDo
//EDIT: Formatierung des Codes angepasst