А что за такой утиный подход? Можешь хоть немного разъяснить?Хакер писал(а):Самый чистый вариант — это найти сторонние контролы-заменители для всех стандартных контролов. Причём 100 % совместимые по интерфейсам (с точки зрения утиного подхода, а не COM-подхода, конечно же
Вот с этим есть одна закавыка. Строки в ресурсах с одной стороны это конечно хорошо, можно быстро локализовать приложение если потребуется, но с другой стороны, если потенциально приложение не требует и никогда не потребует локализации и если не решать проблему описанную в этой теме, то стоит ли вообще использовать строковые ресурсы? Дело в том, что когда строка находится прямо в коде, то сразу видно "что это такое", в случае если она будет в ресурсах, да еще если этих строк там очень много, то вместо того, что-бы сразу видеть, с чем имеешь дело, придется иметь дело с идентификатором, что уже не так очевидно. Т.е. читабельность и понятность кода явно уменьшается. Можно конечно использовать под идентификаторы числовые константы с соответствующим строке названием, но для русскоязычных строк это не очень удобно, поэтому константы не выход. Так стоит ли в таких случаях (если локализация не нужна) использовать вместо строковых констант ресурсы в ущерб понятности кода?Хакер писал(а):Вообще говоря, даже при отсутствии этой проблемы: плохо помещать строковые коснтанты прямо в код, хорошо помещать строковые константы в string table в ресурсы.
А можно чуточку поподробнее про этот метод. То, что нужно заставить все вполне понятно, но непонятно как. Т.е. можно конечно создать ситуацию при которой наряду с .frm файлом у формы появится и .frx файл, который сделает сама среда, а дальше то что?Хакер писал(а):Поэтому здесь проблема с сохранением юникода решается просто тем, что надо заставить контролы хранить значения строковых свойств не в .frm, а в .frx. Ну и устанавливать их придётся, по всей видимости, не через Property Window, а через кастомный PropertyPage-диалог.
А можно хоть один трюк для примера? Может с трюками даже проще будет. Кстати вариант с перехватом это же чистейший трюк или все таки нет?Хакер писал(а):Так что по настоящему неразрешимой проблемы тут нет. Проблема решаема даже абсолютно без применения блэк-кодинга и всяким сомнительных (для кого-то) приёмов. То есть даже стопроцентно чистыми методами всё решается. А уж с применением трюков — тем более.
ger_kar писал(а):А что за такой утиный подход? Можешь хоть немного разъяснить?
ger_kar писал(а):придется иметь дело с идентификатором, что уже не так очевидно
ger_kar писал(а):То, что нужно заставить все вполне понятно, но непонятно как.
ger_kar писал(а):А можно хоть один трюк для примера? Может с трюками даже проще будет.
Да... Общую эрудицию нужно тоже повышатьХакер писал(а):Это вопрос общей эрудиции.
А как быть тогда в случае себя самого, заняться самобичеванием?Хакер писал(а):Если не очевидно, значит надо уволить и прогнать поганой метлой того, кто придумывал имена идентификаторам
Имелся ввиду этот вариант?Хакер писал(а):Примеры были.
Хакер писал(а):Третий вариант решения проблемы состоит в написании невидимого ассистанс-агента, который сам перехватывает обращения ко всему, к чему надо, делает необходимые подмены. Своего рода первый вариант, но правится не DLL, а всё фиксится непосредственно во время работы.
ger_kar писал(а):А как быть тогда в случае себя самого, заняться самобичеванием?
ger_kar писал(а):Имелся ввиду этот вариант?
Самый крутой и понтовый вариант — это модифицировать msvbvm60 таким хитрым образом, чтобы она стала полноценно юникодной.
Самый чистый вариант — это найти сторонние контролы-заменители для всех стандартных контролов.
Аналогично придётся заменить все функции, имеющие связь в внешним миром (например MsgBox). Это достатоно легко сделать технически
Это означает, про проблематично записать в коде юникодную строковую константу
Private Declare Function SHGetFolderPath Lib "shell32.dll" Alias "SHGetFolderPathA" (ByVal hwndOwner As Long, ByVal nFolder As Long, ByVal hToken As Long, ByVal dwFlags As Long, ByVal lpszPath As String) As Long
Private Const S_OK = &H0
Private Const S_FALSE = &H1
Private Const E_INVALIDARG = &H80070057
Private Const SHGFP_TYPE_CURRENT = 0
Private Const SHGFP_TYPE_DEFAULT = 1
Public Function GetDocFolder() As String
Dim strBuffer As String * 1000
Dim strPath As String
Dim lngReturn As Long
lngReturn = SHGetFolderPath(0&, &H2E, 0&, SHGFP_TYPE_CURRENT, strBuffer)
If lngReturn = S_OK Then
strPath = Left$(strBuffer, InStr(strBuffer, Chr$(0)) - 1)
Else
MsgBox "Error!", vbCritical, "App"
End If
GetDocFolder = strPath
End Function
MsgBox GetDocFolder
Хакер писал(а):Идеологически запрещено хранить UTF8-строку (или UTF7-строку или любую другую) в переменной типа String. Потому что существует как минимум два способа хранить UTF8-строку внтри String-переменной, и не существует абсолютно никакого способа узнать, какой из них используется, не существует никакого способа пометить переменную как использующую какой-то конкретный способ.
Хакер писал(а):Так вот, UTF8 строка, лежащая внутри String переменной, может лежать либо как есть: каждый байт UTF8-строки совпадает с каждым байтом String-переменной, либо в по-глупому-в-юнкод-преобразованном виде, каждый каждый символ бессмысленной UCS-2 строки совпадает по своему коду со значением каждого байта UTF8-строки.
Хакер писал(а):Соответственно, три варианта функции.
Хакер писал(а):Для случая, когда UTF8-строка представляет (как положено) в виде массива байтов.
Хакер писал(а):Для случая, когда UTF8-строка (как не следует делать) засунута в String-переменную в том виде, в каком есть.
Хакер писал(а):Для самого тупого случая (как, надо полагать, у тебя), когда UTF8-строка хранится в String-переменной, причём каждому байту UTF8-строки соответствует двухбайтная пара String-переменная, представляющая UCS2-символ, код которого равен значение соответствующего байта оригинальной UTF8-строки.
Вот прочитал эти строки, потом вспомнились этиvip.fedor писал(а): Найти freeware замену юникодными, да еще и совместимые по интерфейсу - задача не тривиальная
И возникли следующие вопросы:Хакер писал(а):Появись MSLU до 98 года, был бы шанс, что рантайм VB6 был бы юникодным от начала до конца. Но...
ger_kar писал(а):Кроме VB6, который вышел в 1998 году, существует еще и VBA, последняя версия которого встроена в MS Office 2010 и у которого имеется практически идентичный собственный набор контролов. Интересно эти контролы поддерживают юникод или нет и как вообще возможно это проверить?
Ну вообще эти контролы проживают по адресу при стандартной установке пакета офис "C:\Windows\System32\FM20.dll" и в VB их можно просто подключить. Если нет установленного офиса, то тогда видимо придется таскать эту библиотечку с приложением. Мне это по крайней мере видится так.Qwertiy писал(а):Да, поддерживают. Как извлекать собрался?
vip.fedor писал(а):Найти freeware замену юникодными, да еще и совместимые по интерфейсу - задача не тривиальная, а если и разрешимая, то потребует не позволительно много затрат времени.
ger_kar писал(а):чем ocx файл отличается от dll?
Вообще хорошо бы изучить такой момент, как написание собственного контрола. Очень хорошо, если бы появилась статья с подробным описанием как это вообще делается, потому как я например представляю себе этот процесс весьма приблизительно. Да и масса других (за исключением некоторых ) тоже. Конечно если начать писать свой контрол, то рано или поздно что-нибудь получится, но хотелось бы получить не что-нибудь, а стандартный, нормальный по всем критериям, контрол.Хакер писал(а):А я вот не вижу в этом никакой проблемы. Хоть бери и сам пиши клоны стандартных контролов с поддержкой юникода.
ger_kar писал(а):Получается, что по внутреннему устройству *.dll идентичен *.ocx?
ger_kar писал(а):И для превращения одного в другой достаточно банальной смены расширения файла
Файла dll например в файл ocx и наоборот. Что касается превращения, то речь шла именно о превращении, а не просто переименовании. Понятно что переименовать можно без проблем, но получится ли при этом полноценный ocx файл если просто переименовать файл dll в ocx. И если эти файлы идентичны, но нафига надо было городить огород и выдумывать ocx файлы?Хакер писал(а):Превращения чего во что?
ger_kar писал(а):И если эти файлы идентичны, но нафига надо было городить огород и выдумывать ocx файлы?
Хакер писал(а):Как же ты любишь оффтопить.
ger_kar писал(а):Ну вообще эти контролы проживают по адресу при стандартной установке пакета офис "C:\Windows\System32\FM20.dll" и в VB их можно просто подключить. Если нет установленного офиса, то тогда видимо придется таскать эту библиотечку с приложением. Мне это по крайней мере видится так.
Хакер писал(а):Для конструктивной деятельности по решению проблемы напиши список контроллов, которым нужно обеспечить юникодность.
vip.fedor писал(а):Хакер писал(а):Для конструктивной деятельности по решению проблемы напиши список контроллов, которым нужно обеспечить юникодность.
Обязательно напишу, но сейчас есть более актуальная проблема, как вернуть корректный путь состоящий частично из кириллицы.
Описанная мной выше функция возвращает для WinXP RU SP3 в среде где Non-Unicode = English, вместо - "C:\Documents and Settings\All Users\Документы", "C:\Documents and Settings\All Users\? ? ? ? ? ?". Что делает недоступным один из важных путей хранения настроек программы. Есть идеи как получить со всеми этими преобразованиями между ANSI и Unicode корректный путь?
iGrok писал(а):правкой строк в объявлениях на As Long и оборачиванием их же в вызовах в StrPtr()
Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 74