49

Is there a way in Delphi declaring an array of strings such as following one?

{'first','second','third'}

4 Answers 4

64

try this

Const
Elements =3;
MyArray  : array  [1..Elements] of string = ('element 1','element 2','element 3');
Sign up to request clarification or add additional context in comments.

3 Comments

thanks, thow i was hopping to avoid the use of Elements and let the Delphi calculate the size of the array.
You can avoid the Elements constant, but you have to declare the array size anyway. You can use the "short form" array[x] where x is an enumerated type, creating an array from the first to the last element of the type. The compiler does not support array[] = (1,2,3) calculating the array size and setting a 0..2 boundary automatically.
Brilliant, all this time I thought this wasn't possible :D
64

In XE7 you can declare a dynamic array constant like this:

const
  MyArray: TArray<String> = ['First','Second','Third'];

1 Comment

Please note that due to the compiler bug documented in RSP-21151 this currently doesn't work for class constants (fails with E2086 Type 'TArray<T>' is not yet completely defined), unless you add an additional: type TStringArray = TArray<string>; to your unit. | (Note that it must be in a separate type section to prevent the bug and that the workaround doesn't seem to work for generic classes. See the ticket for all details.)
23

You can use dynamic arrays and try this:

var
  FMyArray: TArray<string>;

function MyArray: TArray<string>;
begin
  if Length(FMyArray) = 0 then
    FMyArray := TArray<string>.Create('One', 'Two', 'Three');
  Result := FMyArray;
end;

While this does do a run-time initialization of a dynamic array on the heap, it also shows that Delphi supports a "pseudo-constructor" on dynamic arrays that allow in-place initialization. (NOTE: the above code isn't thread-safe).

Now all you need to do to find out the length of the array, is use the Length() standard function, or to find the allowed index range, use the Low() and High() standard functions.

If you're using an older version of Delphi, replace the TArray with your own dynamic-array string type such as:

type
  TStringArray = array of string;

4 Comments

true, that is valid, however it needs to be const and not runtime.
The elements are constant, only the array is not. Other than a startup cost, there is very little runtime overhead. Does it need to be const merely because of tradition or is there something specific to your case that requires const?
if the array is not const then the array could change. does not fit requirements. the idea is nice tho.
is there a reason not to make use of TStringDynArray? (instead of defining your own type)
3

You can do this in a indirect way. Create a function like:

procedure assignStringArray(var rasVelden: ArrayOfString; const asVeldenIn: Array Of String);
var
   iLengte, iT1: Integer;
begin
   iLengte := Length(asVeldenIn);
   SetLength(rasVelden, iLengte);
   for iT1 := iLengte-1 downto 0 do
      rasVelden[iT1] := asVeldenIn[iT1];
end;

and call this function like:

assignStringArray(asVelden, ['String1', 'String2', 'String3']);

where:

asVelden: ArrayOfString; 

1 Comment

It is indispensable to see such an array literal in action.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.