Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 404

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Мне предложили такую копирования части строки:
...
но не могу чего-то разобраться... Нужно от начала строки до табуляции (#$$9 или #9) скопировать в одну переменную, дальше от таба до таба во вторую и т.д., затем от таба до конца строки. Заранее спасибо! С уважением, Евгений.

Приложение:
  1. function GetBetween(first, second, line: string): string;
  2. var posF, posS, i: integer; index: boolean;
  3. begin
  4. st:='';
  5. posF:=pos(first,line)+length(first);
  6. posS:=pos(second,line);
  7. index:=true;
  8. i:=1;
  9. while (i<=length(line))and(index) do begin
  10. if (i>=posF)and(i<posS) then st:=st+line[i];
  11. if i=posS then index:=false;
  12. inc(i);
  13. end;
  14. GetBetween:=st;
  15. end;


Hi-tek Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Hi-tek (статус: 1-ый класс)
Вопрос отправлен: 11 марта 2008, 09:28
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Feniks

Здравствуйте, Hi-tek!
Кажется у TStringList было свойство Delimeters отвечающее за знак/символ разделитель в строке. И тогда все просто получается. Ставите это свойство равное коду табуляции и спомощью методов TStringList добавляете всю вашу строку, и он сам уже их разбиваете на отдельные подстроки согластно знаку разделителя. В результате у вас получиться целый список строк в этом классе. Такой пример тут уже рассматривался, ищите поиском на портале.

Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 11 марта 2008, 11:52
Оценка за ответ: 3

Ответ #2. Отвечает эксперт: Drozdov D.V.

Здравствуйте, Hi-tek!
Моё мнение в данном примере используется деление строки на несколько строк.
Можно заменить и на другое всё зависит от вкуса.
И конечно всё зависит от конкретной ситуации.
А ниже я привёл справочник по работе со строками.(mini)
УДАЧИ!

Приложение:
  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  


Ответ отправил: Drozdov D.V. (статус: 4-ый класс)
Время отправки: 12 марта 2008, 23:29
Оценка за ответ: 4

Комментарий к оценке: спасибо за краткий справочник :)

Мини-форум вопроса

Всего сообщений: 5; последнее сообщение — 11 марта 2008, 17:21; участников в обсуждении: 2.
Hi-tek

Hi-tek (статус: 1-ый класс), 11 марта 2008, 16:01 [#1]:

да, вот нашел:

var sl:TStringList; i: integer; s: string;
begin
s:='...';
sl:=TstringList.create;
try
sl.delimiter := '...';
sl.DelimitedText := '...';
for i:= 0 to sl.count -1 do
if Pos(s, sl[i]) <> 0 then memo1.lines.add(sl[1]);
finally
sl.free;
end;

помогите пожалуйста адаптировать под мою задачу.
Hi-tek

Hi-tek (статус: 1-ый класс), 11 марта 2008, 16:05 [#2]:

понятно, что в DelimitedText прописываем текст (к примеру "one+two+three"), разделителем является "+", нужно скопировать one в первую переменную, two- во вторую и three - в третью.
Dron

Dron (статус: Студент), 11 марта 2008, 16:45 [#3]:

Ну и в чём теперь проблема?
var_a := sl[0];
var_b := sl[1];
var_c := sl[2];
С уважением.
Hi-tek

Hi-tek (статус: 1-ый класс), 11 марта 2008, 17:11 [#4]:

Dron, спасибо за подсказку! Но вот еще загвоздка: если в строке стоит пробел, то в переменную вписывается всё до пробела, но нужно же всё, включая пробел!
Hi-tek

Hi-tek (статус: 1-ый класс), 11 марта 2008, 17:21 [#5]:

мне так посоветовали:

procedure StrBreakApart(const S, Delimeter: string; Parts: TStrings);
var CurPos: integer;
CurStr: string;
begin
Parts.Clear;
Parts.BeginUpdate;
try
CurStr := S;
repeat
CurPos := Pos(Delimeter, CurStr);
if CurPos>0 then
begin
Parts.Add(Copy(CurStr, 1, Pred(CurPos)));
CurStr := Copy(CurStr, CurPos + Length(Delimeter),
Length(CurStr) - CurPos - Length(Delimeter) + 1);
end else Parts.Add(CurStr);
until CurPos = 0;
finally Parts.EndUpdate; end;
end;

Вызов:
var S:TStrings;
begin
S:=TStringList.Create;
StrBreakApart('one+two+three','+',S);
S.Free;
end;

всё отлично работает!!! всем спасибо)))

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:57
Выполнено за 0.03 сек.