Что состоит в том, чтобы определить лучший способ, является ли символ буквой в VB6?

В v21 библиотеки поддержки теперь есть решение этого: он называется RoundedBitmapDrawable .

Он в основном похож на обычный Drawable, за исключением того, что вы даете ему угловой радиус для отсечения с помощью:

setCornerRadius(float cornerRadius)

Итак, начиная с Bitmap src и цели ImageView, он будет выглядеть примерно так:

RoundedBitmapDrawable dr = RoundedBitmapDrawableFactory.create(res, src);
dr.setCornerRadius(cornerRadius);
imageView.setImageDrawable(dr);

5
задан 2 revs 18 September 2008 в 20:18
поделиться

8 ответов

Seanyboy IsCharAlphaA ответ близок. Лучший метод должен использовать версию W как так:

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

Конечно, это все редко имеет значение, поскольку всеми средствами управления VB6 является ANSI только

4
ответ дан 18 December 2019 в 10:51
поделиться

Это было частью кода, отправленного rpetrich в ответ на вопрос Joel Spolsky. Я чувствовал, что этому было нужно сообщение, характерное для проблемы, которую это решает. Это действительно является блестящим.

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

Можно ли думать себе, "Это будет всегда работать?" Документация относительно UCase и функций LCase, подтверждает, что это будет:

Функция UCase Только строчные буквы преобразовывается в верхний регистр; все прописные буквы и символы небуквы остаются неизменными.

Функция LCase Только прописные буквы преобразовывается в нижний регистр; все строчные буквы и символы небуквы остаются неизменными.

10
ответ дан 18 December 2019 в 10:51
поделиться
Private Function IsLetter(Char As String) As Boolean
    IsLetter = UCase(Char) Like "[ABCDEFGHIJKLMNOPQRSTUVWXYZ]"
End Function
2
ответ дан 18 December 2019 в 10:51
поделиться

Что случилось со следующим, которое не полагается на неясное поведение языка?

Private Function IsLetter(ByVal ch As String) As Boolean
    IsLetter = (ch >= "A" and ch <= "Z") or (ch >= "a" and ch <= "z")
End Function
1
ответ дан 18 December 2019 в 10:51
поделиться

Оглядывание немного придумало следующее...

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

Я полагаю, что IsCharAlphaA тестирует наборы символов ANSI, и IsCharAlpha тестирует ASCII. Я могу быть неправым.

0
ответ дан 18 December 2019 в 10:51
поделиться

Это точно не документирует себя. И это может быть медленно. Это - умный взлом, но это - все, что это. Я испытал бы желание быть более очевидным в своей проверке. Или используйте regex's или запишите более очевидный тест.

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'))
}
-2
ответ дан 18 December 2019 в 10:51
поделиться
Private Function IsAlpha(ByVal vChar As String) As Boolean
  Const letters$ = "abcdefghijklmnopqrstuvwxyz"

  If InStr(1, letters, LCase$(vChar)) > 0 Then IsAlpha = True
End Function
0
ответ дан 18 December 2019 в 10:51
поделиться

Я считаю, что мы можем немного улучшить это. Код rpetrich будет работать, но, возможно, только по счастливой случайности. Параметр вызова API должен быть TCHAR (здесь на самом деле WCHAR), а не Long. Это также означает, что вам не нужно возиться с преобразованием в Long или маскированием с помощью & HFFFF. Это, кстати, Integer и здесь тоже добавляется неявное преобразование в Long. Возможно, в данном случае он имел в виду & HFFFF &?

Вдобавок к этому может быть лучше явно вызвать оболочку UnicoWS для этого вызова API для совместимости с Win9X. Возможно, потребуется развернуть UnicoWS.dll, но, по крайней мере, у нас есть такая возможность. С другой стороны, может быть, из VB6 это автоматически перенаправляется, у меня нет установленной Win9X для тестирования.

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
1
ответ дан 18 December 2019 в 10:51
поделиться