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.