El problema que tienes es que lo recorres hacia adelante.
Deberías recorrerlo hacia atrás (si utilizas FOR...DO).
Código Delphi
[-]
Var
Time : String;
i : integer
Begin
Time := Memo1.Lines.Text;
for i:= Memo1.Lines.Count-1 downto 1 do
If Pos('duracion=',Time) > 0 Then
Begin
Delete (Time,1,Pos('duracion="', Time) + 8);
Delete (Time, Pos ('"', Time), MaxInt);
Memo2.Lines.Add(Time);
End;
El problema es que recorres la lista según el índice
Si encuentras, borras el elemento en la posición del indice. Esto hace que todo lo que le sigue "caiga" una posición.
Luego el FOR avanza el indice y esa posición ya no la has tratado.
Deberías hacerlo con un WHILE e incrementar el índice solo si no encuentras lo que buscas.