![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | 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.  |