Homer Cdt

Registrado: 21 Nov 2005Mensajes: 5
|
Publicado: Vie 25 Nov, 2005 10:18 am Asunto: AnsiString y char(10) |
|
|
Hola a todos, estoy haciendo una rutina aparentemente muy simple pero me tiene loco. Tengo un fichero de caractéres con sus correspondientes saltos de línea, más o menos así:
ABCBBCACBCAAABchar(10)ABCBBBACAABCCAchar(10)CCBCBACBCAAABCchar(10)....
La rutina es llamada desde el evento OnClick de un botón y debe mostrar en pantalla el contenido del fichero con esta estructura:
1 A B C B B C A C B C A A A B
2 A B C B B B A C A A B C C A
3 C C B C B A C B C A A A B C
4 ....
Para ello utilizo el siguiente código:
| Código: | int j,a,final;
TMemoryStream *Auxiliar;
AnsiString FicheroSel,tex,sep,salto;
char *temp;
salto=AnsiString(char(10));
final=100000000;//número muy alto para que al utilizar la función
//insert del AnsiString siempre lo haga al final de la cadena
Auxiliar=new TMemoryStream();
//Define la apariencia de la ventana
Visualizador->Height=510;
Visualizador->Width=558;
Visualizador->ConsolaSeleccion->Height=480;
Visualizador->ConsolaSeleccion->Width=552;
Visualizador->Left=150;
Visualizador->Top=40;
//Define las propiedades de presentación del texto
Visualizador->ConsolaSeleccion->Clear();
Visualizador->ConsolaSeleccion->DefAttributes->Style=Visualizador->ConsolaSeleccion->DefAttributes->Style>>fsBold;
Visualizador->ConsolaSeleccion->DefAttributes->Color=clBlack;
Visualizador->ConsolaSeleccion->DefAttributes->Name="Courier New";
Visualizador->ConsolaSeleccion->DefAttributes->Size=12;
Visualizador->ConsolaSeleccion->Paragraph->Alignment = taRightJustify;
Visualizador->ConsolaSeleccion->Paragraph->FirstIndent=0;
Visualizador->ConsolaSeleccion->Paragraph->RightIndent=16;
tex="1 ";
n_ap=1;
sep=" ";
salto=AnsiString(char(10));
//carga en una varible TMemoryStream el contenido del fichero para no tener
//que acceder permanentemente a disco duro.
FicheroSel=pathFichero;
Auxiliar->Clear();
Auxiliar->LoadFromFile(FicheroSel);
a=Auxiliar->Size;
temp=new char[a];
Auxiliar->Seek(0,soFromBeginning);
Auxiliar->Read(temp,a);
//Inserta el texto del fichero. Cada linea tiene un ordinal
// y los signos están separados con espacios
for (j=0;j<a;j++)
{
if (temp[j]==char(10))
{
tex.Insert(salto,final);
tex.Insert(FloatToStrF(n_ap,ffNumber,7,0),final);
tex.Insert(" ",final);
}
else
{
tex.Insert(AnsiString(temp[j]),final);
tex.Insert(sep,final);
}
}
delete []temp;
Visualizador->ConsolaSeleccion->Lines->Add(tex);
delete Auxiliar;
//Indica el total de las apuestas mostradas
cap=Visualizador->ConsolaSeleccion->Lines->Capacity;
Visualizador->ConsolaSeleccion->Lines->Delete(cap-1);//borra la linea escrita de más en el bucle anterior
Visualizador->ConsolaSeleccion->Top=2;
Visualizador->ConsolaSeleccion->Visible=true;
Visualizador->ShowModal();
} |
Visualizador es un TForm y ConsolaSeleccion un TRichEdit. El tamaño de los ficheros a tratar puede ser de hasta 18 millones de caratéres.
El fichero cambia a lo largo del desarrollo del programa y es necesario visualizarlo en diferentes puntos de la ejecución. El problema está cuando después de mostrarlo varias veces (puede ser 3, 15 ó cualquier otro número) multiplica el tiempo que va desde que se pulsa el botón hasta que se ve completo por más de 50 veces, es decir que si normalmente tarda 20 segundos puede llegar a tarda hasta 15 minutos. Despues de mucho probar he descubierto que si quito la línea que inserta el char(10)
tex.Insert(salto,final);
el problema desaparece.
No tengo ni idea a que se puede deber porque, sin explicación aparente unas veces los hace bien y otras mal.
Si alguien llega hasta aquí leyendo muchas gracias por su tiempo. |
|