Ver Mensaje Individual
  #1  
Antiguo 19-06-2020
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Reputación: 11
aguml Va por buen camino
ProgressBar reacciona con retraso

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 sizeOriginalsizeReemplazo;
    
char *binOriginal=NULL, *binReemplazo=NULL;
    
bool foundederror=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<= EditTextOriginal->Text.Length(); i++){
                    if(
EditTextOriginal->Text[i] == '?'){
                        
contador++;
                    }
                }

                if(
contador == EditTextOriginal->Text.Length()){
                    
MessageBox(NULLL"No se admite como patrón de búsqueda sólo comodines."L"Atención"MB_OK MB_ICONEXCLAMATION);
                    
error true;
                }
            }
        }else{
                
MessageBox(NULLL"Introduce la cadena que deseas buscar y vuelve a intentarlo."L"Atención"MB_OK MB_ICONEXCLAMATION);
                
error true;
        }
    }else{
        
MessageBox(NULLL"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=0ListBoxSeleccionados->Items->Counti++)
        {
            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_UTF80EditTextOriginal->Text.c_str(), EditTextOriginal->Text.Length(), NULL0NULLNULL);
                    
binOriginal = new char[sizeOriginal];
                    
WideCharToMultiByte(CP_UTF80EditTextOriginal->Text.c_str(), -1binOriginalsizeOriginalNULLNULL);

                    
sizeReemplazo WideCharToMultiByte(CP_UTF80EditTextReemplazo->Text.c_str(), EditTextReemplazo->Text.Length(), NULL0NULLNULL);
                    
binReemplazo = new char[sizeReemplazo];
                    
WideCharToMultiByte(CP_UTF80EditTextReemplazo->Text.c_str(), -1binReemplazosizeReemplazoNULLNULL);

                    
founded ExecuteMode(ListBoxSeleccionados->Items->Strings[i], binOriginalsizeOriginalbinReemplazosizeReemplazo);
                    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->TextbinOriginal);
                            
WideStringToBin(EditTextReemplazo->TextbinReemplazo);

                            
founded ExecuteMode(ListBoxSeleccionados->Items->Strings[i],  binOriginalsizeOriginalbinReemplazosizeReemplazo);
                        }else{
                            
MessageBox(NULLL"El formato del patrón de reemplazo es incorrecto."L"Error"MB_OK MB_ICONERROR);
                            return;
                        }
                    }else{
                        
MessageBox(NULLL"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
Responder Con Cita