Seite 1 von 2
Überschreiben von Listenplätzen (?)
Verfasst: 29.05.2020 14:36
von Re57
Hallo, ich habe eine List() erstellt und frage sie hinterher wieder ab. Das funktioniert auch alles, wenn es da nur nicht das Problem gäbe, daß man bereits belegte Listenplätze nicht einfach überschreiben kann. Wenn ich das richtig verstanden habe, müßte ich dazu mit dem Befehl ChangeCurrentElement() arbeiten, allerdings ist die Erklärung dazu in der Hilfe für mich Bahnhof, denn ich weiß nichts von Zeigern und Pointern. Es geht mir jedenfalls darum, daß z.B. das Element 4 in der List() einen neuen Inhalt bekommen soll, während der bisher vorhandene Inhalt zugleich ausscheidet. Kann mir jetzt bitte mal jemand hier ein paar Code-Zeilen aufschreiben, wie man das richtig hinschreibt mit dem ChangeCurrentElement()? Aber bitte nichts mit ForEach-Next, ich will direkt jeden einzelnen Listenplatz separat ansprechen können. Ich hoffe, daß das überhaupt so geht mit ChangeCurrentElement(). Hier die Beispiel- List():
Code: Alles auswählen
Select schritt
Case 1
AddElement(Beispiel())
Beispiel() = zahl
Case 2
AddElement(Beispiel())
Beispiel() = zahl
Case 3
AddElement(Beispiel())
Beispiel() = zahl
Case 4
AddElement(Beispiel())
Beispiel() = zahl
Case 5
AddElement(Beispiel())
Beispiel() = zahl
Case 6
AddElement(Beispiel())
Beispiel() = zahl
Case 7
AddElement(Beispiel())
Beispiel() = zahl
EndSelect
Danke!
Re: Überschreiben von Listenplätzen (?)
Verfasst: 29.05.2020 14:40
von Kiffi
SelectElement() ist Dein Freund.
Code: Alles auswählen
EnableExplicit
NewList myList()
AddElement(myList()) : myList() = 1
AddElement(myList()) : myList() = 2
AddElement(myList()) : myList() = 3
ForEach myList()
Debug myList()
Next
SelectElement(myList(), 1) ; zweites Element wählen (0-basiert)
myList() = 99 ; zweites Element mit neuem Wert belegen
ForEach myList()
Debug myList()
Next
Re: Überschreiben von Listenplätzen (?)
Verfasst: 29.05.2020 15:43
von NicTheQuick
Was genau wolltest du uns eigentlich mit dem Select aus deinem ersten Post sagen? Das ist sehr redundant. Du kannst es auch einfach so schreiben:
Code: Alles auswählen
Select schritt
Case 1 To 7
AddElement(Beispiel())
Beispiel() = zahl
EndSelect
Oder so
Code: Alles auswählen
If schritt >= 1 And schritt <= 7
AddElement(Beispiel())
Beispiel() = zahl
EndIf
Re: Überschreiben von Listenplätzen (?)
Verfasst: 29.05.2020 15:48
von Derren
Das hast du doch letztens erst gefragt? Oder war das ein anderer User, der zufällige genau die gleiche Frage und genau den gleiche nicht-funktionierenden Code geposted hat
Re: Überschreiben von Listenplätzen (?)
Verfasst: 29.05.2020 16:03
von Re57
Danke Kiffi, aber löst nicht mein Problem. In meinem Programm sollen während des Arbeitens damit bestimmte Werte in die List() geschrieben werden. Es soll dann aber auch eine zurück-und neuschreiben-Funktion in das Programm. Um dann müßten die davon affektierten Listenelemente mit jeweils neuen Werten überschrieben werden können. Laut Debuggerausgabe ging das sogar, aber anschließend bei der Abfrage mit SelectElement() kamen dann doch falsche Werte an. Daraus hatte ich dann gefolgert, daß trotz richtiger Debugger-Ausgabe ein Neubelegen von Listenplätzen einfach nicht möglich ist, ohne vorher mit ClearList() die ganze Liste gelöscht zu haben, aber das scheidet natürlich aus.
@Derren
Der Code als solcher funktioniert (siehe oben) aber natürlich hatte ich jetzt nur ein sinngemäßes Beispiel hier eingestellt.
Re: Überschreiben von Listenplätzen (?)
Verfasst: 29.05.2020 16:13
von Kiffi
Zeig mal einen lauffähigen kurzen Beispielcode, der Dein Problem verdeutlicht.
Re: Überschreiben von Listenplätzen (?)
Verfasst: 29.05.2020 16:42
von NicTheQuick
Dein Code von oben zeigt gar nichts. Den kann man nicht mal in die IDE kopieren und ausführen.
Kiffis Beispiel zeigt wie es richtig geht und auch, dass es funktioniert. Da wir deinen restlichen Code aber nicht kennen, wissen wir nicht, wo dein Fehler in Wirklichkeit liegt.
Re: Überschreiben von Listenplätzen (?)
Verfasst: 29.05.2020 22:16
von Re57
Inzwischen jetzt habe ich nun einen Beispiel-Code erstellt, der zeigt, um welches Problem es mir geht. Das Beispiel zeigt 10 weiße Boxen nebeneinander.
1) Wenn man jetzt z.B. die letzten 3 Boxen nacheinander anklickt, also von links nach rechts gezählt die Boxen 8-10, werden deren Zahlenwerte 8, 9 und 10 in der List "Beispiel.i()" gespeichert. Dies wird auch gleich per Debugger bestätigt.
2) Durch das Drücken der Taste W (=Wiedergabe) kann man sich nun anzeigen lassen, daß die Boxen-Zahlenwerte ordnungsgemäß aus der List abgerufen und wiedergegeben werden.
3) Die Back-Taste wird gedrückt, welche bei jedem Drücken dafür sorgt, daß es jeweils einen Schritt zurück geht.
4) Es werden erneut weiße Boxen angeklickt, z.B. die Boxen 2-4. Diese Werte werden dann wieder erfolgreich in der List gespeichert und der Debugger zeigt das auch an.
5) Das Drücken der Taste W bringt dann die Ernüchterung: Jetzt tauchen nicht die neuen, sondern erneut die alten Werte auf, allerdings läßt dann die allerletzte Anzeige im Debugger etwas erahnen... und tatsächlich: Wenn die Endlosschleifen-Sperre kl2 aus dem Code entfernt wird, werden in der Wiedergabe abwechselnd die alten, dann die neuen und dann wieder die alten Werte angezeigt. Und dann stoppt auch noch die Debugger-Ausgabe, obwohl doch die Schleife ohne die Sperre eigentlich immer weiter laufen müßte (?) Hier der Code:
Code: Alles auswählen
#Flags = #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered
If InitMouse() = 0
MessageRequester("InitMouse fehlgeschlagen", "")
EndIf
If InitSprite() = 0
MessageRequester("InitSprite fehlgeschlagen", "")
EndIf
If InitKeyboard() = 0
MessageRequester("InitKeyboard fehlgeschlagen", "")
EndIf
If OpenWindow(1,0,0,800,412,"",#Flags) = 0
MessageRequester("OpenWindow fehlgeschlagen", "")
EndIf
If OpenWindowedScreen(WindowID(1),0,0,800,412) = 0
MessageRequester("OpenWindowedScreen fehlgeschlagen", "")
EndIf
StartDrawing(ScreenOutput())
Box(0,0,800,412,RGB(100,100,220)) ; gr. blaue Farbbox
StopDrawing(): FlipBuffers()
x = 21 ; Startpunkt linke obere Ecke
y = 302 ; Startpunkt linke obere Ecke
b = 22
h = 107 ; 107
For k = 1 To 10 ; wB.
StartDrawing(ScreenOutput())
Box(x,y,b,h,RGB(250,250,250))
StopDrawing()
x = x + 23
Next : FlipBuffers()
;____________________________________________________________________________________________________________________________________________________________________
NewList Beispiel.i()
kl1 = 1
kl2 = 1
kl3 = 1
Repeat
ExamineKeyboard()
Event = WaitWindowEvent()
Select Event
Case #PB_Event_LeftClick
kl1 = 1
wmx = WindowMouseX(1)
wmy = WindowMouseY(1)
Case #PB_Event_CloseWindow
schliessen = 1
EndSelect
If (wmx >= 21 And wmx <= 779) And (wmy > 302 And wmy < 408) And kl1 = 1
kl1 = 0
zahl = (wmx+2) / 23 ; steht für die Boxen 1 - 10
schritt = schritt + 1
Select schritt
Case 1
AddElement(Beispiel())
Beispiel() = zahl : Debug Beispiel()
Case 2
AddElement(Beispiel())
Beispiel() = zahl : Debug Beispiel()
Case 3
AddElement(Beispiel())
Beispiel() = zahl : Debug Beispiel()
Case 4
AddElement(Beispiel())
Beispiel() = zahl : Debug Beispiel()
Case 5
AddElement(Beispiel())
Beispiel() = zahl : Debug Beispiel()
Case 6
AddElement(Beispiel())
Beispiel() = zahl : Debug Beispiel()
Case 7
AddElement(Beispiel())
Beispiel() = zahl : Debug Beispiel()
Case 8
AddElement(Beispiel())
Beispiel() = zahl : Debug Beispiel()
Case 9
AddElement(Beispiel())
Beispiel() = zahl : Debug Beispiel()
Case 10
AddElement(Beispiel())
Beispiel() = zahl : Debug Beispiel()
EndSelect
EndIf
If KeyboardReleased(#PB_Key_W)
kl2 = 1
EndIf
; Taste W steht für Wiedergabe
If KeyboardPushed(#PB_Key_W) And kl2 = 1
kl2 = 0
For i = 1 To schritt
SelectElement(Beispiel(),i-1)
box = Beispiel() : Debug box
Next
EndIf
; Back-Taste erzeugt Schritt zurück
If KeyboardReleased(#PB_Key_Back)
kl3 = 1
EndIf
If KeyboardPushed(#PB_Key_Back) And kl3 = 1
kl3 = 0
schritt = schritt - 1
If schritt < 1
schritt = 1
EndIf
EndIf
Until schliessen = 1 Or KeyboardPushed(#PB_Key_F1)
End
Danke für Info.
Re: Überschreiben von Listenplätzen (?)
Verfasst: 30.05.2020 00:13
von Mijikai
Example that uses a List:
Code: Alles auswählen
EnableExplicit
;note: this is just a poc / some window elements are only drawn once and may not get restored!
Procedure.i Main()
Protected wnd.i
Protected wnd_flag.i
Protected wnd_msg.i
Protected index.i
Protected mx.i
Protected my.i
Protected Dim offset.i(9,1)
Protected NewList notes.i()
Protected list_view.i
Protected list_play.i
Protected button_back.i
Protected button_play.i
wnd_flag = #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget
wnd = OpenWindow(#PB_Any,#Null,#Null,640,420,#Null$,wnd_flag)
If wnd
AddWindowTimer(wnd,1,200)
list_view = ListViewGadget(#PB_Any,420,10,20,360)
list_play = ListViewGadget(#PB_Any,450,10,20,360)
button_back = ButtonGadget(#PB_Any,420,380,20,30,"<")
button_play = ButtonGadget(#PB_Any,450,380,20,30,">")
If StartDrawing(WindowOutput(wnd))
Box(10,10,400,400,$180B04)
For index = 0 To 9
offset(index,0) = 20 + (index * 25)
Box(offset(index,0),280,20,120,$FFFF88)
Box(offset(index,0) + 2,282,16,116,$302704)
Next
StopDrawing()
EndIf
Repeat
wnd_msg = WaitWindowEvent()
Select wnd_msg
Case #PB_Event_Gadget
Select EventGadget()
Case button_back;<- remove a note from the list
If ListSize(notes())
LastElement(notes())
DeleteElement(notes())
RemoveGadgetItem(list_view,0)
EndIf
Case button_play;<- replay all recorded notes
ClearGadgetItems(list_play)
ForEach notes()
AddGadgetItem(list_play,-1,Str(notes()))
Next
EndSelect
Case #PB_Event_Timer;<- this is just for a little animation
For index = 0 To 9
If offset(index,1) > 1
offset(index,1) - 1
ElseIf offset(index,1) = 1
If StartDrawing(WindowOutput(wnd))
Box(offset(index,0) + 2,282,16,116,$302704)
StopDrawing()
EndIf
offset(index,1) = 0
EndIf
Next
Case #PB_Event_LeftClick;<- check for mouse click
mx = WindowMouseX(wnd);<- get mouse position
my = WindowMouseY(wnd)
If my > 280 And my < 400;<- is the mouse inside a 'piano' button
For index = 0 To 9
If mx > offset(index,0) And mx < offset(index,0) + 20
If StartDrawing(WindowOutput(wnd));<- color the 'piano' button differentl if its pressed
Box(offset(index,0) + 2,282,16,116,$8D8D04)
StopDrawing()
EndIf
offset(index,1) = 2;<- mark the button for animation
LastElement(notes())
If AddElement(notes())
notes() = index;<- store the active note
AddGadgetItem(list_view,0,Str(index))
EndIf
Break
EndIf
Next
EndIf
Case #PB_Event_CloseWindow
Break
EndSelect
ForEver
CloseWindow(wnd)
EndIf
ProcedureReturn #Null
EndProcedure
Main()
End
Re: Überschreiben von Listenplätzen (?)
Verfasst: 30.05.2020 09:44
von Re57
Danke Mijikai, aber dafür bin ich leider nicht fortgeschritten genug mit PureBasic. Mit Prozedzuren z.B. konnte ich mich noch nie beschäftigen, weil, wenn ich Neuland erschließen will, kann ich mit so ein paar in der PureBasic-Hilfe hingeknallten Brocken nichts anfangen. Gut strukturiert ist die Hilfe allerdings schon. Vielleicht wird auch einfach mal PureBasic selber so verbessert, daß man Werte von Listenelementen genauso einfach neu belegen kann wie Werte bei gewöhnlichen Variablen, dann wäre dieser Thread ja gar nicht erst entstanden. Heute werde ich wiedermal kaum Zeit haben für PureBasic, aber ich bleibe irgendwie dran.