En 1991, Bill Gates presentaba una gran herramienta de desarrollo… no te lo pierdas!
Felicidades al equipo que ha continuado haciendo de este lenguaje, un lenguaje joven con 20 años experiencia :-).
Uno de los guiños de extensiones de Visual Studio como las Power Tools, son detalles como poder eliminar las referencias no utilizadas y al mismo tiempo ordenarlas.
No es que sea algo crucial, emocionante o imprescindible, pero lo cierto es que sobretodo en proyectos compartidos antes de entregar el ‘release’ final soy de esos que dedica un montón de horas en pulir todo aquello que aunque escrito no tiene ninguna utilidad.
Pienso sinceramente que la calidad del código, también pasa por entregar justo lo que interviene. Asi pues… con el “Remove and Sort Imports” de las power tools y aunque parezca mentira voy a ahorrarme mi tiempecillo J
Saludos,
Pep Lluis,
Desbordamiento de SqlDateTime. Debe estar entre 1/1/1753 12:00:00 AM y 12/31/9999 11:59:59 PM.
En determinados escenarios donde intervienen plataformas en múltiples lenguajes, puede ser necesario implementar unas funciones extras para que la interacción entre formatos se realice correctamente. (sin hablar de las excepciones para tener en cuenta si sumamos el tema de zonas horarias).
Una idea seria realizar la adaptación entre la fecha y hora del objeto (en este caso el DGV) y la asignación de los valores que retornaran, cuando los extremos esperan diferentes formatos.
Puedes capturar el “cellFormating” del DGV y controlar la conversión en el “Parse”.
Aquí tienes un Ejemplo :
http://msdn.microsoft.com/es-es/library/system.windows.forms.datagridview(VS.80).aspx
En otras situaciones donde no disponemos de los “Format” y “Parse” podemos optar por creamos nuestra propia estructura…
‘
‘ Definicion de la estructura para Fecha/Hora
‘ segun la definicion del lpSystemTime
Structure FechaYHora
Public Año As UInt16
Public Mes As UInt16
Public DiaDeLaSemana As UInt16
Public Dia As UInt16
Public Hora As UInt16
Public Minutos As UInt16
Public Segundos As UInt16
Public Milis As UInt16
End Structure
‘Funciones Fecha/Hora sistema
Declare Function GetSystemTime Lib «Kernel32.dll» (ByRef lpSystemTime As FechaYHora) As UInt32
Declare Function SetSystemTime Lib «Kernel32.dll» (ByRef lpSystemTime As FechaYHora) As UInt32
Private MiFechaYHora = New FechaYHora
Sub DelServidor(ByVal FechaHoraOrigen As DateTime)
MiFechaYHora.Año = Convert.ToUInt16(FechaHoraOrigen.Year)
MiFechaYHora.Mes = Convert.ToUInt16(FechaHoraOrigen.Month)
MiFechaYHora.Dia = Convert.ToUInt16(FechaHoraOrigen.Day)
MiFechaYHora.Hora = Convert.ToUInt16(FechaHoraOrigen.Hour)
MiFechaYHora.Minutos = Convert.ToUInt16(FechaHoraOrigen.Minute)
MiFechaYHora.Segundos = Convert.ToUInt16(FechaHoraOrigen.Second)
‘ luego debeis asignarlo segun convenga… desde o hacia el control
‘ o llamando a la funcion de asignar la nueva entrada
SetSystemTime(MiFechaYHora)
End Sub
Espero te ayude,
Pep Lluis,
Fernando, contestando a tu pregunta de cómo capturar los cambios en las señales de control de puerto serie, te dejo este ejemplo básico esperando te sea de utilidad.
Dim MiSerialPort As New IO.Ports.SerialPort
Sub Inicializando()
MiSerialPort.Open()
AddHandler MiSerialPort.PinChanged, AddressOf MiSerialPort_PinChanged
End Sub
Private Sub MiSerialPort_PinChanged(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialPinChangedEventArgs)
Select Case e.EventType
Case IO.Ports.SerialPinChange.CtsChanged
‘Clear To Send
If MiSerialPort.CtsHolding Then
‘CTS esta en ON
Else
‘CTS esta en OFF
End If
Case IO.Ports.SerialPinChange.DsrChanged
‘Data Set Ready
If MiSerialPort.DsrHolding Then
‘DSR esta en ON
Else
‘DSR esta en OFF
End If
Case IO.Ports.SerialPinChange.Ring
‘Ring
Case IO.Ports.SerialPinChange.Break
‘Break
Case IO.Ports.SerialPinChange.CDChanged
‘Carrier Detect
If MiSerialPort.CDHolding Then
‘…
Else
‘….
End If
End Select
End Sub
:-))
Pep Lluis,
I have received a question asking for How I can compute a SHA1 hash.
You can use this function or similar to get 160bit hash.
Imports System.Security.Cryptography
' Computing Hash for SHA1
Function SHA1(ByVal dataStream As String) As Byte()
Dim Ascii As New ASCIIEncoding
Dim tmpsource(dataStream.Length) As Byte
tmpsource = Ascii.GetBytes(dataStream)
Dim sha As New SHA1CryptoServiceProvider()
Return sha.ComputeHash(tmpsource)
End Function
PepLluis,
Many of you are asking how to perform searches on lists as detailed in the previous post using C# syntax. Well in a summary form this would be the equivalent expression:
Muchos de vosotros me estáis pidiendo como realizar búsquedas en listas como la detallada en el post anterior y en C#. Bien de una forma resumida esta sería la expresión equivalente :
public static List<Person> People = new List<Person> … // to do: Populate list
// Find name function
public static Person FindField(string toFind)
{
Person result = People.Find(delegate(Person fl) {return fl.Name == toFind;});
return result;
}
// ..
// ..
// ..
// Class Person
public class Person
{
public string Name { get; set; }
public string surname { get; set; }
public int Age { get; set; }
}
I hope this will be useful,
Pep Lluis,
Dim Personas As New List(Of Persona)
Dim BuscarA = "Yuis"
Sub Prueba()
Personas.AddRange(
{New Persona With {.Nombre = "Pep", .Apellido = "Lluis"},
New Persona With {.Nombre = "Yuis", .Apellido = "Franco"},
New Persona With {.Nombre = "Juansa", .Apellido = "Yopis"},
New Persona With {.Nombre = "Marc", .Apellido = "Rubiño"}
})
Dim ficha As Persona = Personas.Find(AddressOf Buscar)
If ficha IsNot Nothing Then
MessageBox.Show(String.Format("Ficha de : {0} {1}", ficha.Nombre, ficha.Apellido))
Else
MessageBox.Show("Ficha: " & BuscarA & "Inexistente: ")
End If
End Sub
Function Buscar(ByVal p As Persona) As Boolean
If p.Nombre = BuscarA Then
Return True
Else
Return False
End If
End Function
.....
.....
Public Class Persona
Property Nombre As String
Property Apellido As String
Property Edad As Integer
End Class
;-)
Pep Lluis,
Disponer de un Sistema operativo compatible: Windows 7 o Windows Vista
Y además
Puedes seguir toda la evolución leyendo de sus principales fuentes :
Creo que con esto tendréis suficiente material para leer un rato
Saludos,
Pep Lluis,
Respondiendo a una consulta sobre el anterior post de como sacar promedios de cadenas representando valores numéricos y provenientes de una lista, ‘combobox’ o cualquier otro origen en texto :
Dim Consumo As Integer = 0
Dim Consumos = {«10», «11», «21», «31», «41»}
Console.WriteLine((Array.ConvertAll(Consumos,
Function(s) If(Integer.TryParse(s, Consumo), Consumo,
New Integer))).Average)
Espero que os sea practico,
Pep Lluis,
‘ Repasando codigo, aun suelo encontrar las eternas expresiones de formateo de cadenas
‘ heredadas del mas puro estilo 6.0, entre otras estoy hablando de mid, left, right
‘ y como no de format(a,»##,##») y un largo etc.
‘ Nada que objetar! solo recordaros que en .NET podemos salvar la gran mayoria de expresiones
‘ que requieren formato con el uso de los conocidos parametros de substitucion ‘{x}’
‘ :-))
Module Module1
‘
‘ formateando strings
Sub Main()
Dim Cadena As String = «Consumo en Kw : {0}, precio : {1}, total : {2}»
Dim Consumos = {10, 11, 21, 31, 41}
Dim Tarifa = Function(n)
Select Case n
Case Is > 40 : Return 4.6
Case Is > 30 : Return 6.3
Case Is > 20 : Return 8.2
Case Is > 10 : Return 10.5
Case Else : Return 12.4
End Select
End Function
For Each kw In Consumos
Console.WriteLine(String.Format(Cadena, kw.ToString, Tarifa(kw).ToString, (kw * Tarifa(kw)).ToString))
Next
Console.ReadLine()
End Sub
End Module