Mostrando entradas con la etiqueta C #. Mostrar todas las entradas
Mostrando entradas con la etiqueta C #. Mostrar todas las entradas

jueves, 9 de agosto de 2012

el proceso no puede obtener acceso al archivo porque está siendo utilizado en otro proceso


el proceso no puede obtener acceso al archivo porque está siendo utilizado en otro proceso vb.net
el proceso no puede obtener acceso al archivo porque está siendo utilizado en otro proceso vb.net
La función que adjunta el fichero, lo deja abierto. No se porque, pero es así.
La idea general es crear el fichero en memoria y adjuntar ese fichero en memoria con el nombre que quieras.
Esta clase lo hace:
Imports System.Net.Mail
Imports System.Text
Imports System.Net
Public Class FrmEmail
Public Shared Function SendEMail(ByVal strOrigen As String, ByVal strDestinatario As String, ByVal strAsunto As String, ByVal strMsg As String, ByVal usuario As String, ByVal Clave As String, ByVal smtp As String, ByVal Adjunto As String) As Boolean
Dim msg As New MailMessage()
msg.[To].Add(New MailAddress(strDestinatario))
msg.From = New MailAddress(strOrigen)
msg.Subject = strAsunto
msg.Body = strMsg
‘Adjuntar fichero. No se puede ajuntar el fichero tal cual, pues se queda bloqueado.
Dim contentAsBytes As Byte() = Encoding.UTF8.GetBytes(Adjunto)
Dim memStream As System.IO.MemoryStream = New System.IO.MemoryStream(contentAsBytes)
Dim streamWriter As System.IO.StreamWriter = New System.IO.StreamWriter(memStream)
streamWriter.Flush()
memStream.Position = 0
Dim thisAttachment As Attachment = New Attachment(memStream, vbNull) ‘ “image/jpeg”)
Dim F As Long
Dim FileNameAdjunto As String
F = InStrRev(Adjunto, “\”)
If F = 0 Then
FileNameAdjunto = Adjunto
Else
FileNameAdjunto = Adjunto.Substring(F)
End If
thisAttachment.ContentDisposition.FileName = FileNameAdjunto
msg.Attachments.Add(thisAttachment)
‘msg.Attachments.GetEnumerator()
Dim clienteSmtp As New SmtpClient(smtp)
clienteSmtp.Credentials = New NetworkCredential(usuario, Clave)
Try
clienteSmtp.Send(msg)
Return True
Catch ex As Exception
MsgBox(ex.Message)
Return False
End Try
End Function
End Class

viernes, 10 de febrero de 2012

C# – Comunicar formularios de forma desacoplada


Introducción
El objetivo de esta guía es demostrar como posibilitar la comunicación de formulario de una forma optima, haciendo uso de buenas practicas, y además bajando al mínimo el acoplamiento entre los formulario.
Para cumplir el objetivo es que se hará uso de interfaces, las cuales permitirán desacoplar la comunicación entre formulario.
Comunicación simple entre formularios
En este ejemplo se confeccionara una utilidad simple, básicamente se procederá a la apertura de un formulario, y la escritura cuadros de texto.
Primer Paso – Creación de los formularios
Lo primero que será necesario crear son los dos formulario los cuales intervendrán en la comunicación, esta operación se hace de forma simple como seguramente ya es conocida por todos. Los mismos contaran con sus respectivos cuadros de texto, y botones que permitirán las acciones entre ellos
Segundo Paso - Definición de la interfaz
En al interfaz se definirá la acción que será llevada a cabo en la comunicación, en este caso sera algo simple como copiar el contenido del formulario hijo al padre
Para ello se ha creado un archivo de nombre IForm.cs, el cual contendrá dicha definición.
1.public interface IForm
2.{
3.void ChangeTextBoxText(string text);
4.}
como podrá preciarse es muy simple solo define el contrato que permitirá luego desacoplar las interfaces
Tercer Paso – Implementación de la interfaz, llamada al formulario hijo
La interfaz anteriormente creada será implementada por el formulario del cual se quiere recibir la acción, en este caso será el form principal, o sea quien realiza la llamada.
01.public partial class Form1 : Form, IForm
02.{
03.public Form1()
04.{
05.InitializeComponent();
06.}
07. 
08.#region IForm Members
09. 
10.public void ChangeTextBoxText(string text)
11.{
12.TextBox1.Text = text;
13.}
14. 
15.#endregion
16. 
17.private void Button1_Click(object sender, EventArgs e)
18.{
19.Form2 form2 = new Form2();
20.form2.Show(this);
21.}
22.}
Hay que resaltar varias partes en esta sección de código:
- se notara en la primer línea como el formulario define la implementación de la interfaz
- la región establecida en el código, denota la implementación concreta de la misma, entre las líneas 8 al 15
También hay que remarcar como se realiza la apertura del formulario hijo, debe notarse el uso del parámetro en el método Show(), es allí donde se especifica quien será el owner, en este caso se hace uso de this ya que el formulario donde estamos en ese momento será quien realiza la apertura.
Cuarto Paso – Comunicación desde el formulario hijo
En esta ultima sección se visualizara como el formulario hijo envía datos al padre.
01.public partial class Form2 : Form
02.{
03.public Form2()
04.{
05.InitializeComponent();
06.}
07. 
08.private void Button1_Click(object sender, EventArgs e)
09.{
10.IForm formInterface = this.Owner as IForm;
11. 
12.if(formInterface != null)
13.formInterface.ChangeTextBoxText(TextBox1.Text);
14.}
15. 
16.}
En el código se puede apreciar claramente el uso de la propiedad Owner junto al this que en este caso representa al Form2.
Es interesante además remarcar la necesidad de castear la propiedad, en este caso particular se realiza mediante el uso de “as” Es muy útil hacer uso de este ya que ante una imposibilidad o error de casteo la aplicación no producirá un error, en este caso simplemente la variable obtendrá el valor null, es por ello que se hace uso del “if” para preguntar si pudo realizar la conversión de tipos.
Conclusión
Bueno después de analizar el ejemplo verán como por medio de un simple interfaz se logra desacoplar las dependencias entre formulario facilitando la comunicación entre ellos, la simple definición de un contrato asegura que el formulario hijo pueda interactuar ya no solo con un forma padre único, sino con cualquier otro formulario que lo utilice e implemente la interfaz.
[C#]
[VB.NET]