Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.07.2018, 17:38
TEKTON TEKTON вне форума
Новичок
 
Регистрация: 14.03.2011
Сообщения: 60
Репутация: 10
По умолчанию Парсинг и калькуляция в Мемо

Есть список в 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;




Спасибо.

Последний раз редактировалось TEKTON, 26.07.2018 в 21:41.
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:46.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025