массив delphi преобразования строкового списка в строковый список

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


person xianghua    schedule 04.05.2011    source источник


Ответы (2)


Создав список строк, вы можете просто вызвать 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;

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

person David Heffernan    schedule 04.05.2011
comment
Обратите внимание, что это работает только в D2009 и новее (где доступны дженерики). Тот же код типа в D2007 (который поддерживает синтаксис конструктора динамического массива) не работает с несовместимыми типами E2010: 'TStrings' и 'TStringArray', где type TStringArray = array of string, и используется как SA := TStringArray.Create('One', 'Two', Three');, а TStringList.AddStrings вызывается как SL.AddStrings(SA); - person Ken White; 04.05.2011
comment
Последнее обновление хорошо работает на всех версиях Delphi, даже на тех, у которых нет динамических массивов (!) - person David Heffernan; 10.12.2012

Для предварительных общих версий 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;
person Ken White    schedule 04.05.2011
comment
@ Уоррен: Спасибо. Некоторые из нас застряли в их использовании, потому что у нас есть проекты, которые не нуждаются в поддержке Unicode (в частности, в домашних приложениях) и поэтому не могут оправдать работу по их преобразованию в новые версии Delphi (и не могут оправдать расходы на сами новые версии, потому что власть имущие не заботятся о Юникоде, дженериках и т. д.). - person Ken White; 04.05.2011
comment
один комментарий: параметр открытого массива, а не динамический массив, дает вызывающей стороне большую гибкость без каких-либо затрат. - person David Heffernan; 05.05.2011
comment
@ Дэвид: Верно. Я специально обращался к массиву строк OP, который, как мне показалось, был ссылкой на динамический массив. @ Уоррен: Не хочу сказать, что я не знаком с новыми версиями Delphi. :) у меня XE; просто не могу использовать его столько, сколько хотелось бы, так как в настоящее время у меня есть более 40 приложений в D2007, которые, вероятно, не будут обновлены до Unicode в ближайшем будущем. - person Ken White; 05.05.2011