Как работать со строками и символами в delphi 2010?

Добрый день всем!
У меня вопрос должно быть легкий, но я над ним очень долго думаю уже.
Написал код, он отрабатывает, но не так, как нужно.
Есть два поля memo. В одном из них текст с артикулами.
В другое поле надо вывести списком артикулы. Помогите разобраться, пожалуйста, если возможно с комментариями.

=====================================
Код программы
=====================================
procedure TForm1.Button5Click(Sender: TObject);
const
//Разделители слов.
D = ['|'];
P = [' '];
var
S, sWord, pWord : String;
i, j, Pos2, Len, LenW : Integer;

begin
S := Memo1.lines.Text;

Memo2.Clear;

Memo2.Lines.Add('ООО "Артикулы"');
Len := Length(S);
Pos2 := 0;
j := 0;
for i := Len downto 1 do begin
//Пропускаем разделители.
if S[i] in D then Continue;
//Отслеживаем конец слова.
if (i = Len) or (S[i + 1] in D) then Pos2 := i;
//Отслеживаем начало слова.
if (i = 1) or (S[i - 1] in P) then begin
//Порядковый номер слова:
Inc(j);
//Длина слова.
LenW := Pos2 - i +1;
//Слово.

sWord := Copy(S, i, Lenw);
//Добавляем сведения о слове в Memo2.
Memo2.Lines.Add(sWord);

end;
end;

===================================
Текст из memo1
===================================
Балансир Lucky John CLASSIC 4 + тр. 40мм/19 81401-19|
Балансир Lucky John CLASSIC 4 + тр. 40мм/40 блисте 81401-40|
Балансир Lucky John CLASSIC 5 + тр. 50мм/41 блисте 81501-41|
Балансир Lucky John CLASSIC 5 + тр. 50мм/42 блисте 81501-42|
Балансир Lucky John CLASSIC 6 + тр. 60мм/12HRT бли 81601-12HRT|
Балансир Lucky John CLASSIC 6 + тр. 60мм/36RT блис 81601-36RT|
Балансир Lucky John CLASSIC 7 + тр. 70мм/47H блист 81701-47H|
Балансир Lucky John FIN 3 + тр. 40мм/42 блистер 71313-42|

=========================================
Текст из memo2 После обработки должен быть
==========================================
81401-19
81401-40
81501-41
81501-42
81601-12HRT
81601-36RT
81701-47H
71313-42

==========================================
После обработки текст из memo2 сейчас
==========================================
71313-42
блистер 71313-42
40мм/42 блистер 71313-42
тр. 40мм/42 блистер 71313-42
+ тр. 40мм/42 блистер 71313-42
3 + тр. 40мм/42 блистер 71313-42
FIN 3 + тр. 40мм/42 блистер 71313-42
John FIN 3 + тр. 40мм/42 блистер 71313-42
Lucky John FIN 3 + тр. 40мм/42 блистер 71313-42
81701-47H
блист 81701-47H
70мм/47H блист 81701-47H
тр. 70мм/47H блист 81701-47H
+ тр. 70мм/47H блист 81701-47H
7 + тр. 70мм/47H блист 81701-47H
CLASSIC 7 + тр. 70мм/47H блист 81701-47H
John CLASSIC 7 + тр. 70мм/47H блист 81701-47H
Lucky John CLASSIC 7 + тр. 70мм/47H блист 81701-47H
81601-36RT
блис 81601-36RT
60мм/36RT блис 81601-36RT
тр. 60мм/36RT блис 81601-36RT
+ тр. 60мм/36RT блис 81601-36RT
6 + тр. 60мм/36RT блис 81601-36RT
CLASSIC 6 + тр. 60мм/36RT блис 81601-36RT
John CLASSIC 6 + тр. 60мм/36RT блис 81601-36RT
Lucky John CLASSIC 6 + тр. 60мм/36RT блис 81601-36RT
81601-12HRT
бли 81601-12HRT
60мм/12HRT бли 81601-12HRT
тр. 60мм/12HRT бли 81601-12HRT
+ тр. 60мм/12HRT бли 81601-12HRT
6 + тр. 60мм/12HRT бли 81601-12HRT
CLASSIC 6 + тр. 60мм/12HRT бли 81601-12HRT
John CLASSIC 6 + тр. 60мм/12HRT бли 81601-12HRT
Lucky John CLASSIC 6 + тр. 60мм/12HRT бли 81601-12HRT
81501-42
блисте 81501-42
50мм/42 блисте 81501-42
тр. 50мм/42 блисте 81501-42
+ тр. 50мм/42 блисте 81501-42
5 + тр. 50мм/42 блисте 81501-42
CLASSIC 5 + тр. 50мм/42 блисте 81501-42
John CLASSIC 5 + тр. 50мм/42 блисте 81501-42
Lucky John CLASSIC 5 + тр. 50мм/42 блисте 81501-42
81501-41
блисте 81501-41
50мм/41 блисте 81501-41
тр. 50мм/41 блисте 81501-41
+ тр. 50мм/41 блисте 81501-41
5 + тр. 50мм/41 блисте 81501-41
CLASSIC 5 + тр. 50мм/41 блисте 81501-41
John CLASSIC 5 + тр. 50мм/41 блисте 81501-41
Lucky John CLASSIC 5 + тр. 50мм/41 блисте 81501-41
81401-40
блисте 81401-40
40мм/40 блисте 81401-40
тр. 40мм/40 блисте 81401-40
+ тр. 40мм/40 блисте 81401-40
4 + тр. 40мм/40 блисте 81401-40
CLASSIC 4 + тр. 40мм/40 блисте 81401-40
John CLASSIC 4 + тр. 40мм/40 блисте 81401-40
Lucky John CLASSIC 4 + тр. 40мм/40 блисте 81401-40
81401-19
40мм/19 81401-19
тр. 40мм/19 81401-19
+ тр. 40мм/19 81401-19
4 + тр. 40мм/19 81401-19
CLASSIC 4 + тр. 40мм/19 81401-19
John CLASSIC 4 + тр. 40мм/19 81401-19
Lucky John CLASSIC 4 + тр. 40мм/19 81401-19
Балансир Lucky John CLASSIC 4 + тр. 40мм/19 81401-19
  • Вопрос задан
  • 2491 просмотр
Решения вопроса 1
@M_PRO
for Index := 0 to Memo1.Count - 1 do
begin
  S := Memo1.Lines[Index];
  for Index2 := Lenght(S) downto 1 do
    if {} S[Index2]  = ' ' then
      break;
  for Index3 := Lenght(s) downto 1 do
   if S[Index] <> '|' then Break;
  S := Copy(S, Index2, Index3 - Index2);
  if S <> '' then
   Memo2.Add(S);

end;


комментарий:
цикл по каждой строке. находим начало и конец артикула. вырезаем из строки артикул. получаем то, что хотели.
P.S. я бы использовал регулярные выражения, но комментарии будут слишком объёмными.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@luis
procedure GetArticulList;
var
  I: Integer;
begin
  Memo2.Lines.Clear;   //чистим мемо-получатель
  Memo2.Lines.Delimiter := '|';   //устанавливаем разделитель
  Memo2.Lines.DelimitedText := Memo1.Text; //записываем текст с разделителяим
  for I := Memo2.Lines.Count - 1 downto 0 do  //начиная с конца удаляем элементы коллекции,
  //которые не подходят под маску артикула
  begin
     //во всех артикулах примера на шестой позиции стоит дефис
    if (Copy(Memo2.Lines[I], 6, 1) <> '-') then
    begin
      Memo2.Lines.Delete(i);
    end;
  end;
end;

В отличии от примера выше скушает даже два артикула в одной строке:)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы