Aktuelle Zeit: 09.07.2020 11:05

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Überschreiben von Listenplätzen (?)
BeitragVerfasst: 29.05.2020 14:36 
Offline

Registriert: 10.04.2020 12:19
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:
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!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Überschreiben von Listenplätzen (?)
BeitragVerfasst: 29.05.2020 14:40 
Offline
Benutzeravatar

Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9
SelectElement() ist Dein Freund.

Code:
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

_________________
Schrödingers Smiley :):


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Überschreiben von Listenplätzen (?)
BeitragVerfasst: 29.05.2020 15:43 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
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:
Select schritt
   Case 1 To 7
      AddElement(Beispiel())
      Beispiel() = zahl
EndSelect

Oder so
Code:
If schritt >= 1 And schritt <= 7
   AddElement(Beispiel())
   Beispiel() = zahl
EndIf

_________________
Ubuntu Gnome 20.04 LTS x64, PureBasic 5.72 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50, 5.60, 5.71b2)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Überschreiben von Listenplätzen (?)
BeitragVerfasst: 29.05.2020 15:48 
Offline
Benutzeravatar

Registriert: 23.07.2011 02:08
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

_________________
Signatur und so


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Überschreiben von Listenplätzen (?)
BeitragVerfasst: 29.05.2020 16:03 
Offline

Registriert: 10.04.2020 12:19
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Überschreiben von Listenplätzen (?)
BeitragVerfasst: 29.05.2020 16:13 
Offline
Benutzeravatar

Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9
Zeig mal einen lauffähigen kurzen Beispielcode, der Dein Problem verdeutlicht.

_________________
Schrödingers Smiley :):


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Überschreiben von Listenplätzen (?)
BeitragVerfasst: 29.05.2020 16:42 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
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.

_________________
Ubuntu Gnome 20.04 LTS x64, PureBasic 5.72 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50, 5.60, 5.71b2)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Überschreiben von Listenplätzen (?)
BeitragVerfasst: 29.05.2020 22:16 
Offline

Registriert: 10.04.2020 12:19
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:
#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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Überschreiben von Listenplätzen (?)
BeitragVerfasst: 30.05.2020 00:13 
Offline
Benutzeravatar

Registriert: 25.09.2016 01:42
Example that uses a List:
Code:
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

_________________

Links:
PureBasic Discord
[INCLUDE] GLFW 3.3 Library
[MODULE] Bass Library 2.4 (Win)
[LIBRARY] Hexi Binary2Hex (Win)



Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Überschreiben von Listenplätzen (?)
BeitragVerfasst: 30.05.2020 09:44 
Offline

Registriert: 10.04.2020 12:19
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.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ]  Gehe zu Seite 1, 2  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye