VBA работает с Unicod, а VB6 нет?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Matv
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 13.11.2002 (Ср) 9:20
Откуда: Украина, Харьков

VBA работает с Unicod, а VB6 нет?

Сообщение Matv » 04.12.2008 (Чт) 12:41

Часто бывают глюки, т.н. иероглифы. Для того, что бы их прочитать у меня в Word есть простенький макрос
Код: Выделить всё
Sub Макрос5()
    Dim i%, t$, s$, s1$, a%
    s = Selection.Text
    s1 = ""
    If Len(s) > 32000 Then
        MsgBox "Уменьшите выделенную область", vbCritical, "Прерывание программы"
        Exit Sub
    End If
    For i = 1 To Len(s)
        t = Mid(s, i, 1)
        On Error GoTo Err
        a = AscW(t)
        If a > 255 Then
            s1 = s1 + t
        Else
            s1 = s1 + Chr(AscW(t))
        End If
    On Error GoTo 0
1   Next i
    Selection.Text = s1
Exit Sub
Err: s1 = s1 + t
    GoTo 1
End Sub


"Иероглифы" вставляются в Word, выделяются и вызывается макрос, который их перекодирует.

Хотел написать аналогичное в VB6. Но не получается. Исходные "иероглифы" невозможно ввести в качестве исходных данных без искажения. Пробовал и вставить из clipboad в текстовое окно и пользоваться функцией
Код: Выделить всё
  Dim hStrPtr As Long, lLength As Long, sBuffer As String
    OpenClipboard Me.hwnd
    hStrPtr = GetClipboardData(CF_TEXT)
    If hStrPtr <> 0 Then
        lLength = lstrlen(hStrPtr)
        If lLength > 0 Then
            sBuffer = Space$(lLength)
            CopyMemory ByVal sBuffer, ByVal hStrPtr, lLength
           
        End If

не получается. Можно как то вставить скопированные "иероглифы" без искажения, как это делает Word?

P.S. Private Const CF_TEXT = 1
Может тут другое значение?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: VBA работает с Unicod, а VB6 нет?

Сообщение tyomitch » 04.12.2008 (Чт) 13:12

Как человек, живущий вне CP-1251 и поэтому сталкивающийся с иероглифами регулярно, поделюсь своим декодером:

Код: Выделить всё
Sub Main()
Dim s As String, b() As Byte
s = Clipboard.GetText
ReDim b(Len(s))
WideCharToMultiByte CP_ACP, 0, ByVal StrPtr(s), Len(s), b(0), Len(s), 0, ByVal 0&
MultiByteToWideChar 1251, 0, b(0), Len(s), ByVal StrPtr(s), Len(s)
MessageBoxW 0, StrPtr(s), 0, 0
End Sub


Тебе, похоже, надо CP_ACP заменить на 1252

Можно использовать и цикл, как в твоей версии для VBA; важно просто иметь в виду, что и текстбокс, и GetClipboardDataA съедят все символы вне CP_ACP.
Изображение

Matv
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 13.11.2002 (Ср) 9:20
Откуда: Украина, Харьков

Re: VBA работает с Unicod, а VB6 нет?

Сообщение Matv » 04.12.2008 (Чт) 13:56

В моём справочнике API функций почему то нет описания MultiByteToWideChar, хотя WideCharToMultiByte - есть.Есть под рукой её объявление?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: VBA работает с Unicod, а VB6 нет?

Сообщение Antonariy » 04.12.2008 (Чт) 14:59

Учись искать пока бесплатно.
Лучший способ понять что-то самому — объяснить это другому.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: VBA работает с Unicod, а VB6 нет?

Сообщение SLIM » 04.12.2008 (Чт) 16:24

Off:
А чир, ожидается что платно будет?.....кризис е мое.)))))
Пишите жизнь на чистовик.....переписать не удастся.....


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 88

    TopList