Render.ru

Кирилица через VBA for CorelDrow

#1
Проблем в следующем:
Пишеться макрос, через InputBox вводяться буковки русские.
И только.
Далее необходимо чтобы эти буковки стали в документе вместо других.
И тут проявляется такой феномен - ничего не видно.
Не видно в документе, не видно в тектовом редакторе, но при этом объект существует и средствами VBA можно вытащить его содержимое, которое MsgBox отображается верно.

Sub Test()
Dim MyName As String, T As Shape

MyName = InputBox("Введите имя")
Set T = ActivePage.TextFind("Name", False)
MsgBox VarType(T)
MsgBox TypeName(T)
T.CreateSelection

With ActiveShape.Text
MsgBox .Contents
.Contents = Name
MsgBox .Contents
MsgBox .CharacterCount
End With

End Sub

Вот примерчик кода.
Кстати OldText здесь представлен латиницей в моем случае -это не критично.
Но если текст записан кирилицей, то TypeName выдает "ничего".
Про кривые шрифты не говорите: испольшую Tahoma. Шрифт не важен.

Arkady, есть предложения?

P.S. У Вакуленко на Обероне я ответа не получил.
 
#2
Честно, говоря — нет. Так как любая UNICODE-строка скукоживает текст. Исключение в случае, если используется конструкция вида .contents = .contents. Да и в этом случае мне кажется, что где-то происходит надувательство
 
#5
Проблем не во втягивании — тут-то все нормально, а в присваивании свойства .Contents. Попробуй, присвой «по-дурке» .Contents= chrW(&h410) или .Contents = "adasdasdasdasdasd Ф". Во втором случае без «Ф» все нормально, а с «Ф» — текст скукоживается.
 
#6
Да как я его только не затягивал. Даже HTML конвертирование применял.
Не хочет и все тут.
Я на Обероне переформулировал вопрос с твоей подачи: может ли VBA работать с Unicode?
Посмотрим, что Вакуленко ответит.

Кстати, я тут на Эф-Ти-Пи-шнике Кореловском нашел патч к KPT5
Link: ftp.corel.com/pub/kpt/5/win/kpt5updater.zip
 
#8
VBA'то худо-бедно с unicode-строками работает (ф-ция chrW() оттуда ). Прболема в .contents. Мне лично так кажется
 
#9
Получил наконец-то ответ от господина Вакуленко
Выглядит это так:
Dino,

The answer is both "Yes" and "No". CorelDRAW is not yet a true Unicode application, so it doesn't handle the text through Unicode per se. However it still can support multiple code pages in the same document, so you still can show Cyrillic, Central European, Western and other characters at the same time.

CorelDRAW 11 has expanded its object model with advanced text handling messages which automatically convert Unicode characters from VBA (you need to use Shape.Text.Story, for example, instead of the old Shape.Text.Contents property). However if you are still under CorelDRAW 10 or 9, you will need to use a "hack" I explained in the following thread: Special Characters

По этой ссылке Special Characters он предлагает следующее:
In CorelDRAW 10 you need to use a little hack. Basically, you need to get an ASCII code of the character and then create a Unicode character using the single-byte code. You do this with using VBA's Asc and ChrW functions respectively:

Code:
ActiveShape.Text.Contents = ChrW$(Asc("©"))


If you want to assign more than one character, you need to process each character in the string this way. You can use the following function to convert a normal VBA string into something CorelDRAW 10 can use to assign to a text object:

Code:
Function GetWideString(s As String) As String
Dim p As String, i As Long, c As String
p = ""
For i = 1 To Len(s)
c = Mid$(s, i ,1)
p = p & ChrW$(Asc(c))
Next i
GetWideString = p
End Function


Then you can use it as follows:

Code:
ActiveShape.Text.Contents = GetWideString("©®")


When you try get back the text from CorelDRAW and want to analyze it in VB/VBA, you should do a reverse transformation using AscW and Chr functions:

Code:
Function GetNormalString(s As String) As String
Dim p As String, i As Long, c As String
p = ""
For i = 1 To Len(s)
c = Mid$(s, i ,1)
p = p & Chr$(AscW(c))
Next i
GetNormalString = p
End Function

Попробую разобраться
 
#11
Ну он же пишет, Корел это не полноценное приложение по поддержке юникода. Получаеться, что с .contents поделать ничего нельзя... Возможно поэтому они ввели в 11 кореле свойство .Story.
А то, что он показал - сработало!
Прописываешь в процедуре или модуле функцию

Function GetWideString(s As String) As String
Dim p As String, i As Long, c As String
p = ""
For i = 1 To Len(s)
c = Mid$(s, i, 1)
p = p & ChrW$(Asc(c))
Next i
GetWideString = p
End Function

а код сработал, что мне и было нужно

Sub Unicod()
Dim name As String
name = InputBox("Введите имя")
ActiveShape.Text.Contents = GetWideString(name)
End Sub

Спасибо за поддержку, Arkady.

Кстати в Рязани я бывал.
 
Сверху