преобразование списка строк в массиве строк delphi

#arrays #delphi #tstringlist

#массивы #delphi #tstringlist

Вопрос:

Есть ли простой способ в delphi преобразовать массив строк в tstringlist?

Ответ №1:

После того, как вы создали список строк, вы можете просто вызвать AddStrings() .

Или для более старых версий Delphi, которые не поддерживают AddStrings() перегрузки, допускающие использование массивов, вы можете создать свою собственную.

 function StringListFromStrings(const Strings: array of string): TStringList;
var
  i: Integer;
begin
  Result := TStringList.Create;
  for i := low(Strings) to high(Strings) do
    Result.Add(Strings[i]);
end;
  

Использование параметра открытого массива обеспечивает максимальную гибкость для вызывающей стороны.

Комментарии:

1. Обратите внимание, что это работает только в версии D2009 и выше (где доступны обобщенные версии). Тот же код типа в D2007 (который поддерживает синтаксис конструктора динамического массива) завершается ошибкой с «Несовместимыми типами E2010: ‘TStrings’ и ‘TStringArray'», где type TStringArray = array of string , и используется как SA := TStringArray.Create('One', 'Two', Three'); , а TStringList.AddStrings вызывается как SL.AddStrings(SA);

2. Последнее обновление хорошо работает на всех версиях Delphi, даже тех, в которых нет динамических массивов (!)

Ответ №2:

Для готовых версий Delphi вы можете использовать что-то вроде этого:

 type
  TStringArray = array of string;

procedure StringListFromStrings(const StringArray: TStringArray; 
  const SL: TStringList);
var
  // Versions of Delphi supporting for..in loops
  s: string;

  // Pre for..in version
  // i: Integer;
begin
  // TStringList should be created and passed in, so it's clear
  // where it should be free'd.
  Assert(Assigned(SL));

  // Delphi versions with for..in support
  for s in StringArray do
    SL.Add(s);

  // Pre for..in versions
  // for i := Low(StringArray) to High(StringArray) do
  //   SL.Add(StringArray[i]);
end;
  

Комментарии:

1. @Warren: Спасибо. Некоторые из нас застряли на их использовании, потому что у нас есть проекты, которые не нуждаются в поддержке Unicode (в частности, в домашних приложениях) и, следовательно, не могут оправдать работу по их преобразованию в новые версии Delphi (и не могут оправдать расходы на сами новые версии, потому что власть имущие не заботятся о Unicode или generics и тому подобном).

2. один комментарий: параметр открытого массива, а не динамический массив, предоставляет вызывающей стороне большую гибкость без каких-либо затрат.

3. @David: Верно. Я специально обращался к «массиву строк» OP, который, как мне показалось, является ссылкой на динамический массив. @Warren: Не хочу сказать, что я не знаком с более новыми версиями Delphi. 🙂 У меня есть XE; просто я не могу использовать его так часто, как хотелось бы, поскольку в настоящее время у меня более 40 приложений в D2007, которые, вероятно, не будут обновлены до Unicode в ближайшем будущем.

Ответ №3:

В последней версии Delphi вы можете вызывать метод «addStrings» для классов TStrings и TStringList следующим образом:

 function StringListFromStrings(const Strings: array of string): TStringList;
var
  i: Integer;
begin
  Result := TStringList.Create;
  Result.addStrings(Strings);
end;
  

Вы можете найти документацию об этом методе на:
https://docwiki.embarcadero.com/Libraries/Sydney/en/System.Классы.TStrings.Добавление строк