Ayuda con mi funcion de colores RTF

Iniciado por GhostRaider, 8 Enero 2013, 18:17 PM

0 Miembros y 1 Visitante están viendo este tema.

GhostRaider

Buenas amigos les cuento que estoy haciendo una funcion RTF de colores todo funciona bien colores cursiva etcc, pero lo unico que la funcion es lenta convierte los colores demasiado lento para lo que yo quiero aver si alguien que entienda el tema se le ocurre alguna idea de hacerlo mas rapido les dejo el source a continuacion.

CODIGO:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Tag_Maker_Multiline_Example
{
   public partial class Form1 : Form
   {
       public Form1()
       {
           InitializeComponent();
       }

       private void text1_TextChanged(object sender, EventArgs e)
       {
           //Variables para el armar el archivo
           string start = "{" + "\\rtf1" + "\\ansi" + "\\ansicpg1252" + "\\deff0" + "\\deflang3082" + "{" + "\\fonttbl" + "{" + "\\f0" + "\\fnil" + "\\fcharset0 Arial Unicode MS" + ";" + "}" + "}";
           string start2 = "\\viewkind4" + "\\uc1" + "\\pard" + "\\f0" + "\\fs17";
           string ctbl = "{\\colortbl ;\\red0\\green0\\blue0;\\red128\\green0\\blue0;\\red0\\green128\\blue0;\\red255\\green128\\blue0;\\red0\\green0\\blue128;\\red128\\green0\\blue128;\\red0\\green128\\blue128;\\red128\\green128\\blue128;\\red192\\green192\\blue192;\\red255\\green0\\blue0;\\red0\\green255\\blue0;\\red255\\green255\\blue0;\\red0\\green0\\blue255;\\red255\\green0\\blue255;\\red0\\green255\\blue255;\\red255\\green255\\blue255;}";
           string end = "\\par" + "\n" + "}" + "\n" + "\0";
           
           //Variables auxiliares
           string str;
           string txt = null;
           string txt2 = null;

           int index;

           //Almacemanos el texto de "text1" en una variable con un código de color de Ares equivalente al rojo.
           //De esta forma, cuando se reeplacen los códigos y si no se ha añadido ningún color...
           //se verá el texto en rojo (el mismo color por defecto en ares).
           string aux = "304" + text1.Text;

           //Almacenamos el texto en rtf1.Text
           rtf1.Text = aux;

           //Almacenamos el código rtf resultante en una variable (aún sin los códigos reemplazados)
           str = rtf1.Rtf;

           //En el ejemplo de tag_maker de una sóla línea, iría a continuación directamente el código de reemplazo.
           //Pero en lugar de ello colocarémos un bucle que repetirá el proceso varias veces...
           //Tomará línea por línea y reemplazará los códigos de colores independientemente en cada una de ellas,
           //añandiendo al final de cada una y junto a un salto de línea, los códigos para quitar estilos y colores
           //de manera que no interfieran con la siguiente.
           
           while (true)
           {
               //Se busca un salto de línea para comprobar si el texto es multilínea
               index = str.IndexOf("\n");

               //Si no se encuentra el salto.. entonces se reemplazan los códigos, se almacena en una variable
               //y se sale del bucle.
               if (index == -1)
               {
                   txt2 = txt2 + colorDec(str); break;
               }

               //Si se llega a esta parte.. es porque hay un salto de linea y el bucle no ha sido detenido.
               //Se extrae la primer línea, se almacena en una variable y se remueve de la original.
               txt = str.Substring(0, index);
               str = str.Remove(0, index + 1);

               //Se almacena la línea en una variable junto a las demás y se le añaden los códigos extra al final.
               //Nota: En lugar del código para quitar color de fuente, agrego uno para aplicar el rojo (\\cf10).
               txt2 = txt2 + colorDec(txt) + "\\b0 \\ul0 \\i0 \\cf10 \\highlight0 \n";
           }

           //Luego de finalizado el bucle, toca armar el archivo completo con los códigos ya reemplazados.

           //Remuevo restos de códigos de estilo que puedan causar una visualización erronea
           txt2 = txt2.Replace("lang3082\\ul\\", "lang3082\\");
           txt2 = txt2.Replace("lang3082\\b\\", "lang3082\\");
           txt2 = txt2.Replace("lang3082\\i\\", "lang3082\\");

           //Remuevo restos de códigos de color que puedan causar una visualización erronea
           for (int i = 1; i <= 15; i++)
           {
               txt2 = txt2.Replace("pard\\highlight" + Convert.ToString(i), "pard");
               txt2 = txt2.Replace("pard\\cf1\\highlight" + Convert.ToString(i), "pard");
           }

           rtf1.Clear();
           rtf1.Rtf = start + ctbl + start2 + txt2 + end;

       }

       //Función de reemplazo de códigos de color. Retorna un string con los códigos reemplazados.
       public string colorDec(string rtf)
       {
           int index = 0;

           //Reemplazo de códigos de color.
           rtf = rtf.Replace("\\\'02300", "\\cf16 ");
           rtf = rtf.Replace("\\\'02301", "\\cf1 ");
           rtf = rtf.Replace("\\\'02305", "\\cf2 ");
           rtf = rtf.Replace("\\\'02303", "\\cf3 ");
           rtf = rtf.Replace("\\\'02307", "\\cf4 ");
           rtf = rtf.Replace("\\\'02302", "\\cf5 ");
           rtf = rtf.Replace("\\\'02306", "\\cf6 ");
           rtf = rtf.Replace("\\\'02310", "\\cf7 ");
           rtf = rtf.Replace("\\\'02314", "\\cf8 ");
           rtf = rtf.Replace("\\\'02315", "\\cf9 ");
           rtf = rtf.Replace("\\\'02304", "\\cf10 ");
           rtf = rtf.Replace("\\\'02309", "\\cf11 ");
           rtf = rtf.Replace("\\\'02308", "\\cf12 ");
           rtf = rtf.Replace("\\\'02312", "\\cf13 ");
           rtf = rtf.Replace("\\\'02313", "\\cf14 ");
           rtf = rtf.Replace("\\\'02311", "\\cf15 ");
           rtf = rtf.Replace("\\\'02500", "\\highlight0 ");
           rtf = rtf.Replace("\\\'02501", "\\highlight1 ");
           rtf = rtf.Replace("\\\'02505", "\\highlight2 ");
           rtf = rtf.Replace("\\\'02503", "\\highlight3 ");
           rtf = rtf.Replace("\\\'02507", "\\highlight4 ");
           rtf = rtf.Replace("\\\'02502", "\\highlight5 ");
           rtf = rtf.Replace("\\\'02506", "\\highlight6 ");
           rtf = rtf.Replace("\\\'02510", "\\highlight7 ");
           rtf = rtf.Replace("\\\'02514", "\\highlight8 ");
           rtf = rtf.Replace("\\\'02515", "\\highlight9 ");
           rtf = rtf.Replace("\\\'02504", "\\highlight10 ");
           rtf = rtf.Replace("\\\'02509", "\\highlight11 ");
           rtf = rtf.Replace("\\\'02508", "\\highlight12 ");
           rtf = rtf.Replace("\\\'02512", "\\highlight13 ");
           rtf = rtf.Replace("\\\'02513", "\\highlight14 ");
           rtf = rtf.Replace("\\\'02511", "\\highlight15 ");

           //Reemplazo de código - Negrita    
           do
           {
               try
               {
                   index = rtf.IndexOf("\\\'026");
                   rtf = rtf.Remove(index, 5);
                   rtf = rtf.Insert(index, "\\b ");

                   index = rtf.IndexOf("\\\'026");
                   rtf = rtf.Remove(index, 5);
                   rtf = rtf.Insert(index, "\\b0 ");
               }
               catch { }
           } while (index > -1);


           //Reemplazo de código - Subrayado    
           do
           {
               try
               {
                   index = rtf.IndexOf("\\\'027");
                   rtf = rtf.Remove(index, 5);
                   rtf = rtf.Insert(index, "\\ul ");

                   index = rtf.IndexOf("\\\'027");
                   rtf = rtf.Remove(index, 5);
                   rtf = rtf.Insert(index, "\\ul0 ");
               }
               catch { }
           } while (index > -1);


           //Reemplazo de código - Cursiva    
           do
           {
               try
               {
                   index = rtf.IndexOf("\\\'029");
                   rtf = rtf.Remove(index, 5);
                   rtf = rtf.Insert(index, "\\i ");

                   index = rtf.IndexOf("\\\'029");
                   rtf = rtf.Remove(index, 5);
                   rtf = rtf.Insert(index, "\\i0 ");
               }
               catch { }
           } while (index > -1);

           return rtf;

       }

       private void rtf1_TextChanged(object sender, EventArgs e)
       {

       }

       private void Form1_Load(object sender, EventArgs e)
       {

       }

       /*La diferencia a destacar, con respecto al ejemplo de una sóla línea, es únicamente el
        bucle que he añadido, que se encarga de tomar línea por línea y hacer el reemplazo de códigos
        independiente en cada una de ellas.
         
        _-_-_-_- Diferencias de menor importancia:
        * Otra diferencia, pero no del todo necesaria.. es la función que utilicé para almacenar los
        códigos de reemplazo y hacer que este ejemplo sea un poco más legible.
        * Otra diferencia menor se encuentra al final, justo antes de armarse el archivo.. donde he
        tenido que quitar códigos rtf que quedan aún después del Clear() y producen una visualización
        erronea de los colores.
        */

       
   }
}


DESCARGAR EL SOURCE PARA QUE PUEDAN VER MEJOR
http://www.mediafire.com/?o5y5z3j6874418x