Benutzung von GetGadgetItemData und SetGadgetItemData

Anfängerfragen zum Programmieren mit PureBasic.
alDo
Beiträge: 41
Registriert: 28.01.2010 16:50
Wohnort: Hannover

Benutzung von GetGadgetItemData und SetGadgetItemData

Beitrag von alDo »

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)

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
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
Zuletzt geändert von alDo am 23.03.2010 15:06, insgesamt 1-mal geändert.
OS: Windows XP
PB: 4.40 (x86)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Benutzung von GetGadgetItemData und SetGadgetItemData

Beitrag von Kaeru Gaman »

die Länge der Codezeilen im Forum passt sich dynamisch an, wenn man Zeilenumbrüche gestattet.
also einfach nicht völlig ohne spaces arbeiten.

Code: Alles auswählen

          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) )
auch zuhause ist es besser lesbar, wenn man mit einem Dummy arbeitet.

Code: Alles auswählen

  TRACERListBody$ = Str(Message(Identifier$)\Count) + Chr(10) + "     "
  TRACERListBody$ + Str(Message()\Period) + Chr(10) + "     "
  TRACERListBody$ + Identifier$ + Chr(10) + "         "
  TRACERListBody$ + Str(Message()\Datalength) + Chr(10)
  TRACERListBody$ + Message()\Databyte[0] + "  " + Message()\Databyte[1] + "  "
  TRACERListBody$ + Message()\Databyte[2] + "  " + Message()\Databyte[3] + "  "
  TRACERListBody$ + Message()\Databyte[4] + "  " + Message()\Databyte[5] + "  "
  TRACERListBody$ + Message()\Databyte[6] + "  " + Message()\Databyte[7] + Chr(10) 
  AddGadgetItem(#TRACERList,-1, TRACERListBody$ )
entgegen anderslautenden Gerüchten ist das keine Todsünde.


... was deinen aktuellen Bug betrifft, hab ich noch nix gefunden, sorry...
blick ich so früh noch nich durch. *Kaffe schlürf*
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Benutzung von GetGadgetItemData und SetGadgetItemData

Beitrag von Kiffi »

was mir auf die Schnelle auffällt:
alDo hat geschrieben:

Code: Alles auswählen

SetGadgetItemData(#TRACERList,-1, ...
anders als bei AddGagetItem kann man hier keine -1 als Parameter
angeben. Hier musst Du den tatsächlichen Index angeben.

Code: Alles auswählen

SetGadgetItemData(#TRACERList, CountGadgetItems(#TRACERList) - 1, ...
Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Re: Benutzung von GetGadgetItemData und SetGadgetItemData

Beitrag von dysti »

alDo,
dieser Code erschließt sich mir nicht:

Code: Alles auswählen

AmountOfItems = CountGadgetItems(#TRACERList)
  ;ClearGadgetItems(#TRACERList)
  SetGadgetItemText(#TRACERList,-1,"Count",0)
  SetGadgetItemText(#TRACERList,-1,"Period(ms)",1)
.....und hier

Code: Alles auswählen

Debug "GetGadgetItemData(#TRACERList,0) = "+Str(GetGadgetItemData(#TRACERList,0))
fragst du immer den gleichen Eintrag ab.
Wie dem auch sei. Es kann ja auch nur 0 dort drin sein, weil ja auch nichts gespeichert worden ist.

Dann ändere diese Zeile

Code: Alles auswählen

setMonitor(Message(),"53F")
um in

Code: Alles auswählen

setMonitor(Message(),GetGadgetText(EventGadget ))
dann hat du schon mal die richtigen Einträge.

Nun zu deinem Verständnisproblem:

Code: Alles auswählen

SetGadgetItemText und SetGadgetItemData
Bei SetGadgetItemText wird der Text in einem Feld des Listicongadget sichtbar gespeichert.
Das ist der Text, den der Anwender auch sieht.
Bei SetGadgetItemData wird der Inhalt unsichtbar zu einem Feld des Listicongadget gespeichert.

Was heißt das im Einzelnen?
Wir erstellen mit dem Befehl "SetGadgetItemText" in einer Spalte vier Felder mit den Texten "a_eins","a_zwei","a_drei" und "a_vier".
Dann machen wir das Gleiche mit ""SetGadgetItemData" mit den Inhalten "0","1","2" und "3" und nennen wir diesen Inhalt mal UserIndex.
Der Anwender sieht nur z.B. "a_zwei".

Wenn wir jetzt eine Abfrage machen
mit GetGadgetItemText(Liste,Feld1) müßte als Ergebnis "a_zwei" und
mit GetGadgetItemData(Liste,Feld1) müßte als Ergebnis "1"
angezeigt werden.

Jetzt löschen wir das "Feld1". Was müßte jetzt als Ergebnis bei gleicher Abfrage kommen?
Antwort: "a_drei" und "3"
Soweit glaube ist es klar.
Aber nun kommt es. Der Index des Feldes hat sich geändert.
Hatte "a_drei" vorher den Index 2, hat er jetzt den Index 1
Nur durch die zusätzliche Zuordnung durch SetGadgetItemData bleibt der Userindex gleich, egal wo er steht

Zweites Beispiel:
Du hast 100 Datensätze erstellt.
Jetzt löscht du 50 Datensatze vom 30. Datensatz ab.
Der Listiconfeldindex 30 hat jetzt als Inhalt den ehemaligen Datensatz 81, aber durch den Data-Eintrag behält er den Index 81.

Ich hoffe es ist so anhand der Beispiele etwas klarer geworden.
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
alDo
Beiträge: 41
Registriert: 28.01.2010 16:50
Wohnort: Hannover

Re: Benutzung von GetGadgetItemData und SetGadgetItemData

Beitrag von alDo »

dysti hat geschrieben:dieser Code erschließt sich mir nicht:
Ist nur ein Beispielprogramm und ein kleiner Teil meines Hauptprogramms. Dafür sind die Zeilen später nötig(wahrscheinlich in einem anderen Programmteil, muss ich erst noch implementieren). Danke für die Erklärung dysti kann ich schon mal mehr mit anfangen als das was in der Hilfe steht.

@ Kaeru
Danke für den Tipp mit dem Dummy
entgegen anderslautenden Gerüchten ist das keine Todsünde.
Da hab ich aber ganz anderes gehört :wink:

@ Kiffi
Dein Tipp hat mich auf die richtige Spur gebracht und nach einigem Rumprobieren hab ich es hinbekommen :allright:

Neue Einträge werden jetzt bei mir oben eingefügt. Anhand der 'wegfallenden' Leerzeichen beim erneutem Druck auf einen Button sieht man, dass es richtig funktioniert.

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
       GadgetNumber(9) = TextGadget(#PB_Any, PosX, PosY, Len(Title$)*11, 20, Title$)                   ; TextGadget of the title
                         TextGadget(#PB_Any, PosX, 20+PosY, Length, 20, ID$, #PB_Text_Center)   ; TextGadget of ID
  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)   ; TextGadget of D0...D7
  Next
  
  ;stringgadgets
    GadgetNumber(8) = StringGadget(#PB_Any, PosX, 40 + PosY, Length, 20, "000", #PB_Text_Center | #SS_SUNKEN)   ; GadgetNumber(8) => StringGadget# of ID
  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)   ; GadgetNumber(0)...GadgetNumber(7) => StringGadget# of D0...D7
  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, "CAN-VIEWER TruSpec 04.812", #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget | #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 | #PB_ListIcon_MultiSelect | #PB_ListIcon_AlwaysShowSelection)
      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,"43F",#PB_Text_Center)
    ButtonGadgetNumber(1) = ButtonGadget(#PB_Any,10, 50,70,20,"53F",#PB_Text_Center)
    ButtonGadgetNumber(2) = ButtonGadget(#PB_Any,10, 90,70,20,"63F",#PB_Text_Center)
    ButtonGadgetNumber(3) = ButtonGadget(#PB_Any,10,130,70,20,"7FF",#PB_Text_Center)
    ButtonGadgetNumber(4) = ButtonGadget(#PB_Any,10,170,70,20,"03F",#PB_Text_Center)
    ButtonGadgetNumber(5) = ButtonGadget(#PB_Any,10,210,70,20,"743",#PB_Text_Center)
    ButtonGadgetNumber(6) = ButtonGadget(#PB_Any,10,250,70,20,"753",#PB_Text_Center)
    ButtonGadgetNumber(7) = ButtonGadget(#PB_Any,10,290,70,20,"763",#PB_Text_Center)
    ButtonGadgetNumber(8) = ButtonGadget(#PB_Any,10,330,70,20,"703",#PB_Text_Center)
    ButtonGadgetNumber(9) = ButtonGadget(#PB_Any,10,370,70,20,"02F",#PB_Text_Center)
    ButtonGadgetNumber(10) = ButtonGadget(#PB_Any,10,410,70,20,"01F",#PB_Text_Center)
    ButtonGadgetNumber(11) = ButtonGadget(#PB_Any,10,450,70,20,"010",#PB_Text_Center)
    ButtonGadgetNumber(12) = ButtonGadget(#PB_Any,10,490,70,20,"013",#PB_Text_Center)
    ButtonGadgetNumber(13) = ButtonGadget(#PB_Any,10,530,70,20,"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
  Protected DataByteBody$
  Protected TRACERListBody$
  
  For n=0 To 7
    Message(Identifier$)\Databyte[n] = "DB"+Str(n)
  Next
  
  Message()\Datalength = 8
  
  AmountOfItems = CountGadgetItems(#TRACERList)
  
  For n=0 To AmountOfItems
    If GetGadgetItemData(#TRACERList,n) = Val(Chr(36) + Identifier$)           ; schau, ob eintrag mit Identifier$ schon existiert
      DataByteBody$ = Message()\Databyte[0]+"  "+Message()\Databyte[1]+"  "
      DataByteBody$ + Message()\Databyte[2]+"  "+Message()\Databyte[3]+"  "
      DataByteBody$ + Message()\Databyte[4]+"  "+Message()\Databyte[5]+"  "
      DataByteBody$ + Message()\Databyte[6]+"  "+Message()\Databyte[7]
      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,DataByteBody$,4)
      ProcedureReturn
    ElseIf n = AmountOfItems                                              ; Eintrag existiert noch nicht --> erstelle eintrag mit dem Identifier$
      Message(Identifier$)\Count+1
      TRACERListBody$ = Str(Message(Identifier$)\Count) + Chr(10) + "     "
      TRACERListBody$ + Str(Message()\Period) + Chr(10) + "     "
      TRACERListBody$ + Identifier$ + Chr(10) + "         "
      TRACERListBody$ + Str(Message()\Datalength) + Chr(10)
      TRACERListBody$ + Message()\Databyte[0] + "  " + Message()\Databyte[1] + "  "
      TRACERListBody$ + Message()\Databyte[2] + "  " + Message()\Databyte[3] + "  "
      TRACERListBody$ + Message()\Databyte[4] + "  " + Message()\Databyte[5] + "  "
      TRACERListBody$ + Message()\Databyte[6] + "  " + Message()\Databyte[7] + Chr(10)
      AddGadgetItem(#TRACERList,0,TRACERListBody$)
      SetGadgetItemData(#TRACERList,0,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(),GetGadgetText(EventGadget ))
      
    Case #PB_Event_CloseWindow
      EXIT = 1
      
  EndSelect
  
Until EXIT
End

//EDIT: Formatierung des Codes angepasst
OS: Windows XP
PB: 4.40 (x86)
Antworten