Dann macht für mich allerdings keinen Sinn, warum der Integer i weiterhin geschrieben werden kann.
Setzt Delphi strings auf '' wenn sie out of scope gehen und bei Integern wird nur der Speicher nur für Wiederverwendung freigegeben, aber nicht auf 0 gesetzt?
Wenn das Zutrifft, ist es dann einfach nur Zufall, dass der Speicher des Integer einfach nicht wiederverwendet wurde und deshalb die Zahl die gleiche ist?
Nein. Was hier zum Tragen kommt nennt sich
Variablenbindung anonymer Methoden (Stichwort
Closure). Die Verwendung der Variablen innerhalb der anonymen Methode sorgt intern dafür, dass die Variable nicht wie üblich im lokalen Bereich der umgebenden Methode gespeichert wird, sondern in einem separaten Bereich, der im Scope der anonymen Methode(n) liegt.
In deinem Beispiel werden p und i im Closure erfasst weil sie als Variablen deklariert sind. Der Parameter wird zwar auch erfasst, ist aber eine Instanz einer TMessage-Klasse, die nach dem SendMessage wieder freigegeben wird. Daher enthält sie beim späteren Ausführen der Queue-Methode einen undefinierten Inhalt.