Ahora si terminado


Bueno ya tiene mucho tiempo q no escribia nada aqui… bueno en este tiempo ya pude al fin liberar el Query Builder, solo q a ultima hora le he agregado una q otra funcionalidad; y ademas ya estoy por terminar otro proyecto q me tomo solo una semana en hacer… mas adelante explicare un poco de codigo, ya q se me hizo una tecnologia muy interesante.
 
En el QB utiliza una tecnica de programacion nueva para mi y es usando DELEGATES, la forma de accesar un control q esta en un diferente Thread, es un poco confuso, pero a continuacion esta el codigo.
 
 

//Se declaran los Delegates

delegate void SetElapsedTimeCallback(TimeSpan elapsedtime);

//Se declaran una instancia de estos delegates

SetElapsedTimeCallback Elapsedtimedelegate;

//Se crea un thread para accesar el delegate

private Thread ElaptimeThread;

 

//aqui se asigna el Delegate a la funcion para cambiar la etiqueta del cronometro

this.Elapsedtimedelegate = new SetElapsedTimeCallback(SetElapsedTime);

 

//Esta funcion es llamada por el thread y es invocada por si misma por el delegate, si el control necesita ser invocado esde su propio thread

private void SetElapsedTime(TimeSpan elapsedtime)

{

if (this.statusStrip1.InvokeRequired)

this.Invoke(this.Elapsedtimedelegate, new object[] { elapsedtime });

else

this.toolStripStatusLabelTime.Text = elapsedtime.ToString().Substring(3,5);

}

 

//este es el thread q manda llamar la funcion de manera asincrona

private void ProcSetElapsedTime()

{

this.SetElapsedTime(this.elapsedtime);

}

 

 

 

//Esta es una Propiedad atravez de la cual le paso el valor q debe tener el cronometro

//manda llamar el thread q manda llamar la funcion q manda llamar el delegate q la manda llamar a si misma

private TimeSpan ElapsedTime

{

get

{

return this.elapsedtime;

}

set

{

this.elapsedtime = value;

this.ElaptimeThread = new Thread(new ThreadStart(this.ProcSetElapsedTime));

this.ElaptimeThread.Start();

}

}

 

Como se puede ver, es un poco enredado, pero segun Microsoft es una manera segura de cambiar las propiedades de un control q esta en diferente thread, lo q sucede es q cuando se manda cambiar un valor de un conrol en este caso, yo actualizo el valor de la etiqueta de un cronometro mientras incremento el numero de registros regresados por el QB, el thread se invoca asi mismo hasta q en determiando punto sea llamado por el mismo thread en q esta contenido, entonces si es llamado de diferente thread simplemente no se actualiza.

 

Bueno esto sucedio debido a q para crear la tabla de registros uso un componente q es el

backgroundWorker, y es muy sencillo de usar, estas son las funciones q ejecuto utilizando el componente:

 

 

private void toolStripButtonCancel_Click(object sender, EventArgs e)

{

this.backgroundWorker1.CancelAsync();

}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)

{

this.Runquery();

if (this.backgroundWorker1.CancellationPending)

this.status = RunStatus.Cancelled;

else

{

if (this.RowLimit <= this.RowCount)

this.status = RunStatus.RowsLimited;

else

this.status = RunStatus.Stopped;

}

}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

{

this.SetStatus(this.status);

this.QueryBox = this.qbDataGrid1.WhereQuery;

this.FormBorderStyle = FormBorderStyle.Sizable;

this.statusStrip1.SizingGrip = true;

this.excelControl1.ShowPopUp(true);

}

private void button1_Click(object sender, EventArgs e)

{

this.RowCount = 0;

this.ElapsedTime = new TimeSpan(0);

this.QueryStatus = RunStatus.Executing;

this.statusStrip1.SizingGrip = false;

if (!this.backgroundWorker1.IsBusy)

this.backgroundWorker1.RunWorkerAsync();

}

 

Todos los eventos son declarados en las mismas propiedades del componente y lo unico q hay q hacer es escribir el codigo q se ejecutara en determinados eventos.

 

 

Advertisements