IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

 
 Ответить  Открыть новую тему 
> Отправка простого текста юникодному компоненту.
сообщение
Сообщение #1


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +



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



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

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


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Насколько я понимаю, вот это:Как общие элементы управления конвертируют строки между ANSI и Unicode? - твой случай?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Ну типа того.
Правда, я всё равно ничего не понимаю.
Написано, что по умолчанию преобразование производится для кодировки ANSI.
В этом наборе символов, составленном не нами, предусмотрели полный русский алфавит? Или это только в русской винде так?

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


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Значит, смотри...

Я сейчас тестировал свой код на машине, где про русский язык и кириллицу вообще ничего не знают. Тут стоит 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).
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.04.2024 6:50
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name