Probleme mit LinkedList

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Thomas
Beiträge: 893
Registriert: 06.07.2006 19:24
Wohnort: Regensburg
Kontaktdaten:

Probleme mit LinkedList

Beitrag von Thomas »

Hi,
ich hab im Moment ein Problem:
Ich soll für unseren Betrieb eine Ackerschlagkartei schreiben (ne ganz einfache, weil bei den gekauften immer so viel Schrott dabei ist, den man gar nicht braucht.)
Da häng ich jetzt aber irgendwie fest, denn wenn man im ListIcon z.B. nen Schlag (Fachbegriff für Feld) auswählt, tat er das nicht (Ich hatte es mit "SelectElement(...)" ausprobiert), deshalb hab ich es dann etwas umständlich gemacht.
Ihr werdet jetzt hergehen und sagen das erste Element im ListIcon ist das erste Element in der LinkedList, ..., geht aber nicht, weil sich das ganze auf verschiedene Jahre bezieht.
Na ja, seht euch das ganze mal an, ...; ich hoffe ihr könnt mir helfen, denn das mit dem abspeichern in der LinkedList hab ich eurer Meinung bestimmt etwas umständlich gemacht.

Hier der Link für den Code:
http://upload.npcfighter.de/files/36/492FCI.zip
v6.00
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Möglichkeit #1: Geh die LinkedList mir FOR/NEXT durch bis du das entsprechende Element gefunden hast

Möglichkeit #2: Speicher die Addresse des jeweiligen Elements direkt in den ListIcon items um mit ChangeElement() die Daten auszulesen
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

FOR/NEXT?

Habe mir das Problem nicht angesehen, vermute aber, dass es dasselbe Problem ist, wie ich schon mal hatte.

Wollte jedenfalls mal einbringen, dass FOREACH/NEXT einfacher ist, als FOR/NEXT. :D
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Die einfachste Möglichkeit ist die von Fluid Byte:

Code: Alles auswählen

SetGadgetItemData(#ListIcon, item, @LinkedList())
Du weist jeder Zeile in deinem ListIconGadget den Pointer zu dem
zugehörigen LinkedListElement zu. Und wenn du das LinkedList-Element zu
einem ListIcon-Element haben willst, liest du diesen Pointer wieder aus
wechselst mit ChangeCurrentElement dorthin oder weist dem Pointer eine
Struktur zu und bearbeitest die Daten direkt, also ohne zum
LinkedList-Element zu springen.

Hier ein unnützer Codeschnipsel: (Bitte nicht angewöhnen, so zu programmieren ;))

Code: Alles auswählen

Global NewList Entries.l()

OpenWindow(0, 0, 0, 400, 300, "Test", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
CreateGadgetList(WindowID(0))
ListIconGadget(0, 0, 0, 400, 300, "Spalte", 100, #PB_ListIcon_FullRowSelect)
AddGadgetColumn(0, 1, "LinkedList", 200)

For a = 0 To 99
  AddGadgetItem(0, a, Str(99 - a))
  
  AddElement(Entries())
  SetGadgetItemData(0, a, @Entries())  ;Weist dem Eintrag den Pointer zum LinkedList-Element zu
  Entries() = a
Next

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    
    Case #PB_Event_Gadget
      If EventGadget() = 0
        If EventType() = #PB_EventType_LeftDoubleClick  ;bei Doppelklick
          a = GetGadgetState(0)
          If a >= 0
            *l.Long = GetGadgetItemData(0, a)  ;nimm Wert aus LinkedList
            SetGadgetItemText(0, a, Str(*l\l), 1)  ;weise den Wert Spalte zwei zu
            *l\l + 1  ;erhöhe ihn um eins
          EndIf
        EndIf
      EndIf
  EndSelect
ForEver
Benutzeravatar
Thomas
Beiträge: 893
Registriert: 06.07.2006 19:24
Wohnort: Regensburg
Kontaktdaten:

Beitrag von Thomas »

Vielen Dank!
Jetzt hab ich wieder was dazugelehrnt. :D

Da fällt mir gerade noch ne Frage ein:
Wie kann man nen Cursor in PB erstellen? (aus nem Bitmap oder Icon, oder so)
v6.00
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 »

Erstellen ist in etwa so wie Icon erstellen, sehr kompliziert.
Nutzen: entweder standard Cursor:

Code: Alles auswählen

Debug LoadCursor_(0, #IDC_WAIT)
oder als Resource in Deiner Exe oder einer DLL

Code: Alles auswählen

Debug LoadCursor_(GetModuleHandle_(0), @Resourcename.s)
Infos:
http://msdn2.microsoft.com/en-us/library/ms648391.aspx
Aber vielleicht findeste noch was einfacheres im CodeArchiv

Gruß
Thomas
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
Antworten