Помощь - Поиск - Пользователи - Календарь
Полная версия: Отправка простого текста юникодному компоненту.
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
TarasBer

H := CreateWindowW(...
SendMessage(H, wm_SetText, 0, integer(pchar('Русский текст')));



На моей машине русский текст отображается корректно.
На другой (тоже русская ХР) - нет, отображаются закорючки.
На английской - хз, не могу проверить.

Так вот, у меня вопрос. Преобразование простой строки в юникодовую (а именно оно происходит при отправке сообщения) делается через какую-то виндовую функцию. Как функция определяет, какую кодировку при этом брать? Какие-то настройки системы? Настройки программы?
volvo
Насколько я понимаю, вот это:Как общие элементы управления конвертируют строки между ANSI и Unicode? - твой случай?
TarasBer
Ну типа того.
Правда, я всё равно ничего не понимаю.
Написано, что по умолчанию преобразование производится для кодировки ANSI.
В этом наборе символов, составленном не нами, предусмотрели полный русский алфавит? Или это только в русской винде так?

На другом компе вообще так вышло, что те компоненты, названия которым были даны при создании (я делал преобразование PWideChar(WideString(S))), видны коряво, а те, которым были даны позже, через SetText, на тех всё нормально.
Долгое разглядывание функции WideString привело меня на стандартную функцию из винды. То есть это оно работает не так, как преобразователь при обращении к компонентам?
volvo
Значит, смотри...

Я сейчас тестировал свой код на машине, где про русский язык и кириллицу вообще ничего не знают. Тут стоит HEBREW для не-юникода (я это сделал специально даже не на свое машине, а на чужой). Так вот. Делаю так:

const CP_THREAD_ACP = 3;

procedure SendToControl (Where : HWND; s : string);
var
pstrw : PWideChar;
cchw : Integer;
begin
cchw := MultiByteToWideChar(CP_THREAD_ACP, 0, @s[1], Length (s), nil, 0) + 1;
if cchw <> 0 then
begin
GetMem(pstrw, cchw * SizeOf (WideChar));
try
MultiByteToWideChar (CP_THREAD_ACP, 0, @s[1], Length (s), pstrw, cchw);
pstrw[cchw - 1] := #0;
SendMessageW (Where, WM_SETTEXT, 0, Integer (pstrw)); // именно W, а не A
finally
FreeMem(pstrw, cchw * SizeOf (WideChar));
end;
end;
end;
, вызываю - так:
case Msg of
WM_COMMAND:
begin
case LoWord (wParam) of
BTN:
begin
SendToControl (myEdit, 'Русский текст');
end;
end;
end;
// ...
(самой первой строкой программы запихал
SetThreadLocale (1049);
, чтоб насильственно переключить поток на русскую локаль).

В Эдите появляется ровно та надпись, которую я посылаю. На русском языке... Исходник сохранен не в Юникоде, а в Win1251, компилировалось все это дело обычным консольным FPC, так что и тут зависимости от IDE никакой, ее просто нет (я про IDE).
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.