This is a very frequent pattern throughout my code:
SetLength(SomeDynamicArray, Length(SomeDynamicArray)+1);
SomeDynamicArray[High(SomeDynamicArray)] := NewE
MyList.Add(myobject);
IMO Dynamic arrays should only be used when at compile time you don't know the exact size of the array but at run time you will know.
If you need to continually manipulate your array size, you shouldn't be using an array but a TList or one of its descendants, as others have mentioned: TObjectList, TInterfaceList, TStringList.Objects[] can all be used (and abused) and there are some new ones as well, and TList for primitive types. TList used to be something of a pain before generics were introduced into Delphi - you had to work with pointers - but with generics: TList
Also, use the capacity property of any list you create - it will pre-allocate the given amount of memory so your code doesn't cause lots of memory to get juggled around every time you perform an operation on your list. (If you go beyond the capacity you allocated, memory manager will give you more memory at runtime- you wan't fail - see Delphi Help)