Некоректное отображение шрифтов на форме

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
AndreyG_80
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 169
Зарегистрирован: 10.03.2006 (Пт) 13:27

Некоректное отображение шрифтов на форме

Сообщение AndreyG_80 » 17.07.2006 (Пн) 10:43

Всем доброго времени суток

У меня есть БД в Access. В которой хранятся русские и немецкие слова. И на форме лежит Label в котором я эти слова отображаю, переключая Charset мерду кирилицой и центральноевропейским.
В чем проблема:
когда я читаю с базы и пытаюсь отобразить слово "Grüß" (такой вид оно имеет в базе), то оно отображает "Gru?"
Код: Выделить всё
lblAntwort.Font.Charset=238
lblAntwort.Caption = rsTest.Fields("Word")


когда я присваиваю lblAntwort.Caption это слово, оно имиет такой вид в редакторе VB
Код: Выделить всё
lblAntwort.Font.Charset=238
lblAntwort.Caption = "GrьЯ"

то в этом случае в Label отображаеться коректно

что то я тут такого наплел... надеюсь понятно объяснил проблему

Как мне коректно отображать намецкие слова на форме?

З.Ы. С отображением русских слов никаких проблем нет, покрайней мере в руской винде. Предполагаю, что в немейкой винде немецкие слова будут коректно отображаться, а русские - нет.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 17.07.2006 (Пн) 10:52

Боюсь ошибиться, но аналогичный вопрос был около месяца назад, стоит поискать

[edit]гм... был, и даже задан тем же автором...[/edit]
Весь мир матрица, а мы в нем потоки байтов!

AndreyG_80
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 169
Зарегистрирован: 10.03.2006 (Пт) 13:27

Сообщение AndreyG_80 » 17.07.2006 (Пн) 11:05

Был... , но немного не такой, а про отображение шрифтов на форме, а в этом случае шрифты отображаються нормально, кроме того случая, когда я присваиваю Label'у значение из рекордсета

AndreyG_80
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 169
Зарегистрирован: 10.03.2006 (Пт) 13:27

Сообщение AndreyG_80 » 17.07.2006 (Пн) 11:08

Мля, я уже запутался с этими долбаными шрифтами, они даже в самой винде работают коряво.
Например в русской винде некоректно отображаеться немецкий, а в немецкой винде - вместо кирилицы какие-то каракули.

Подскажите в конкретном случае, как это победить?

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 17.07.2006 (Пн) 13:31

Мля, я уже запутался с этими долбаными шрифтами, они даже в самой винде работают коряво.
Например в русской винде некоректно отображаеться немецкий, а в немецкой винде - вместо кирилицы какие-то каракули.

Лечится использованием Юникода
Изображение

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

Сообщение tyomitch » 17.07.2006 (Пн) 14:42

keks-n писал(а):
Мля, я уже запутался с этими долбаными шрифтами, они даже в самой винде работают коряво.
Например в русской винде некоректно отображаеться немецкий, а в немецкой винде - вместо кирилицы какие-то каракули.

Лечится использованием Юникода

Далеко не все проги понимают Юникод. VB6 в числе не понимающих.
Изображение

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 17.07.2006 (Пн) 15:31

DrawTextW спасет отца российской демократии?
Моду создают модоки, а распространяют модозвоны.

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

Сообщение tyomitch » 17.07.2006 (Пн) 15:53

Гм. Все контролы предлагаешь рисовать вручную? :-/
Изображение

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 17.07.2006 (Пн) 15:56

У него же
AndreyG_80 писал(а):на форме лежит Label

Ради отображения пары строчек можно дернуть DrawText :)
Моду создают модоки, а распространяют модозвоны.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 17.07.2006 (Пн) 16:20

tyomitch писал(а):Гм. Все контролы предлагаешь рисовать вручную? :-/


Проще съехать на VB.NET. Или все формы делать на самом-же Access (в его последних версиях юникод поддерживается).

Ну не добиться от родных VB6 компонентов полноценного понимания юникода при всем желании. И не только к VB6 это относится - попробуйте в том-же The Bat! выставить немецкий на русской локали - результат будет аналогичен.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

AndreyG_80
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 169
Зарегистрирован: 10.03.2006 (Пт) 13:27

Сообщение AndreyG_80 » 26.07.2006 (Ср) 3:43

Скорее всего VB здесь не причем, просто с рекордсета возвращаеться строка в Юникоде, а для VB ее нужно переделать ее в ASCII. Как это сделать?

AndreyG_80
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 169
Зарегистрирован: 10.03.2006 (Пт) 13:27

Сообщение AndreyG_80 » 26.07.2006 (Ср) 3:57

Я попытался перевести - работает и на форме теперь не "каракули", а нормальные буквы, то что и нужно было увидеть.
Но перевод Юникода в ASCII какой-то корявый.
Код: Выделить всё
Dim stt As String
stt = ""
For xxx = 1 To Len(rsTest.Fields("Word"))
   stt = stt & Chr(AscW(Mid(rsTest.Fields("Word"), xxx, 1)))
Next xxx

Я надеюсь я правильно понял, что из рекордсета строка приходит в Юникоде - rsTest.Fields("Word"), а строка stt - имеет ASCII кодировку которую используют элементы управления VB.

Как такое же приобразование можно произвести со всей строкой, а не посимвольнго?

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

Сообщение tyomitch » 26.07.2006 (Ср) 6:53

Во-первых, StrConv.
Во-вторых, в VB все строки в Юникоде -- и в рекордсетах, и в остальных контролах; и такие лажовые преобразования вручную не нужны вовсе.
В-третьих, http://vbstreets.ru/VB/Articles/66364.aspx
Изображение

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 26.07.2006 (Ср) 7:36

tyomitch писал(а):Во-первых, StrConv.
Во-вторых, в VB все строки в Юникоде -- и в рекордсетах,


Ну если быть точным то Recordset это не совсем VB.
И уенкод там или нет - зависит от таблицы (даже в Access или MS SQL).

tyomitch писал(а): и в остальных контролах; и такие лажовые преобразования вручную не нужны вовсе.


Контролы в VB6 неуенкодные. Для некоторых помогают игры с StrConv и сменой CharSet контрола, но далеко не для всех - в тот-же Label, к примеру, немецкие умляуты на русской Windows ты не выведешь...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 26.07.2006 (Ср) 7:39

AndreyG_80 писал(а):Я надеюсь я правильно понял, что из рекордсета строка приходит в Юникоде


Строка она всегда сама по себе уенкодная.
А вот как хранятся символы в таблице - зависит уже от собственно таблицы...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

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

Сообщение tyomitch » 26.07.2006 (Ср) 8:17

Andrey Fedorov писал(а):
tyomitch писал(а):Во-первых, StrConv.
Во-вторых, в VB все строки в Юникоде -- и в рекордсетах,


Ну если быть точным то Recordset это не совсем VB.
И уенкод там или нет - зависит от таблицы (даже в Access или MS SQL).

Во всех COM-объектах, включая контролы VB и рекордсеты, Юникод. Название которого ты раз за разом печатаешь как-то странно.

Andrey Fedorov писал(а):
tyomitch писал(а): и в остальных контролах; и такие лажовые преобразования вручную не нужны вовсе.


Контролы в VB6 неуенкодные. Для некоторых помогают игры с StrConv и сменой CharSet контрола, но далеко не для всех - в тот-же Label, к примеру, немецкие умляуты на русской Windows ты не выведешь...

Это не потому, что в свойство Caption нужно совать ANSI-строку, как пытается автор, а потому что отрисовка ведётся через ANSI-функции. Снаружи лейбл юникодный.
Изображение

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 26.07.2006 (Ср) 8:33

tyomitch писал(а):Во всех COM-объектах, включая контролы VB и рекордсеты, Юникод. Название которого ты раз за разом печатаешь как-то странно.


Имхо ты все-же несколько путаешь.
Уенкодна лишь собственно переменная строки. А в Recordset помещаются данные из таблицы, в которой поле может быть уенкодным или нет - зависит уже от свойств поля собственно таблицы.

По настоящему уенкодный контрол не требует никаких танцев со строкой а-ля StrConv для правильного отображения символов. Именно так в NET (где контролы уенкодны по определению).

tyomitch писал(а):Снаружи лейбл юникодный.


Снаружи это как? Умляуты с русской локалью в него выведешь, ну или там русский и арабский одновременно? Да и пофиг каков он снаружи или внутри, если для работы с ним при уенкоде требуются танец с бубнами...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 26.07.2006 (Ср) 8:44

tyomitch писал(а):Юникод. Название которого ты раз за разом печатаешь как-то странно.


Да ладно уж придираться - тут просто дурная привычка...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

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

Сообщение tyomitch » 26.07.2006 (Ср) 8:50

Снаружи -- в том смысле, что никто мне не мешает засунуть в лейбл юникодную строку с арабским и умляутами.

То, что ничего из этого на лейбле не нарисуется -- его внутреннее дело.

То же и с рекордсетом: как бы ни хранились строки в таблице, хоть в KOI-8, отдаёт он их в Юникоде.

Это я к тому, что при передаче строк из одного контрола в другой переводы в Юникод и обратно бессмысленны. Если контрол внутри себя не умеет работать с переданной ему юникодной строкой, то StrConv-ами это никак не обойти.
Изображение

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 26.07.2006 (Ср) 9:10

tyomitch писал(а):То же и с рекордсетом: как бы ни хранились строки в таблице, хоть в KOI-8, отдаёт он их в Юникоде.


Точнее просто преобразует в строку.

tyomitch писал(а):Если контрол внутри себя не умеет работать с переданной ему юникодной строкой, то StrConv-ами это никак не обойти.


Кое что можно, например, вывести в разные колонки Grid-a надписи на разных языках. Или в TextBox умляуты. Именно играясь с StrConv и CharSet. Но сам-то контрол от этого не становится юникодным ибо требуются танцы. Да к тому-же далеко не все контролы VB6 реагируют на CharSet (даже при наличии у них такого свойства).

А ты еще говоришь при этом что все контролы в VB6 юникодные...

То что им Сaption можно присвоить строку вовсе не означает что контрол поддерживает юникод. Вот когда он корректно отобразит строку юникода, причем безо всяких танцев...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

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

Сообщение tyomitch » 26.07.2006 (Ср) 10:08

Andrey Fedorov писал(а):А ты еще говоришь при этом что все контролы в VB6 юникодные...

То что им Сaption можно присвоить строку вовсе не означает что контрол поддерживает юникод. Вот когда он корректно отобразит строку юникода, причем безо всяких танцев...

В четвёртый раз, для тех кто на бронепоезде:
я не о функциональности контролов, а об их интерфейсе,
потому что именно об интерфейсе было утверждение:
AndreyG_80 писал(а):Скорее всего VB здесь не причем, просто с рекордсета возвращаеться строка в Юникоде, а для VB ее нужно переделать ее в ASCII. Как это сделать?
Изображение

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 26.07.2006 (Ср) 10:12

tyomitch писал(а):В четвёртый раз, для тех кто на бронепоезде:


Ну ладно, оставайтесь в своем танке. Прекращаем пустой спор - бронепоезд отплывает... :lol:
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 26.07.2006 (Ср) 10:42

ms forms 2.0 - единстВенные контролы от мелкософта, которые специально были разработаны для работы с юникодом, все остальные встроенные контролы бейсика отображать юникод не могут

но forms 2.0 нельзя включать в состав дистрибутива :(


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

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

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

    TopList