Есть список в listBox с наименованием параметров.
типо
Код:
Право
Лево
Вверх
В низ
Вперёд
Назад
...
Параметро 30.
Но сразу все они не используются.
В Мемо может оказаться один, а других 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;
Спасибо.