Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   RichEdit->SaveToFile (https://www.clubdelphi.com/foros/showthread.php?t=97202)

Saltimbanki 02-02-2025 17:06:31

RichEdit->SaveToFile
 
1 Archivos Adjunto(s)
Hola, estoy creandome un programilla que simula un diario con un un RichEdit.
A la hora de grabar los datos mediante SaveToFile si el RichEdit contiene imagenes el tiempo de grabacion es considerable y ya no estas seguro de si se ha quedado colgado o no. Mientras esta el SaveToFile ejecutandose como podria meter un ProgressBar para "seguir" la grabacion y no desesperarte ??

Ahora mismo lo tengo chapucero puesto que he creado un Form que lo visualizo ( Show ) justo antes del SaveToFile, mi intencion era poner hay una animacion en el Form pero se me "queda pillao" y solo muestra el Caption del Form.

Adjunto el Form que he diseñado para la accion de leer/grabar los datos del diario, como podria meter una animacion o un ProgressBar en este Form y que se visualoce en toempo de ejecucion ??

Gracias

chenech 02-02-2025 19:24:11

Creo que deberías usar un Threading, creo que se llama así, no lo he usado nunca pero te permite tener una animación o una barra de progreso en paralelo a la ejecución del programa.
Aquí mismo tienes muchos ejemplos:
https://www.clubdelphi.com/foros/sho...ight=Threading

navbuoy 03-04-2025 18:10:38



mira te he hecho un ejemplo con el TMS AdvRichEditor que es el que permite pegar imagenes con el portapapeles

Código:

//---------------------------------------------------------------------------

#include <vcl.h>

#include <fstream>  // Para manipulación de archivos

#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "AdvRichEditor"
#pragma link "AdvRichEditorBase"
#pragma link "AdvScrollControl"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
        ProgressBar1->Min = 0;
        ProgressBar1->Position = 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (SaveDialog1->Execute()) {
                String fileName = SaveDialog1->FileName;

                // Verificar si hay contenido en el editor
                if (AdvRichEditor1->LineCount() == 0) {
                        ShowMessage("No hay contenido para guardar.");
                        return;
                }

                int totalLines = AdvRichEditor1->LineCount();
                ProgressBar1->Max = totalLines;
                ProgressBar1->Position = 0;

                // Crear un archivo y guardar el contenido
                AdvRichEditor1->SaveToFile(fileName);  // Guardar directamente con SaveToFile

        // Simular progreso ya que SaveToFile no actualiza la UI
                for (int i = 0; i < totalLines; i++) {
                        ProgressBar1->Position = i + 1;
                        Application->ProcessMessages();  // Permite actualizar la UI durante el guardado
                }

                ShowMessage("Archivo guardado correctamente.");
        }
}
//---------------------------------------------------------------------------


navbuoy 17-05-2025 17:08:48

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.


La franja horaria es GMT +2. Ahora son las 14:52:47.

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