visual practicar para funciones ejercicios ejemplos descargar comandos cadena vb6

practicar - ¿Cuál es la mejor manera de determinar si un personaje es una letra en VB6?



visual basic descargar (9)

Necesita una función que tome un carácter como parámetro y devuelva verdadero si es una letra.


¿Qué hay de malo con lo siguiente, que no se basa en un comportamiento de lenguaje oscuro?

Private Function IsLetter(ByVal ch As String) As Boolean IsLetter = (ch >= "A" and ch <= "Z") or (ch >= "a" and ch <= "z") End Function


Creo que podemos mejorar esto un poco más. El código de rpetrich funcionará, pero quizás solo por suerte. El parámetro de la llamada API debe ser un TCHAR (WCHAR aquí en realidad) y no un Long. Esto también significa que no hay que alterar la conversión a un Long o enmascarar con & HFFFF. Por cierto, esto es Integer y agrega una conversión implícita a Long aquí también. Quizás quiso decir & HFFFF & en este caso?

Además de eso, sería mejor llamar explícitamente al contenedor UnicoWS para esta llamada API, para compatibilidad con Win9X. Puede ser necesario implementar UnicoWS.dll, pero al menos obtenemos esa opción. Por otra parte, tal vez desde VB6 esto se redirige automágicamente, no tengo instalado Win9X para probarlo.

Option Explicit Private Declare Function IsCharAlphaW Lib "unicows" (ByVal WChar As Integer) As Long Private Function IsLetter(Character As String) As Boolean IsLetter = IsCharAlphaW(AscW(Character)) End Function Private Sub Main() MsgBox IsLetter("^") MsgBox IsLetter("A") MsgBox IsLetter(ChrW$(&H34F)) MsgBox IsLetter(ChrW$(&HFEF0)) MsgBox IsLetter(ChrW$(&HFEFC)) End Sub


Esto fue parte del código publicado por rpetrich en respuesta a una pregunta de Joel Spolsky . Sentí que necesitaba una publicación específica para el problema que resuelve. Realmente es brillante.

Private Function IsLetter(ByVal character As String) As Boolean IsLetter = UCase$(character) <> LCase$(character) End Function

Usted puede estar pensando: "¿Esto siempre funcionará?" La documentación sobre las funciones UCase y LCase, confirma que:

Función UCase Solo las letras minúsculas se convierten a mayúsculas; todas las letras mayúsculas y los caracteres que no son letras permanecen sin cambios .

Función LCase Solo las letras mayúsculas se convierten a minúsculas; todas las letras minúsculas y los caracteres que no son letras permanecen sin cambios .


Mirando un poco se produjo lo siguiente ...

Private Declare Function IsCharAlphaA Lib "user32" Alias "IsCharAlphaA" (ByVal cChar As Byte) As Long

Creo que IsCharAlphaA prueba los conjuntos de caracteres ANSI y IsCharAlpha prueba ASCII. Puedo estar equivocado.


No se documenta exactamente. Y puede ser lento. Es un truco inteligente, pero eso es todo. Estaría tentado de ser más obvio en mi verificación. O use expresiones regex o escriba una prueba más obvia.

public bool IsAlpha(String strToCheck) { Regex objAlphaPattern=new Regex("[^a-zA-Z]"); return !objAlphaPattern.IsMatch(strToCheck); } public bool IsCharAlpha(char chToCheck) { return ((chToCheck=>''a'') and (chToCheck<=''z'')) or ((chToCheck=>''A'') and (chToCheck<=''Z'')) }


Yo uso esto en VBA

Function IsLettersOnly(Value As String) As Boolean IsLettersOnly = Len(Value) > 0 And Not UCase(Value) Like "*[!A-Z]*" End Function


La respuesta de IsCharAlphaA de IsCharAlphaA está cerca. El mejor método es usar la versión W así:

Private Declare Function IsCharAlphaW Lib "user32" (ByVal cChar As Integer) As Long Public Property Get IsLetter(character As String) As Boolean IsLetter = IsCharAlphaW(AscW(character)) End Property

Por supuesto, todo esto rara vez importa ya que todos los controles de VB6 son solo ANSI


Private Function IsAlpha(ByVal vChar As String) As Boolean Const letters$ = "abcdefghijklmnopqrstuvwxyz" If InStr(1, letters, LCase$(vChar)) > 0 Then IsAlpha = True End Function


Private Function IsLetter(Char As String) As Boolean IsLetter = UCase(Char) Like "[ABCDEFGHIJKLMNOPQRSTUVWXYZ]" End Function