Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Split в Дельфях, Эквивалент Split-а в Дельфи? 
:(
    Опции темы
ШурикС
  Дата 9.1.2003, 00:49 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Подскажите, кто знает, пожалуйста, есть ли в Дельфи эквивалент VB(A)-вской ф-ии Split (делит строку в зависимости от символа-делителя, напр. "Всем привет" на основе [пробела] делит на "Всем" и "привет", ну и есс-но возвращает результаты в массив).
Заранее спасибо!
  Вверх
Vit
Дата 9.1.2003, 02:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Такой вроде нет, но можно легко это организовать самому (используя функции Pos и Copy), могу написать, если у самого не получится.


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
ШурикС
  Дата 9.1.2003, 07:14 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата
могу написать, если у самого не получится

Буду Вам очень признателен, а то я начал мухлевать с указателями и залез в непролазные глючные дебри, из которых не могу выбраться (я всего лишь новичок, так что пожалуйста не судите строго) уже вторые сутки.
  Вверх
remax
Дата 9.1.2003, 07:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: 1
Всего: 5



В распостраненных библиотеках встречаются подобные штучки,
например функция SubStr из библиотеки RaLib


--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
Vit
Дата 9.1.2003, 07:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Вариант 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;





--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Vit
Дата 9.1.2003, 07:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Вариант 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)


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
remax
Дата 10.1.2003, 04:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: 1
Всего: 5



Vit, первый вариант очень красив!
А вот второй имеет шероховатости. В частности, Ваш алгортим неправильно отработает, если в конце строки будет пробел - добавиться пустая строка,
если подряд идут несколько пробелов и т.д.  
Предлагаю его немного скорректировать:

var a:array of string;//наш массив
    s:string;//строка которую мы будем разбивать
begin
s:='Windows Messages SysUtils Variants Classes Graphics Controls Forms';
s:=Trim(s)+' '; // Насильственно делаем обрезание и добавляем пробел в конец
While (length(s)>1) do
  begin
 //мы постепенно заполняем массив на каждом шаге цикла по 1 элементу
    setlength(a,length(a)+1);//увеличиваем размер массива на 1    
    a[length(a)-1]:=copy(s,1, pos(' ',s)-1);//присвоение последнему элементу массива первого слова строки (без финального пробела)
    s:=TrimLeft(copy(s,pos(' ',s)+1, length(s)));//удаляем из строки слово
  end;
//теперь проверяем что получили
showmessage(a[0]);
showmessage(a[1]);
showmessage(a[2]);


--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
Vit
Дата 10.1.2003, 05:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Цитата(remax @ 09.1.2003, 11:09)
А вот второй имеет шероховатости. В частности, Ваш алгортим неправильно отработает, если в конце строки будет пробел - добавиться пустая строка,
если подряд идут несколько пробелов и т.д.  

Легко корректируется таким образом:

Первой строкой ставим:

s:=trim(StringReplace(s,'  ',' ',[rfReplaceAll]));

Это удалит и все множественные пробелы и пробелы на концах.


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Vit
Дата 10.1.2003, 05:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Кстати можно скрестить оба варианта - для разбивки использовать TStringList, а затем его перебросить в массивв...


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
remax
Дата 14.1.2003, 06:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: 1
Всего: 5



Цитата(Vit @ 09.1.2003, 21:41)

Легко корректируется таким образом:

Первой строкой ставим:

s:=trim(StringReplace(s,'  ',' ',[rfReplaceAll]));


Да, совершенно верно. Но, если учитывать не только функциональность кода, но и его "красивость" - в учебных целях, то мой мой вариант лучше.
-  Во первых, он короче (комментарии я специально оставлял в оригинале - для объективности оценки)
-  Во вторых, "прозрачнее"  - нет лишних телодвижений.

Понятно, что для скорости выполнения или уменьшения исполняемого кода  для современных ПК это слезы, но для обучения хорошему стилю программирования это принципиально.


:D  :D  :p  :p


--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
Fantasist
Дата 14.1.2003, 07:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: нет
Всего: 41



Вообще, по-моему, где-то в RxLib лежит подходящая функция. Но она настолько проста, что сделать нечто подобное не представляет затруднений:

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;

Там была так же определена константа - стандартные разделители.

P. S. Строки Delphi хоть и являются паскалевскими, но совместимы с С-строкой.

P.P.S. Сейчас вспомнил - небыло там такой функции (или просто я о ней не слышал) - была WordCount.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1143 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.