Einem GadgetItem mehrere Werte zuordnen.

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
kreeph
Beiträge: 98
Registriert: 24.02.2007 11:50

Beitrag 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! :)
Ich benutze PureBasic 3.30
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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)

Benutzeravatar
kreeph
Beiträge: 98
Registriert: 24.02.2007 11:50

Beitrag 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
Ich benutze PureBasic 3.30
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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. ;)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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
Zuletzt geändert von edel am 11.03.2007 16:47, insgesamt 1-mal geändert.
Benutzeravatar
kreeph
Beiträge: 98
Registriert: 24.02.2007 11:50

Beitrag 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 :)
Ich benutze PureBasic 3.30
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

sollte jetzt laufen.
Benutzeravatar
kreeph
Beiträge: 98
Registriert: 24.02.2007 11:50

Beitrag von kreeph »

jop das klappt jetzt super, danke :D
Ich benutze PureBasic 3.30
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten