Создать постоянный массив строк

34

Есть ли способ в Delphi объявить массив строк, например следующий?

{'first','second','third'}
Теги:
arrays
const

4 ответа

42
Лучший ответ

попробуйте это

Const
Elements =3;
MyArray  : array  [1..Elements] of string = ('element 1','element 2','element 3');
  • 1
    спасибо, что я прыгал, чтобы избежать использования элементов и позволить Delphi вычислить размер массива.
  • 4
    Вы можете избежать константы Elements, но вы все равно должны объявить размер массива. Вы можете использовать массив «short form» [x], где x - перечислимый тип, создавая массив от первого до последнего элемента типа. Компилятор не поддерживает array [] = (1,2,3), вычисляющий размер массива и устанавливающий границу 0..2 автоматически.
Показать ещё 1 комментарий
30

В XE7 вы можете объявить константу динамического массива следующим образом:

const
  MyArray: TArray<String> = ['First','Second','Third'];
  • 5
    Это отличная особенность. Почти заставил меня хотеть обновить!
  • 0
    Это спасло мой день. Благодарю.
Показать ещё 1 комментарий
14

Вы можете использовать динамические массивы и попробовать следующее:

var
  FMyArray: TArray<string>;

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

В то время как это делает инициализацию динамического массива в куче во время выполнения, он также показывает, что Delphi поддерживает "псевдоконструктор" на динамических массивах, которые позволяют выполнять инициализацию на месте. (ПРИМЕЧАНИЕ: вышеуказанный код не является потокобезопасным).

Теперь вам нужно всего лишь выяснить длину массива, использовать стандартную функцию Length() или найти разрешенный индексный диапазон, использовать стандартные функции Low() и High().

Если вы используете более старую версию Delphi, замените TArray на свой собственный тип строки динамического массива, например:

type
  TStringArray = array of string;
  • 0
    правда, это верно, однако оно должно быть постоянным, а не временем выполнения.
  • 0
    Элементы постоянны, только массив не является. Помимо затрат на запуск, время выполнения очень мало. Это должно быть const просто из-за традиции или есть что-то конкретное для вашего случая, которое требует const?
Показать ещё 1 комментарий
0

Вы можете сделать это косвенным образом. Создайте такую ​​функцию, как:

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;

и вызовите эту функцию следующим образом:

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

где:

asVelden: ArrayOfString; 

Ещё вопросы

Сообщество Overcoder
Наверх
Меню