Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как разбить строку на части


Автор: gavr 27.3.2005, 17:24
Привет! Делаю моё первое приложение. Очень надеюсь на вашу помощь.

Необходимо из строки типа:
"просто какой-то текст(имя_файла)и т.д."
вытащить имя_файла т.е. то что в скобках.
Как проще всего это сделать?
В DRKB (огромное спасибо Vit'у) нашел
Код

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; 

но компилятор пишет: Undeclared identifier: 'stringReplace'

Автор: Zero 27.3.2005, 17:34
А у тебя в строке Uses , есть модуль "Classes"?

Автор: z-END 27.3.2005, 17:36
Zero если ругается на StringReplace то тогда уж скорее надо смотреть SysUtils прописаны или нет.

Автор: Poseidon 27.3.2005, 17:39
Цитата(gavr @ 27.3.2005, 17:24)
но компилятор пишет: Undeclared identifier: 'stringReplace'
А у меня нормально компилируется. Проверь, подключено ли SysUtils

Автор: Zero 27.3.2005, 17:39
Ну не знаю, у меня лично не ругается, а класс "TStringList" находится в модуле "Classes"
Добавлено @ 17:41
А точно, "SysUtils" нужен... Без него такаяже ошибка выдаётся. smile

Автор: SPrograMMer 27.3.2005, 17:41
Vit, то конечно молодец! Но вот если у тебя просто строка (тип String), тогда лучше будет работа со строковыми функциями:
Код

var
  S,Res:String;
  N_1,N_2:Integer;
Begin
  S:='текст просто текст (имя файла) и т. д.';
  N_1:=Pos('(',S);  //номер отк скобки
  N_2:=Pos(')',S);  // ноер закр скобки
  Res:=Copy(S,N_1+1,N_2-N_1-1); // результат
End;


ЗЫ: для первых приложений лучше купить книжку типа "Самоучитель по Delphi" и читать её, чем "лазать" по профсправочникам!

Автор: Poseidon 27.3.2005, 17:41
Цитата(Zero @ 27.3.2005, 17:34)
А у тебя в строке Uses , есть модуль "Classes"?
А при чем тут Classes? Регается-то StringReplace, каторая в SysUtils

PS. 2z-END, ну и скорость, опередил!

Автор: gavr 27.3.2005, 18:16
SPrograMMerСпасибо всё правильно!!! smile
Цитата
для первых приложений лучше купить книжку типа "Самоучитель по Delphi

Где еще найдешь столько профессионалов готовых помочь тебе за секунды!

Автор: FRAGNATIC 28.3.2005, 00:59
ещё есть прикольные функций RightStr и LeftStr находящиеся в StrUtils)
Добавлено @ 01:02
а книги в книжных магазинах продаются) + есть куча инет магазинов)

Автор: ДЫМ 28.3.2005, 01:22
Вот моя функция, пожалуй ИМХО самый оптимальный алгоритм (всего один цикл);

Код


type TDelim=set of Char;
        TArrayOfString=Array of String;
 

//*******************
//
// Разбивает строку с разделителями на части
// и возвращает массив частей
//
// fcToParts
//

function fcToParts(sString:String;tdDelim:TDelim):TArrayOfString
var iCounter,iBegin:Integer;
begin//fc
if length(sString)>0 then
 begin
  include(tdDelim,#0);iBegin:=1; SetLength(Result,0);
  For iCounter:=1 to Length(sString)+1 do
   begin//for
    if (sString[iCounter] in tdDelim) then
     begin
      SetLength(Result,Length(Result)+1);
      Result[Length(Result)-1]:=Copy(sString,iBegin,iCounter-iBegin);
      iBegin:=iCounter+1;
     end;
  end;//for
 end;//if
end;//fc


Пример вызова

Код

Array:=fcToParts('строка1(строка2)',['(',')']);






Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)