Hallo,
dies solltest Du auf jeden Fall ändern. Zugriffe über Feldindexe sind zwar schneller als FieldByName, aber gefährlich. Denn wenn sich die uzugrunde liegende Datenmenge ändert (z.B. ein neues Feld im SELECT einer
Query oder Strukturerweiterung oder Verscheieben der persistenten Felder in der Feldliste), greifst Du ja auf ganz andere Felder zu als erwartet.
Eine andere Lösung wäre das Generieren benannter TField-Objekte zur Laufzeit oder persistent. Das liegt in der Geschwindigkeit zwischen FieldByName und FieldIndex, aber ist die sicherste Methode, da Dir schon der Compiler nicht vorhandene Felder meldet. Mit FieldByName kannst Du Dich ja immer noch beim Feldnamen vertippen.
Und zu Deiner zweiten Frage: Eigentlich unterstützen fast alle Feldtypen AsString. Nur bei Zuweisungen solltest Du damit vorsichtig sein, denn manche Strings können nicht umgewandelt werden (oft Floatfelder).