Ver Mensaje Individual
  #4  
Antiguo 17-05-2025
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 360
Reputación: 3
navbuoy Va por buen camino
Te doy un ejemplo con Threading

�� Concepto clave:
El problema es que TRichEdit.Lines.SaveToFile no ofrece callbacks de progreso. Así que no hay forma de saber el avance línea a línea a menos que lo hagas tú mismo, línea por línea.

�� COMPONENTES en el Form (por ejemplo, Form1):

TRichEdit llamado RichEdit1

TProgressBar llamado ProgressBar1

TButton llamado Button1

✅ Paso 1: Crear una clase derivada de TThread
Agrega esto en el encabezado de tu Form1 o en un archivo aparte:

Código:
class TGuardarRichEditThread : public TThread
{
private:
    TRichEdit* RichEdit;
    String FileName;
    TProgressBar* ProgressBar;
protected:
    void __fastcall Execute();
    void __fastcall UpdateProgress(int Porcentaje);
public:
    __fastcall TGuardarRichEditThread(TRichEdit* ARichEdit, String AFileName, TProgressBar* AProgressBar);
};

✅ Paso 2: Implementación del hilo
En el .cpp de tu formulario:

Código:
__fastcall TGuardarRichEditThread::TGuardarRichEditThread(TRichEdit* ARichEdit, String AFileName, TProgressBar* AProgressBar)
    : TThread(true) // true = no se ejecuta inmediatamente
{
    FreeOnTerminate = true;
    RichEdit = ARichEdit;
    FileName = AFileName;
    ProgressBar = AProgressBar;
    Resume(); // Ahora sí se ejecuta
}

void __fastcall TGuardarRichEditThread::Execute()
{
    TStringList* SL = new TStringList();
    try
    {
        int total = RichEdit->Lines->Count;
        for (int i = 0; i < total; i++)
        {
            SL->Add(RichEdit->Lines->Strings[i]);

            int porcentaje = ((i + 1) * 100) / total;

            Synchronize([&]()
            {
                UpdateProgress(porcentaje);
            });

            Sleep(5); // Simulación de retardo, opcional
        }

        SL->SaveToFile(FileName);
    }
    __finally
    {
        delete SL;
    }
}

void __fastcall TGuardarRichEditThread::UpdateProgress(int Porcentaje)
{
    ProgressBar->Position = Porcentaje;
}
✅ Paso 3: Código del botón para iniciar el guardado
En el evento Button1Click:

Código:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    ProgressBar1->Position = 0;
    ProgressBar1->Max = 100;

    new TGuardarRichEditThread(RichEdit1, "salida.txt", ProgressBar1);
}
�� Resultado:
Guarda línea por línea.

La barra de progreso se actualiza sin colgar la interfaz.

Es 100% compatible con C++ Builder desde versiones como 2005 hasta actuales.
Responder Con Cita