Вопрос про OLE

Проектирование и разработка идеального средства программирования.

Модератор: Модераторы

Вопрос про OLE

Сообщение Alex333 » 03.01.2013 20:03:30

Всем привет.

Lazarus 1.0.4, FPC 2.6.0, всё это под Windows XP.
Пишу вот такое:
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var v:Variant;
begin
  Windows.MessageBoxA(0,pchar(utf8toansi('Привет')),'',0); //Тут пишет по-русски
  v:=CreateOleObject('Word.Application');
  v.Documents.Add;
  v.Selection.ParagraphFormat.Alignment:=1;
  v.Selection.TypeText(utf8toansi('Привет!'#13)); //А тут закорючками. ???
  v.Visible:=True;
  v.Activate;
end;   

Как мне корректно вывести русский текст в MS-Word? Чего ему не хватает?

Я грешил сначала на utf8toansi(), но ведь в начальной строчке она нормально переводит кодировку, значит дело не в этом.
А в чём тогда?
Alex333
новенький
 
Сообщения: 32
Зарегистрирован: 21.08.2011 19:14:28

Re: Вопрос про OLE

Сообщение SSerge » 03.01.2013 21:00:16

Alex333 писал(а):но ведь в начальной строчке она нормально переводит кодировку, значит дело не в этом.

У операционной системы Windows есть фактически два программных интерфейса: старый, со времен Windows 3.0, ANSI, и нормальный Unicode. Взаимодействие с Unicode производится через WideStrings (в терминах fpc) - то есть кодировку UCS2, или в терминах лазаруса почему-то она называется UTF16.

Более того, MessageBox операционной системы не имеет никакого отношения к OLE объекту Word.Application. Вообще то надо в описании объекта определить, что именно и в какой кодировке должно ему передаваться. Если это word типа 2007, то скорее всего - строка в UCS2. Как либо подтвердить или опровергнуть сие утверждение не могу по причине отсутствия word'a.

Однако, смотрим сюда: http://msdn.microsoft.com/en-us/library ... cs(v=vs.80).aspx

C# работает во внутреннем представлении со строками UCS2, если что. И только с ними.
Попробуйте применить UTF8toUTF16
SSerge
энтузиаст
 
Сообщения: 842
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Вопрос про OLE

Сообщение Alex333 » 04.01.2013 09:12:30

Попробовал. Ругается ошибкой:

project1
--------------------------------------------
Press OK to ignore and risk data corruption
Press Cancel to kill program
--------------------------------------------
OK Cancel
--------------------------------------------

В то же время, если убрать этот utf8toansi() и скомпилировать в Delphi-6, то работает "на ура".

А ведь там кодировка ansi наверняка.
Alex333
новенький
 
Сообщения: 32
Зарегистрирован: 21.08.2011 19:14:28

Re: Вопрос про OLE

Сообщение alexey38 » 04.01.2013 10:50:37

А Вы что одновременно использовали и utf8toansi() и UTF8toUTF16 ?
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Вопрос про OLE

Сообщение Alex333 » 04.01.2013 20:06:23

А Вы что одновременно использовали и utf8toansi() и UTF8toUTF16 ?


Не понял вопроса :-) Вот так utf8toansi(UTF8toUTF16('Текст')) или вот так UTF8toUTF16(utf8toansi('Текст')) я не делал. А что - надо было?

v.Selection.TypeText(UTF8toUTF16('Привет!'#13)); - вот так выдаёт ошибку.
Alex333
новенький
 
Сообщения: 32
Зарегистрирован: 21.08.2011 19:14:28

Re: Вопрос про OLE

Сообщение iskander » 05.01.2013 00:12:07

Попробуйте привести к WideString
Код: Выделить всё
  v.Selection.TypeText(WideString(UTF8toUTF16('Привет!'#13)));
iskander
постоялец
 
Сообщения: 107
Зарегистрирован: 08.01.2012 18:43:34

Re: Вопрос про OLE

Сообщение Alex333 » 05.01.2013 18:48:32

Во! Наконец-таки то, что надо.
Это работает. Спасибо.
Alex333
новенький
 
Сообщения: 32
Зарегистрирован: 21.08.2011 19:14:28

Re: Вопрос про OLE

Сообщение Иван Шихалев » 07.01.2013 17:28:56

SSerge писал(а):C# работает во внутреннем представлении со строками UCS2, если что.

Нет. Таки UTF-16. UCS2 использовалась до Win2k.
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1140
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Re: Вопрос про OLE

Сообщение sakooon » 15.04.2015 10:24:44

Вообще то надо в описании объекта определить, что именно и в какой кодировке должно ему передаваться. Если это word типа 2007, то скорее всего - строка в UCS2. Как либо подтвердить или опровергнуть сие утверждение не могу по причине отсутствия word'a.????
sakooon
незнакомец
 
Сообщения: 1
Зарегистрирован: 15.04.2015 09:55:22

Re: Вопрос про OLE

Сообщение Vapaamies » 16.04.2015 08:49:21

UCS2 -- это UTF-16 без суррогатных пар, то есть является его подмножеством. Физическое представление у них одинаковое -- последовательность WideChar. OLE-строки в ОС до Windows 2000 -- UCS2, начиная с Windows 2000 -- UTF-16, как правильно заметил Иван Шихалев. По собственному опыту могу сказать, что суррогатные пары прекрасно работают под XP.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 260
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург


Вернуться в Компилятор / язык программирования

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru