Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

 
 
Herramientas Buscar en Tema Desplegado
  #4  
Antiguo 17-05-2025
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 360
Poder: 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
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

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


La franja horaria es GMT +2. Ahora son las 05:56:40.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi