DELPHI FAQ: Как разделить строку на элементы, Аналог VB функции Split


Как разделить строку на элементы, Аналог VB функции Split
Previous  Home  Next


Вариант 1.

В Дельфи есть специальный класс для хранения массивов строк - TStringList - очень рекомендую. Вот как вашу строку превратить в TStringList:

Объявление переменной

var
 t:TStringList;

begin

  t:=TStringList.create; //создаём класс

  t.text:=stringReplace('Ваша строка для разделения'
,' ',#13#10,[rfReplaceAll]);//мы заменяем все пробелы на символы конца строки
//теперь можно убедится что у вас строка разбина на элементы:

  showmessage(t[0
]);
  showmessage(t[1
]);
  showmessage(t[2
]);
  showmessage(t[3
]);
...
//после работы надо уничтожить класс

t.free;

Автор Vit
Взято с Vingrad.ru http://forum.vingrad.ru






Вариант 2. Используем стандартные массивы:


  var a:array of string;//наш массив
      s:string
;//строка которую мы будем разбивать
begin

  s:='Windows Messages SysUtils Variants Classes Graphics Controls Forms'
;
  Repeat
 //мы постепенно заполняем массив на каждом шаге цикла по 1 элементу
    setlength(a,length(a)+1
);//увеличиваем размер массива на 1
    if
 pos(' ',s)>0 then //если есть пробел то надо взять слово до пробела
      begin

        a[length(a)-1
]:=copy(s,1, pos(' ',s));//присвоение последнему элементу массива первого слова
        s:=copy(s,pos(' '
,s)+1, length(s));//удаляем из строки первое слово
      end

    else
//в строке осталось только одно слово
      begin

        a[length(a)-1
]:=s;// присвоим последнее слово
        break;//выход из цикла

      end
;
  Until
 False;//цикл бесконечный, выход изнутри
//теперь проверяем что получили

  showmessage(a[0
]);
  showmessage(a[1
]);
  showmessage(a[2
]);

После использования массива не забудте освободить память a:=nil или setlength(a,0)

Автор Vit
Взято с Vingrad.ru http://forum.vingrad.ru





procedure SplitOnWords(const s:string; Delimiters:set of char; Strings:TStrings);
var

  p,sp:PChar;
  str:string
;

begin

 include(Delimiters,#0
); //чтоб уж наверняк
 p:=pointer(s); 
 while
 true do
 begin
 
   //пропускаем все разделители в начале

   while
 p^ in Delimiters do 
    if
 p^=#0 then
      exit
    else

      inc(p);
    sp:=p;
    //пока не кончилось слово.

    while
 not (p^ in Delimiters) do inc(p);

    //запоминаем слово

    SetLength(str,cardinal(p)-cardinal(sp));
    Move(sp^,pointer(str)^,cardinal(p)-cardinal(sp));
    Strings.Add(str);
 end

end
;

Автор Fantasist
Взято с Vingrad.ru http://forum.vingrad.ru





DELPHI FAQ




EOMY TOP 100      Рейтинг@Mail.ru      Rambler's Top100