![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Есть список в listBox с наименованием параметров.
типо Код:
Право Лево Вверх В низ Вперёд Назад ... Но сразу все они не используются. В Мемо может оказаться один, а других 5-10 не будет. В следующий раз наоборот. Есть мемо с кучей строк типа Код:
------ ##### ------ Право --- 15 % Лево --- 21 % Право --- 21 % Вперёд --- 0 % ------ №№№№ ------ ------******* ------ ------ №№№№ ------ Вверх --- 2 % Право --- 4 % Назад --- 0 % Лево --- 6 % В низ --- 5 % Право --- 0 % Как это дело спарсить что б в результате получилось так: Код:
------ ##### ------ Право --- 15 % Лево --- 21 % Право --- 21 % Вперёд --- 1 % ------ №№№№ ------ ------******* ------ ------ №№№№ ------ Вверх --- 2,2 % Право --- 4 % Назад --- 0 % Лево --- 6 % В низ --- 5 % Право --- 0 % ------ Итог: ----- Право --- 40 % Лево --- 27 % Вперёд --- 1 % Вверх --- 2,2 % В низ --- 5 % Тоесть что б все проценты с одинаковыми параметрами суммировались и в итог попали только параметры с положительным процентом. Проценты могут быть числом с запятой. Итог надо записать в конец мемо. Думаю надо сделать типо двух циклов. Что б первый подставлял в переменную значение строки из списка, Второй пробегал по всему Мемо и искал строки с этим значением. Если б делал одно значение, было б типа такого: Код:
{################## Функция парсинга ################} function Pars(T_, ForS, _T: string): string; var a, b:integer; begin Result := ''; if (T_='') or (ForS='') or (_T='') then Exit; a:=Pos(T_, ForS); if a=0 then Exit else a:=a+Length(T_); ForS:=Copy(ForS, a, Length(ForS)-a+1); b:=Pos(_T, ForS); if b>0 then Result:=Copy(ForS, 1, b - 1); end; {----------------------------------------------------} procedure TForm1.Button1Click(Sender: TObject); var I:integer; S: string; bonus1:real; // Право begin S:=memo1.Text; For I:=0 to Memo1.Lines.Count-1 do begin If pos('Право --- ',S)<>0 then Begin bonus1:=bonus1+StrToFloat(pars('Право ---', s, ' %')); End; End; memo1.lines.Add(''); memo1.lines.Add('--- Итог: ---'); memo1.lines.Add(''); memo1.lines.Add('Право --- '+ FloatToStr(bonus1)+' %'); end; Но в listBox 30 значений лежит. Можно конечно 30 проверок налепить, но хочется по нормальному сделать в цикле. Наверно надо как то через два цикла делать. Что б первый подставлял из listBox значения, а второй пробегался по всему Мемо и парсил то что нужно. Что б вместо Код:
... If pos('Право --- ',S)<>0 then ... Код:
... If pos(listBox1.Items.Strings[b]+' --- ',S)<>0 then ... И ещё вопрос: Есть несколько переменных, a1, a1, a2, a3, a4, a5:string; можно ли им присваивать индексы в цикле ? что б типа такого получилось: Var i:integer; a1, a1, a2, a3, a4, a5:string; Begin For i:=0 to Memo1.Lines.Count-1 do begin If pos('123',Memo1.Lines.Strings[i])<>0 then Begin a[i]:=Memo1.Lines.Strings[i]; end; end; end; Спасибо. Последний раз редактировалось TEKTON, 26.07.2018 в 21:41. |