Actualizar ProgressBar desde una clase

31/01/2006 - 21:58 por Hernan Fuccillo | Informe spam
Tengo una aplicacion que copia archivos via FTP, con una interfaz grafica que
muestra el progreso de cuanto va copiando. La estructura de mi aplicacion es
un FORM que contiene el progressbar y que instancia una clase UPLOAD, que a
su vez instancia otra clase FTPTool que es la que contiene el manejo de los
comandos FTP y sockets. Bien, el tema es que la funcionalidad que actualiza
el progressbar debe estar en FTPTool dado que hay hago el calculo de cuantos
paquetes envio para saber el porcentaje de progreso, debo hacerlo asi porque
estoy trabajando con threads por lo que no me permite consultar el objeto
desde el FORM principal.
Investigue y pude generar un evento en la clase, pero solo pude hacerlo
entre un FORM y una clase, yo aca tengo un FORM que instancia a una clase
(UPLOAD) que a su vez esta, instancia a otra clase (FTPTool), si alguien
puede ayudarme o enviarme algun codigo de ejemplo le estare muy agradecido.l
 

Leer las respuestas

#1 José Escrich
01/02/2006 - 05:10 | Informe spam
Hernan,

utiliza eventos y delegados, quizas encadenados... declaras tu evento en
la clase de "más abajo" FTPTool y que internamente lo provoque luego en upload
le seteas el delegado que a su vez tambien tendra un evento similar el cual
lanzas y ya lo capturas desde tu form.

Aquí tienes un ejemplo práctico:

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
Upload upload = new Upload();
upload.SucessfullUpload += new Upload.SucessfullUploadFileEventHandler(upload_SucessfullUpload);
upload.Execute();
}

void upload_SucessfullUpload(object sender, EventArgs e)
{
Console.WriteLine("Upload file sucessfull message, or whatever
you do like do");
}
}

public class Upload
{
public delegate void SucessfullUploadFileEventHandler(object sender,
EventArgs e);
public event SucessfullUploadFileEventHandler SucessfullUpload;

public void Execute()
{
RunFtpTool();
}

public void RunFtpTool()
{
FtpTool ftpTool = new FtpTool();
ftpTool.ExecuteFinished += new FtpTool.ExecuteFinishedEventHandler(ftpTool_ExecuteFinished);
ftpTool.Execute();
}

protected void OnSucessfullUpload(EventArgs e)
{
if (SucessfullUpload != null)
SucessfullUpload(this, e);
}

protected void ftpTool_ExecuteFinished(object sender, EventArgs e)
{
OnSucessfullUpload(e);
}
}

public class FtpTool
{
public delegate void ExecuteFinishedEventHandler(object sender, EventArgs
e);
public event ExecuteFinishedEventHandler ExecuteFinished;

public void Execute()
{
Console.WriteLine("executing ftptool");
OnExecuteFinished(EventArgs.Empty);
}

protected virtual void OnExecuteFinished(EventArgs e)
{
if (ExecuteFinished != null)
ExecuteFinished(this, e);
}
}

fijate si te trabas al momento de ponerle los threads, pingea por aquí y
lo vemos.
saludos, espero te sirva.

José Escrich
jescrich (a) gmail.com
http://latincoder.com

HH> Tengo una aplicacion que copia archivos via FTP, con una interfaz
HH> grafica que
HH> muestra el progreso de cuanto va copiando. La estructura de mi
HH> aplicacion es
HH> un FORM que contiene el progressbar y que instancia una clase
HH> UPLOAD, que a
HH> su vez instancia otra clase FTPTool que es la que contiene el manejo
HH> de los
HH> comandos FTP y sockets. Bien, el tema es que la funcionalidad que
HH> actualiza
HH> el progressbar debe estar en FTPTool dado que hay hago el calculo de
HH> cuantos
HH> paquetes envio para saber el porcentaje de progreso, debo hacerlo
HH> asi porque
HH> estoy trabajando con threads por lo que no me permite consultar el
HH> objeto
HH> desde el FORM principal.
HH> Investigue y pude generar un evento en la clase, pero solo pude
HH> hacerlo
HH> entre un FORM y una clase, yo aca tengo un FORM que instancia a una
HH> clase
HH> (UPLOAD) que a su vez esta, instancia a otra clase (FTPTool), si
HH> alguien
HH> puede ayudarme o enviarme algun codigo de ejemplo le estare muy
HH> agradecido.

Preguntas similares