![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
|
RichEdit->SaveToFile
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 |
|
#2
|
|||
|
|||
|
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 |
|
#3
|
|||
|
|||
![]() ![]() 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.");
}
}
//---------------------------------------------------------------------------
|
|
#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 |
|