Hola amigos, me hice una aplicación la cual busca texto en una lista de archivos indicada y me encuentro con que la barra de progreso va mas lenta de lo que debiese aun con el DoubleBuffered activado, o sea, me muestra el mensaje de que la aplicación ha terminado y la barra no ha llegado a su fin y veo como llega tarde. Hablo de un retraso de un par de segundos o más. ¿como puedo solucionar eso? Mi código de esa función está así:
Código PHP:
void __fastcall TForm1::ButtonSearchClick(TObject *Sender)
{
int sizeOriginal, sizeReemplazo;
char *binOriginal=NULL, *binReemplazo=NULL;
bool founded, error=false;
int nCoincidencias=0;
//Inicializo la barra de progreso
ProgressBar1->Max=ListBoxSeleccionados->Items->Count;
ProgressBar1->Position = 0;
ListBoxCoincidencias->Items->Clear();
//Si no hay archivos en el Listbox no sigo adelante
if(ListBoxSeleccionados->Items->Count > 0){
//Si no hay cadena a buscar no sigo adelante
if(EditTextOriginal->Text.Length() > 0){
//Me aseguro de que hay algo mas que comodines en el patrón de busqueda
if(CheckBoxComodin->Checked){
int contador = 0;
for(int i=1; i <= EditTextOriginal->Text.Length(); i++){
if(EditTextOriginal->Text[i] == '?'){
contador++;
}
}
if(contador == EditTextOriginal->Text.Length()){
MessageBox(NULL, L"No se admite como patrón de búsqueda sólo comodines.", L"Atención", MB_OK | MB_ICONEXCLAMATION);
error = true;
}
}
}else{
MessageBox(NULL, L"Introduce la cadena que deseas buscar y vuelve a intentarlo.", L"Atención", MB_OK | MB_ICONEXCLAMATION);
error = true;
}
}else{
MessageBox(NULL, L"No hay archivos donde buscar. Añada primero los archivos en los que desee buscar.", L"Atención", MB_OK | MB_ICONEXCLAMATION);
error = true;
}
if(!error){
for(int i=0; i < ListBoxSeleccionados->Items->Count; i++)
{
switch(RadioGroupTipo->ItemIndex)
{
case 0: //ASCII
founded = ExecuteMode(ListBoxSeleccionados->Items->Strings[i], AnsiString(EditTextOriginal->Text).c_str(), EditTextOriginal->Text.Length(), AnsiString(EditTextReemplazo->Text).c_str(), EditTextReemplazo->Text.Length());
break;
case 1: //UTF-8
sizeOriginal = WideCharToMultiByte(CP_UTF8, 0, EditTextOriginal->Text.c_str(), EditTextOriginal->Text.Length(), NULL, 0, NULL, NULL);
binOriginal = new char[sizeOriginal];
WideCharToMultiByte(CP_UTF8, 0, EditTextOriginal->Text.c_str(), -1, binOriginal, sizeOriginal, NULL, NULL);
sizeReemplazo = WideCharToMultiByte(CP_UTF8, 0, EditTextReemplazo->Text.c_str(), EditTextReemplazo->Text.Length(), NULL, 0, NULL, NULL);
binReemplazo = new char[sizeReemplazo];
WideCharToMultiByte(CP_UTF8, 0, EditTextReemplazo->Text.c_str(), -1, binReemplazo, sizeReemplazo, NULL, NULL);
founded = ExecuteMode(ListBoxSeleccionados->Items->Strings[i], binOriginal, sizeOriginal, binReemplazo, sizeReemplazo);
break;
case 2: //BINARIO
if(IsFormatCorrectForBinary(EditTextOriginal->Text,CheckBoxComodin->Checked)){
if(IsFormatCorrectForBinary(EditTextReemplazo->Text,false)){
sizeOriginal = EditTextOriginal->Text.Length() / 2;
sizeReemplazo = EditTextReemplazo->Text.Length() / 2;
binOriginal = new char[sizeOriginal];
binReemplazo = new char[sizeReemplazo];
WideStringToBin(EditTextOriginal->Text, binOriginal);
WideStringToBin(EditTextReemplazo->Text, binReemplazo);
founded = ExecuteMode(ListBoxSeleccionados->Items->Strings[i], binOriginal, sizeOriginal, binReemplazo, sizeReemplazo);
}else{
MessageBox(NULL, L"El formato del patrón de reemplazo es incorrecto.", L"Error", MB_OK | MB_ICONERROR);
return;
}
}else{
MessageBox(NULL, L"El formato del patrón de busqueda es incorrecto.", L"Error", MB_OK | MB_ICONERROR);
return;
}
break;
}
if(founded){
ListBoxCoincidencias->Items->Add(ListBoxSeleccionados->Items->Strings[i]);
nCoincidencias++;
}
(ProgressBar1->Position)++;
Application->ProcessMessages();
}
}
LabelNCoincidencias->Caption = nCoincidencias;
SetScrollWidth(ListBoxCoincidencias);
if(binOriginal != NULL)
delete binOriginal;
if(binReemplazo != NULL)
delete binReemplazo;
if(!error)
MessageBox(NULL,L"Operación finalizada.", L"Atención", MB_OK | MB_ICONINFORMATION);
}
Llega al MessageBox del final y la barra de progreso aun sigue rellenandose