for z:=Length(Kontaktliste)-1 downto 0 do
Mein zweites Array wird nun verkürzt, aber das letzte Element aus dem ersten Array nimmt es noch immer nicht mit.
Du benutzt immer
Kontaktliste_2[z].Anrede := Kontaktliste[z].Anrede;
etc., aber bis zu dem zu löschenden Eintrag muss es lauten
Kontaktliste_2[z - 1].Anrede := Kontaktliste[z].Anrede;
. Der Index muss dort ja dort unterschiedlich sein, da ein Element "fehlt".
Edit: Und setze die Länge besser vor der Schleife mit
SetLength(Kontaktliste_2, Length(Kontaktliste)-1);