Как работать со строками и символами в 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
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. я бы использовал регулярные выражения, но комментарии будут слишком объёмными.
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;
В отличии от примера выше скушает даже два артикула в одной строке:)