![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
#4
|
|||
|
|||
|
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;
}
En el evento Button1Click: Código:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ProgressBar1->Position = 0;
ProgressBar1->Max = 100;
new TGuardarRichEditThread(RichEdit1, "salida.txt", ProgressBar1);
}
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. |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| problema SaveToFile | noelr | C++ Builder | 2 | 13-12-2011 19:47:09 |
| SaveToFile en campo blob y Delphi XE no funciona | Antoniov | Conexión con bases de datos | 1 | 26-08-2011 17:06:24 |
| Utilizar SaveToFile y LoadToFile | creus | Varios | 7 | 06-12-2006 03:28:52 |
| Indy SaveToFile Caracteres Especiales | gluglu | Internet | 4 | 06-05-2006 09:35:33 |
| Parte de un RichEdit a otro RichEdit (donde esté el cursor) | Tomy | Varios | 3 | 21-12-2005 21:08:15 |
|