I didn't catch the second setlength in the code. I was simply answering about the use of a with with arrary of record type. That said, I would never change the root of the with (pointer, setlength, etc) within the with it self.
And yes, it can get you into trouble whith Left's and Name's, and visible and such. So you need to be careful. However, when you are creating your own record types which in many cases will have unique names, I see no issue with using with statements.
The choice is yours...