If the strings are not known until run time, the most efficient way is to allocate a large block of storage, and move the strings in end-to-end, using a separate array to hold either pointers or indices into the large block.
When the block is full, allocate another large block using New. There are two ways to manage the storage. (1) Extension block method: Use a second array to point to the set of large blocks. Each string will be accessed using two pointers or two indices. The first will point to the particular block, and the second will point to the string within the block. (2) Single block method: Make the new block twice as large as the previous block, move the existing strings into the new block and then Dispose the old block.
Very convoluted. A linked list or string collection would do just fine.
In my earlier response to this post, I should have asked how you allocated storage for that linked list or string collection. My suggestions deal mainly with storage allocation. Within the blocks you could choose to have a linked lis or a tree structure if you so chose. As I have pointed out before, storage management and data access are separate issues.
Frank Rubin