Seite 2 von 2

Verfasst: 10.03.2007 19:58
von kreeph
Hi und danke erstmal für die Antworten :D

Wie ich mir das genau vorstelle wäre ein ListViewGadget mit verschiedenen Einträgen. Wenn man einen Eintrag anwählt, werden in drei oder mehr Fenstern verschiedene Werte angezeigt, die sich auf das GadgetItem beziehen.

Bei meinem 3.30er PureBasic hab ich das so stehen:

Code: Alles auswählen

SendMessage_(GadgetID(#Gadget),#LB_SETITEMDATA,Position,(Wert))
Damit kann ich aber nur einen Wert zuordnen und jetzt möchte ich aber mehrere haben. Kann man das überhaupt?
Danke schonmal! :)

Verfasst: 10.03.2007 20:11
von ts-soft
Dem ListIconGadget kannste mehrere Werte zuordnen. Einzelne Werte sind
in PB 3.30 durch Chr(10) zu trennen, wenn ich mich recht erinnere.

Verfasst: 10.03.2007 22:00
von edel
kreeph hat geschrieben:Bei meinem 3.30er PureBasic hab ich das so stehen:

Code: Alles auswählen

SendMessage_(GadgetID(#Gadget),#LB_SETITEMDATA,Position,(Wert))
Damit kann ich aber nur einen Wert zuordnen und jetzt möchte ich aber mehrere haben. Kann man das überhaupt?
Danke schonmal! :)
Ja das geht , aber eben nur ueber einen Pointer.

Code: Alles auswählen


Structure Item
  item1.s
  item2.s
  item3.s
EndStructure

#LB_ERR = -1

*mem.Item = AllocateMemory(SizeOf(Item))

*mem\item1 = "1"
*mem\item2 = "2"
*mem\item3 = "3"

SendMessage_(GadgetID(#Gadget),#LB_SETITEMDATA,Position,*mem)
*Item.Item = SendMessage_(GadgetID(#Gadget),#LB_GETITEMDATA,Position,0)

If *Item <> #LB_ERR
  Debug *Item\item1
  Debug *Item\item2
  Debug *Item\item3
EndIf 

freememory(*item)


Verfasst: 10.03.2007 22:49
von kreeph
Ok ich habe probier den code in mein programm einzubauen aber habe irgentwie versagt :(

Code: Alles auswählen

#WindowWidth  = 200
#WindowHeight = 200
If OpenWindow(0, 100, 100, #WindowWidth, #WindowHeight, #PB_Window_MinimizeGadget, "Mehrere Werte Gadget")
  If CreateGadgetList(WindowID())

    StringGadget(#10,70,50,30,20,"W 1",#PB_String_ReadOnly); Wert 1
    StringGadget(#12,103,50,30,20,"W 2",#PB_String_ReadOnly);Wert 2
    ListViewGadget(#7,10,85,60,60)
    ListViewGadget(#4,10,10,60,60)
    ButtonGadget(#6,80, 10, 50, 20, "Hinzufügen")
    AddGadgetItem(4, 0, "Nr1")
    SendMessage_(GadgetID(4),#LB_SETITEMDATA,0,(125))

  EndIf

  Repeat
    EventID = WaitWindowEvent()
    Select EventGadgetID()

      Case 6
        State = GetGadgetState(4)
        AddGadgetItem(7,-1,GetGadgetItemText(4,State,4))
        SendMessage_(GadgetID(7),#LB_SETITEMDATA,CountGadgetItems(7)-1,SendMessage_(GadgetID(4),#LB_GETITEMDATA,State,4))
        For i=0 To CountGadgetItems(7)-1
          Punkte + SendMessage_(GadgetID(7),#LB_GETITEMDATA,i,4)
          SetGadgetText(10, Str(Punkte) + " Punkte") : Punkte = 0
        Next

      Case 7
        If EventType() = 2
          State = GetGadgetState(7)
          If State ! -1
            RemoveGadgetItem(7,State)
            For i=0 To CountGadgetItems(7)-1
              Punkte + SendMessage_(GadgetID(7),#LB_GETITEMDATA,i,4)
            Next
            SetGadgetText(10,Str(Punkte) + " Punkte") : Punkte = 0
          EndIf
        EndIf

    EndSelect

  Until EventID = #PB_EventCloseWindow

EndIf

End
In W 1 soll der erste Wert stehen und in W 2 der Zweite. Könntet ihr mir da vllt ein Beispiel geben oder das nochmal erklären? :mrgreen:
urzeit klapp es aber nur mit dem ersten Wert.

p.s. hoffe es stört nicht, dass ich meinen code hier poste wenn er schon ein bisschen lang ist :mrgreen:

hab mir mal erlaubt den Code etwas einzurücken, liest sich besser, ts-soft

Verfasst: 10.03.2007 23:04
von Kaeru Gaman
> p.s. hoffe es stört nicht, dass ich meinen code hier poste wenn er schon ein bisschen lang ist

der ist doch nicht lang. ;)
ne, kein problem. nur in zukunft bitte einrücken.
wollte ich auch grad korrigieren, aber ts ist mir zuvorgekommen. :mrgreen:


...ein problem was mit hier sofort auffällt, ist das #10, #12, #7, #4, #6
mit nem lattenzaun davor ist das ne konstante.
als reine zahlen hinter dem lattenzaun sollte das eigentlich garnicht funktionieren...

also, entweder konstanten mit enumeration erstellen, oder aber absolute zahlen verwenden. ;)

Verfasst: 10.03.2007 23:15
von edel
@kg
waere nett wenn du die Syntax mal eben pruefen koenntest, habe kein 3.3.


3.3

Code: Alles auswählen

Structure ItemStruct
  item1.l
  item2.l
EndStructure

#win  = 0
#lb   = 0
#str1 = 1
#str2 = 2

hwnd = OpenWindow(#win,0,0,200,200,#PB_Window_MinimizeGadget,"")

CreateGadgetList(hwnd)
ListViewGadget(#lb,0,0,100,300)
StringGadget(#str1,105,5,80,23,"")
StringGadget(#str2,105,35,80,23,"")

AddGadgetItem(#lb,-1,"item 1")
AddGadgetItem(#lb,-1,"item 2")

*item1.ItemStruct = AllocateMemory(0, SizeOf(ItemStruct), 0)
*item1\item1 = 10
*item1\item2 = 20

*item2.ItemStruct = AllocateMemory(1, SizeOf(ItemStruct), 0)
*item2\item1 = 33
*item2\item2 = 5

SendMessage_(GadgetID(#lb),#LB_SETITEMDATA,0,*item1)
SendMessage_(GadgetID(#lb),#LB_SETITEMDATA,1,*item2)

Repeat
  event = WaitWindowEvent()
  
  If event = #PB_EventGadget
    If EventGadgetID() = 0
      SelItem = GetGadgetState(#lb)
      *SelectItem.ItemStruct = SendMessage_(GadgetID(#lb),#LB_GETITEMDATA,SelItem,0)
      SetGadgetText(#str1,Str(*SelectItem\item1))
      SetGadgetText(#str2,Str(*SelectItem\item2))
    EndIf
  EndIf
  
Until event = #PB_EventCloseWindow

4.0

Code: Alles auswählen

Structure Item
  item1.l
  item2.l
EndStructure

#win  = 0
#lb   = 0
#str1 = 1
#str2 = 2

hwnd = OpenWindow(#win,0,0,200,200,"",#PB_Window_MinimizeGadget)

CreateGadgetList(hwnd)
ListViewGadget(#lb,0,0,100,300)
StringGadget(#str1,105,5,80,23,"")
StringGadget(#str2,105,35,80,23,"")

AddGadgetItem(#lb,-1,"item 1")
AddGadgetItem(#lb,-1,"item 2")

*item1.Item = AllocateMemory(SizeOf(Item))
*item1\item1 = 10
*item1\item2 = 20

*item2.Item = AllocateMemory(SizeOf(Item))
*item2\item1 = 33
*item2\item2 = 5

SetGadgetItemData(#lb,0,*item1)
SetGadgetItemData(#lb,1,*item2)

Repeat
  event = WaitWindowEvent()
  
  If event = #PB_Event_Gadget
    If EventGadget() = 0
      SelItem = GetGadgetState(#lb)
      *SelectItem.Item = GetGadgetItemData(#lb,SelItem)
      SetGadgetText(#str1,Str(*SelectItem\item1))
      SetGadgetText(#str2,Str(*SelectItem\item2))
    EndIf
  EndIf
  
Until event = #PB_Event_CloseWindow

Verfasst: 11.03.2007 11:44
von kreeph
Danke wieder für die Antwort :)
Bei dem 3.30er Code klappt es jatzt fast nur bei Zeile 38 Komm eine Fehlermeldung: Structure not found: Item.
Ich weiß jetzt nich ob das einfach zu schwer für mich ist oder ich zu dumm bin eure Beispiel-codes zu verstehen :( .

Naja ich hoffe das Problem lässt sich bald lösen :)

Verfasst: 11.03.2007 16:47
von edel
sollte jetzt laufen.

Verfasst: 11.03.2007 17:57
von kreeph
jop das klappt jetzt super, danke :D

Verfasst: 11.03.2007 19:44
von AND51
edel hat geschrieben:
AND51 hat geschrieben:Wird aber nicht gehen, denn ich versuchte schon mal, den Pointer zu einer strukturierten Liste einem GadgetItem zuzuordnen. Der Befehl ChangeElement(liste(), GetGadgetItemData()) funktioniert aber nicht.
Natuerlich geht das, du musst nur den richtigen Pointer nehmen.
Hallo! Ich habe einen kurzen Beispielcode zusammengebastelt, der meine Vorgehensweise wiederspiegelt:

Code: Alles auswählen

AddGadgetItem(#Listicon, -1, "Entry")

NewList Coords.Point()

AddElement(Coords())
	Coords()\x=1024
	Coords()\y=768

*pointer=@Coords()
SetGadgetItemData(#Listicon, 0, *pointer)

AddElement(Coords())

ChangeCurrentElement(Coords(), GetGadgetItemData(#Listicon, 0))
Es wird eine strukturierte LinkedList erzeugt, dessen Pointer auf das erste Element als 'Data' in den ersten, dem ListIconGadget zugefügten Eintrag gespeichert wird.
Zur Sicherheit, damit sich das aktuelle element der LinkedList verändert, lege ich ein zweites Element (leer, das reicht) an.
Danach lese ich den 'Data'-Wert des ersten GadgetItems von #Listicon wieder ein und übergebe das Ergebnis an ChangeCurrentElement().
Normalerweise müsste, wenn ich das nun aktuelle Element debuggen lasse, die Werte 1024 und 768 ausgegeben werden. Aber das war bei mir nie der Fall, es kam immer irgendwelcher Quatsch heraus.

Ich weiß nicht, was ich falsch gemacht habe, aber man muss auch dazu sagen, dass dieses beispiel bei mir noch von einer For-Schleife umgeben war, die zahlreiche andeere Aufgaben noch mit erledigte, etc. Möglicherweise habe ich einfach den Überblick verloren...? Jedenfalls habe ich den Fehler nicht gefunden.