Das funktioniert nicht, weil der Typ Pointer ist, der in TList gespeichert ist. Und der geht nicht weich zu casten.
Grund: Mit as kannst du schauen, ob ein Objekt ein Klassentyp ist und wenn ja dorthin casten, wenn nein wird eine Exception geworfen. Ein Pointer ist aber kein Objekt. Deshalb musst du das hart auf TObject casten um Delphi zu sagen, dass es zumindest ein Objekt auf jeden Fall ist:
Delphi-Quelltext
1:
| (TObject(list.Items[i]) as TBestellPosten).Produkt.ProduktName |
Dann sollte die Prüfung mit as auch korrekt durchgeführt werden.
Warum benutzt du nicht einfach TObjectList oder gleich eine eigene typisierte Variante davon?