Wie fragt man Einzelwerte in einer List ab?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: Wie fragt man Einzelwerte in einer List ab?

Beitrag von Bisonte »

Re57 hat geschrieben:Vielen Dank für die beiden Codes, aber leider nutzen die mir beide nichts. Prozeduren gehen ja nicht in Repeat-Schleifen und außerdem habe ich mit Prozeduren auch noch nie gearbeitet. Solange es keine einfache Möglichkeit gibt, Arrays oder Listen erstellen und dann auch wieder abfragen zu können, kann ich darauf verzichten. Oder das Handbuch wird da endlich mal gescheit aufbereitet. Da ist wahrscheinlich bei den Erklärungen für List und Array null etwas nachbereitet worden seit PureBasic 4.00 Zeiten oder noch früher, das ist so schlichtweg nicht anbietbar.
Dann solltest du eventuell mal nicht nur die einzelnen Seiten "überfliegen", sondern Stück für Stück abarbeiten. Es sind diverse Beispiele dabei.
Prozedure gehen nicht in Repeat Schleifen.... Lustiger Satz.... Es werden Prozeduren dort aufgerufen, nicht erstellt...
Eventuell solltest du das Anfänger-Kapitel nicht einfach so überspringen....
Die Hilfe ist eigentlich auch für "nicht Programmierer" nachvollziehbar. Aber nur wenn man sie auch liest !

Liste erstellen : NewList
Listenelement hinzufügen : AddElement()
Listen Iteration : ForEach Next

usw....
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Wie fragt man Einzelwerte in einer List ab?

Beitrag von Mijikai »

Also entweder sind alle Antworten falsch oder ich versteh das Problem nicht :coderselixir:
Evtl. hilft eine erneute Schilderung des Problems.
Re57
Beiträge: 43
Registriert: 10.04.2020 12:19

Re: Wie fragt man Einzelwerte in einer List ab?

Beitrag von Re57 »

Danke für die weiteren Hinweise. Ich stelle jetzt mal einen kleinen Code hier ein, wobei einfach nur auf eine schwarze Fläche geklickt wird und dann werden Zufallswerte in die List eingetragen. Zum Schluß werden die dann über ForEach()-Next wieder abgerufen. OK, aber wie kann ich denn nun ganz gezielt z.B. nur den zweiten Eintrag in der List anzeigen lassen? Genau um diese Möglichkeit geht es mir. Jeden beliebigen Wert in der List möchte ich gerne separat abfragen können. Danke.

Code: Alles auswählen

#Window1 = 1
#Flags = #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered

If InitSprite() = 0
  MessageRequester("InitSprite fehlgeschlagen", "Programm endet")
EndIf  

If InitMouse() = 0
  MessageRequester("InitMouse fehlgeschlagen", "Programm endet")
EndIf 

If OpenWindow(1,0,0,800,412,"",#Flags) = 0
  MessageRequester("OpenWindow fehlgeschlagen", "Programm endet")
EndIf

If OpenWindowedScreen(WindowID(1),0,0,800,412) = 0
  MessageRequester("OpenWindowedScreen fehlgeschlagen", "Programm endet")
EndIf

Repeat
  ExamineMouse() : ReleaseMouse(#True) 
  event = WaitWindowEvent()
  
  Select Event    
    Case #PB_Event_CloseWindow
    schliessen = 1
  EndSelect



  NewList List.i()
  
  If event = #WM_LBUTTONDOWN
    stp = stp + 1
    random = Random(9)
    
    Select stp
      Case 1
        AddElement(List())
        List() = random
      Case 2
        AddElement(List())
        List() = random
      Case 3
        AddElement(List())
        List() = random
    EndSelect
  EndIf
  
  ForEach List()
    Debug (List())
  Next



Until schliessen = 1
End
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Wie fragt man Einzelwerte in einer List ab?

Beitrag von Kiffi »

kleiner Tipp: Mit NewList() erstellst Du eine neue Liste.
Hygge
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Wie fragt man Einzelwerte in einer List ab?

Beitrag von Mijikai »

Re57 hat geschrieben:... aber wie kann ich denn nun ganz gezielt z.B. nur den zweiten Eintrag in der List anzeigen lassen? ...
Mit SelectElement() wenn es eine Liste ist oder über den Array Index wenn es ein Array ist.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Wie fragt man Einzelwerte in einer List ab?

Beitrag von NicTheQuick »

Von welchem Handbuch sprichst du eigentlich? Meinst du die Purebasic-Hilfe damit?

Kiffi hat dir einen wichtigen Tipp gegeben. Wenn du in deiner Hauptschleife immer wieder NewList schreibst, dann wird sie jedes mal auch wieder geleert.
Hier ein Beispiel.
Falsch:

Code: Alles auswählen

For i = 1 To 10
	NewList b()
	AddElement(b())
	b() = i
	Debug "Zeige Liste"
	ForEach b()
		Debug b()
	Next
Next
Richtig:

Code: Alles auswählen

NewList b()
For i = 1 To 10
	
	AddElement(b())
	b() = i
	Debug "Zeige Liste"
	ForEach b()
		Debug b()
	Next
Next
Bild
Re57
Beiträge: 43
Registriert: 10.04.2020 12:19

Re: Wie fragt man Einzelwerte in einer List ab?

Beitrag von Re57 »

Daß NewList() die Liste leert, war in der Tat ein ganz wichtiger Tipp und mittlerweile habe ich jetzt verstanden, wie man die Liste mit SelectElement() abfragt. Danke nachmals an alle! Ich stelle jetzt mal meinen aktualisierten Code hier ein:

Code: Alles auswählen

#Flags = #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered

If InitSprite() = 0
  MessageRequester("InitSprite fehlgeschlagen", "Programm endet")
EndIf  

If InitMouse() = 0
  MessageRequester("InitMouse fehlgeschlagen", "Programm endet")
EndIf 

If OpenWindow(1,0,0,800,412,"",#Flags) = 0
  MessageRequester("OpenWindow fehlgeschlagen", "Programm endet")
EndIf

If OpenWindowedScreen(WindowID(1),0,0,800,412) = 0
  MessageRequester("OpenWindowedScreen fehlgeschlagen", "Programm endet")
EndIf


NewList List.i()

Repeat
  ExamineMouse() : ReleaseMouse(#True) 
  event = WaitWindowEvent()
  
  Select Event    
    Case #PB_Event_CloseWindow
    schliessen = 1
    
    Case #WM_LBUTTONDOWN
    kl = 1
  EndSelect
  
  
    If event = #WM_LBUTTONDOWN And kl = 1
      kl = 0
      stp = stp + 1
      a = a + 10
      
        Select stp
          Case 1
            AddElement(List())
            List() = a
          Case 2
            AddElement(List())
            List() = a
          Case 3
            AddElement(List())
            List() = a
          Case 4
            AddElement(List())
            List() = a
          Case 5
            AddElement(List())
            List() = a
        EndSelect

        If stp <= 5
          SelectElement(List(),stp-1)
          Debug (List())
        EndIf
    EndIf
  
   
Until schliessen = 1
End
Ich habe aber jetzt trotzdem noch eine weitere Frage:
Wie kommt es, daß die Werte nach jedem klicken so langsam kommen, wenn die Maus immer auf derselben Position bleibt, während sie ungleich schneller kommen, wenn man die Maus beim Klicken zugleich bewegt? Und wie kann man erreichen, daß das auch bei unbewegter Maus wesentlich schneller geht?
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Wie fragt man Einzelwerte in einer List ab?

Beitrag von NicTheQuick »

Das liegt daran, dass deine Hauptschleife nicht korrekt geschrieben ist. Außerdem mischst du Window-Events mit Screen-Events, was eh schon fragwürdig ist. Es gibt auch keinen Grund die Windows-Konstanten #WM_LBUTTONDOWN zu nutzen, wenn es dafür Purebasic-eigene Konstanten wie #PB_Event_LeftClick gibt.

Ich vermute du hast deinen Code aus irgendeinem uralten Tutorial oder Handbuch, was veraltete Konstrukte nutzt. Außerdem machst du zuerst ein InitMouse() und ExamineMouse(), nutzt es aber gar nicht, weil du die Maus direkt wieder mit ReleaseMouse(#True) freigibst, damit du die Klicks auch als Events kriegst.

Also entweder du nutzt ausschließlich ExamineMouse(), MouseX(), MouseButton() und Co aus der Mouse-Library oder du nutzt ausschließlich das Event-System mit WindowMouseX() und WindowMouseY().
Bild
Re57
Beiträge: 43
Registriert: 10.04.2020 12:19

Re: Wie fragt man Einzelwerte in einer List ab?

Beitrag von Re57 »

Von #PB_Event_LeftClick wußte ich bisher noch gar nichts, aber das werde ich natürlich genauso im Auge behalten wie deine weiteren Erklärungen. Im Moment habe ich zwar keine Zeit, mich damit zu beschäftigen, aber das kommt noch heute bei mir auf die Agenda. Evtl. merkt man mir ja an, daß meine PureBasic-Kenntnisse aus PB 4.00 Zeiten kommen und natürlich hat sich seitdem viel verändert. Eine Ausbildung zum Programmier hatte ich nicht, da ist es kaum zu vermeiden, daß mal Schwierigkeiten auftauchen. Auf jeden Fall vielen Dank für Deine Anregungen, ich hoffe, daß ich das später dann umsetzen kann.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Wie fragt man Einzelwerte in einer List ab?

Beitrag von NicTheQuick »

Es hilft auch immer sehr zu wissen, was dein eigentliches Ziel ist. Nicht selten ist man auf dem falschen Weg zum Ziel, ohne es zu bemerken. Ich will dir auch gar nichts unterstellen, aber mehr Informationen helfen laut meiner Erfahrung trotzdem, ein Problem wesentlich schneller zu lösen.
Bild
Antworten