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
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?

Schau mal nach SetWindowTimer.

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.