Hey! No me había dado cuenta de algo, en tu código pones
Código:
Field := TmyField.Create(Nil);
TField(Field) := TStringField.Create(Nil);
Field.FieldKind := (fkData);
Field.FieldName := 'NOMBRE';
Esto no está bien. En la primera línea creas un objeto TMyField y en la segunda vuelves a asignar a Field otro objeto (ahora un TStringField).
No sé qué intentabas hacer pero la primera referencia (a TMyField) se pierde de manera que Field, aunque esté declarado como TMyField es un TStringField,
que no tiene la propiedad Grid, de ahí que al tratar de usar Field.Grid se intente referenciar una propiedad inexistente y por tanto se genera el "Access Violation"
Si necesitas un StringField quizá te convenga más derivar tu clase de TStringField:
Código:
TMyField = class(TStringField)
...
end;
// Saludos