As far as I know, SetLength is always a good idea and better than using a dynamic struc with pointers, etc.
Or you can use a TList and cast the elements (or a TStrings.Objects if you want a nice text index).
Why do you think that SetLength is bad?
Cheers