Seite 2 von 2

Re: Map() merkwürdiges Verhalten

Verfasst: 25.09.2024 20:22
von H.Brill
Axolotl hat geschrieben: 25.09.2024 17:22 Ich würde sagen, dass es kein aktuelles Element gibt, von dem der Schlüssel zurückgegeben wird. Kein aktuelles Element, dann Rückgabewert = Leerer String..
Das wäre z.B. möglich, wenn das erste Element oder ein einzelnes Element mit DeleteMapElement() gelöscht wird oder nach ResetMap() oder .....
Genau darum meine Rede von oben, es auch so zu benutzen, wie in der Hilfe steht.
Da käme schon gar keine Fehlermeldung, zumal Freds Funktionen ziemlich kugelsicher sind.
Kann ja auch sein, daß der Zeiger durch Lesen/Schreiben irgendwo anders im Code bewegt
worden ist, ob nun gewollt oder ungewollt.

Und wenn man die Elemente nicht einzeln in einer Schleife durchgehen will, steht ja auch noch
Ergebnis = FindMapElement(Map(), Key$)
zur Verfügung.

Re: Map() merkwürdiges Verhalten

Verfasst: 25.09.2024 21:40
von maddinvonfritz
Hallo, danke für die ganzen Tipps.
ThreadSave ist gesetzt.

Ich habe im TreeEx Module mal die Zeile mit CreateThread auskommentiert und seit dem läuft es. Warum weiß ich aber immer noch nicht so genau.

CreateThread ruft diese Funktion auf.

Code: Alles auswählen

    Procedure _TimerThread(Frequency.i)
    Define.i ElapsedTime
    
    Repeat
      
      If ElapsedTime >= Frequency
        PostEvent(#Event_Timer)
        ElapsedTime = 0
      EndIf
      
      Delay(100)
      
      ElapsedTime + 100
      
    Until TimerThread\Exit
    
  EndProcedure
Hier wird nur ein Event alle 100ms ausgelöst.

Die Event Funktion:

Code: Alles auswählen

  Procedure _AutoScroll()
    Define.i X, Y
    
    ForEach TreeEx()
      
      ForEach TreeEx()\ScrollBar\Item()
        
        If TreeEx()\ScrollBar\Item()\Timer
          
          If TreeEx()\ScrollBar\Item()\TimerDelay
            TreeEx()\ScrollBar\Item()\TimerDelay - 1
            Continue
          EndIf  
          
          Select TreeEx()\ScrollBar\Item()\Timer
            Case #ScrollBar_Up, #ScrollBar_Left
              TreeEx()\ScrollBar\Item()\Pos - 1
              If TreeEx()\ScrollBar\Item()\Pos < TreeEx()\ScrollBar\Item()\minPos : TreeEx()\ScrollBar\Item()\Pos = TreeEx()\ScrollBar\Item()\minPos : EndIf
            Case #ScrollBar_Down, #ScrollBar_Right
              TreeEx()\ScrollBar\Item()\Pos + 1
              If TreeEx()\ScrollBar\Item()\Pos > TreeEx()\ScrollBar\Item()\maxPos : TreeEx()\ScrollBar\Item()\Pos = TreeEx()\ScrollBar\Item()\maxPos : EndIf
          EndSelect
          
          
          
    		EndIf 
    		
      Next
      Redraw_()
    Next
    
  EndProcedure
Hier wird jedes Map Element durchgegangen. Am Ende der Prozedur dürfte TreeEx() auf keine Map mehr zeigen, was aber kein Problem sein dürfte weil die Prozedur ja im Hauptprogramm läuft und nicht im Thread.

Alle öffentlichen Prozeduren fangen mit

Code: Alles auswählen

If FindMapElement(TreeEx(), Str(GNum))
an. Damit ist ja wieder ein Map Element gesetzt.

Ich versuche mal am We ein Beispiel zu schreiben. Vielleicht geht mir dabei schon ein Licht auf. :)
Im ersten Post habe ich den Link vergessen. Es handelt sich um dieses Modul .

Re: Map() merkwürdiges Verhalten

Verfasst: 26.09.2024 01:23
von jacdelad
Du löst jetzt nicht wirklich ein Timer-Event mit einem Thread aus? :lol: Schau mal nach SetWindowTimer. :mrgreen: Sorry, aber ich musste lachen, ist nicht böse gemeint.

Ich helfe dir aber erst weiter, wenn du ein lauffähiges, also komplettes (Minimal-)Beispiel postest. Einzelne Funktionen hin oder her, ich kann hier nicht erkennen, wie deine Schleife funktionieren soll.

Re: Map() merkwürdiges Verhalten

Verfasst: 26.09.2024 07:29
von H.Brill
Kann ja manchmal auch an ganz banalen Dingen liegen.
z.b. eine fußgesteuerte Repeat Schleife, wo die Abbruchbedingung falsch gesetzt ist
und demnach die Schleife auf jeden Fall noch einmal durchlaufen wird, obwohl keine
gültigen Werte mehr vorhanden sind. Sowas passiert jedem von uns mal ab und an.

Re: Map() merkwürdiges Verhalten

Verfasst: 26.09.2024 11:17
von Lord
jacdelad hat geschrieben: 25.09.2024 16:08...
Das Problem habe ich nicht. Ich kann mir nur vorstellen, dass du, wie Nic schon anmerkte, Threads benutzt und sie nicht richtig absicherst. Kannst du ein Minimalbeispiel posten, was bei dir dieses falsche Verhalten zeigt?
Nope, keine Threads.
Das Programm läuft mit 6.10 ohne Dummy-Zuweisung, mit 6.11 nicht.
Ich hatte zwar kurz versucht, den Fehler zu isolieren, aber ohne Erfolg.
Da ich eine "Lösung" für mich gefunden habe und auch keinen Weg sehe,
mein 24k-Zeilen-Programm soweit einzudampfen, daß ein eventueller
Fehler gefunden werden kann, hatte und werde ich auf einen Fehlerreport
verzicht(et)en.

Re: Map() merkwürdiges Verhalten

Verfasst: 26.09.2024 14:28
von jacdelad
Ja das wäre gut. Vielleicht rufst du innerhalb der ForEach-Schleife eine Funktion auf, die den Zeiger der Map versetzt.
Ich hab's mit einem Minimalbeispiel probiert und es funktioniert. Auch meine größeren Programme machen alle keine Probleme. Ich denke nicht, dass es Bug vorliegt.

Re: Map() merkwürdiges Verhalten

Verfasst: 26.09.2024 16:00
von Axolotl
H.Brill hat geschrieben: 25.09.2024 20:22 ....
Und wenn man die Elemente nicht einzeln in einer Schleife durchgehen will, steht ja auch noch
Ergebnis = FindMapElement(Map(), Key$)
zur Verfügung.
Ja, wobei man bedenken muss, dass FindMapElement(Map(), Key$) nicht den aktuellen Schlüssel verändert, wenn der gesuchte Schlüssel nicht gefunden wird.
Siehe auch (erweitertes) Beispiel der Hilfe:

Code: Alles auswählen

  NewMap Country.s()

  Country("US") = "United States"
  Country("FR") = "France"
  Country("GE") = "Germany"

  If FindMapElement(Country(), "US")
    Debug "'US' is in the country list."
  Else
    Debug "'US' is NOT in the country list !"
  EndIf

  If FindMapElement(Country(), "UK")
    Debug "'UK' is in the country list."
  Else
    Debug "'UK' is NOT in the country list !"
  EndIf
  Debug "current key == " + Country() 
Und so sieht das Ergebnis aus

Code: Alles auswählen

 'US' is in the country list.
 'UK' is NOT in the country list !
 current key == United States  

Re: Map() merkwürdiges Verhalten

Verfasst: 26.09.2024 17:38
von jacdelad
Das ist richtig und wichtig. Wurde auch schon mehrfach diskutiert, weil ohne FindElement bei Zugriff der Schlüssel einfach erstellt wird, was für Anfänger nicht gleich ersichtlich ist.
Ich denke, dass hier aber ein anderes Problem vorliegt.