Вверх ↑
Ответов: 4621
Рейтинг: 746
#1: 2020-09-09 16:10:54 ЛС | профиль | цитата
nesco писал(а):
А если нужно именно просто отображать?
Ну, а как туда из программы вывести текст в Unicode? А если пользователь только может ввести с клавиатуры текст или загрузить из файла, то какой смысл? Хотя, грузить из файла для отображения может кому-то понадобиться.

nesco писал(а):
А не вариант программно конвертнуть
Получить отдельные строки с помощью SendMessageW(EM_GETLINE) не получилось - приходит уже сконвертированным. Вероятно, знает что окно создавалось с помощью CreateWindowA. Только что попробовал через GetWindowTextW - аналогично: юникодный текст уже содержит "?" на месте не входящих в текущую кодовую страницу символов (кстати, даже с Control.Perform(EM_SETTEXTMODE) оно отображает юникодные символы):
Add(MainForm,2953706,49,133)
{
Width=397
Height=371
}
Add(RichEdit,7915306,224,119)
{
Left=15
Top=20
Width=330
Height=75
Font=[Microsoft Sans Serif,8,0,0,204]
Strings=#5:Текст|
Point(Handle)
}
Add(Button,9785529,175,175)
{
Left=15
Top=110
link(onClick,11970995:doGetREText,[])
}
Add(InlineCode,11970995,245,175)
{
WorkPoints=#11:doGetREText|
EventPoints=#10:onTextANSI|11:onTextANSI2|10:onTextUTF8|9:onTextUni|
DataPoints=#8:REHandle|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|4:uses|29: Windows, KOL, Share, Debug;|0:|4:type|29: THiAsmClass = class(TDebug)|11: private|0:|10: public|26: REHandle: THI_Event;|17: onTextANSI,|18: onTextANSI2,|16: onTextUni,|31: onTextUTF8: THI_Event; |59: procedure doGetREText(var _Data: TData; Index: Word);|6: end;|0:|14:implementation|0:|84:function WideStringToAnsiString(const S: WideString; TargetCP: Integer): AnsiString;|3:var|18: L, DestL: DWord;|7:begin |15: Result := '';|22: if S = '' then Exit;|0:|17: L := Length(S);|77: DestL := WideCharToMultiByte(TargetCP, 0, Pointer(S), L, nil, 0, nil, nil);|19: if DestL > 0 then|7: begin|29: SetLength(Result, DestL);|97: if WideCharToMultiByte(TargetCP, 0, Pointer(S), L, Pointer(Result), DestL, nil, nil) = 0 then|28: Result := ''; // Error|6: end;|4:end;|0:|0:|0:|65:procedure THiAsmClass.doGetREText(var _Data: TData; Index: Word);|3:var|13: H: THandle;|13: L: Integer;|17: WS: WideString;|13: S: string; |5:begin|0:|39: H := ReadInteger(_Data, REHandle, 0);|2: |80: // Стандартный способ с автоматической конвертацией в текущую кодовую страницу|31: L := GetWindowTextLengthA(H);|15: if L > 0 then|7: begin|21: SetLength(S, L); |46: {L :=} GetWindowTextA(H, Pointer(S), L+1);|45: //if L <> Length(S) then SetLength(S, L);|5: end|6: else|12: S := '';|2: |30: _hi_OnEvent(onTextANSI, S); |2: |24: // Получение в Unicode|31: L := GetWindowTextLengthW(H);|15: if L > 0 then|7: begin|22: SetLength(WS, L); |47: {L :=} GetWindowTextW(H, Pointer(WS), L+1);|47: //if L <> Length(WS) then SetLength(WS, L);|5: end|6: else|14: WS := ''; |2: |42: // В WS - текст в Unicode. Конвертируем:|0:|45: // Автоматически в текущую кодовую страницу|10: S := WS;|30: _hi_OnEvent(onTextANSI2, S);|2: |20: // Вручную в UTF-8|43: S := WideStringToAnsiString(WS, CP_UTF8);|29: _hi_OnEvent(onTextUTF8, S);|2: |21: // Выдаём в Unicode|18: L := Length(WS);|2: |15: if L > 0 then|7: begin|41: L := L * 2; // В 1-байтовых символах |21: SetLength(S, L); |25: Move(WS[1], S[1], L);|5: end|6: else|13: S := ''; |2: |28: _hi_OnEvent(onTextUni, S);|2: |0:|4:end;|0:|0:|0:|4:end.|
link(onTextANSI,8368524:doEvent1,[])
link(onTextANSI2,8368524:doEvent2,[])
link(onTextUTF8,8368524:doEvent3,[])
link(onTextUni,6834885:doEvent1,[(293,202)(293,314)])
link(REHandle,7915306:Handle,[])
}
Add(Memo,9409052,525,175)
{
Left=15
Top=140
Width=330
Height=170
}
Add(Hub,8368524,483,175)
{
InCount=4
OutCount=1
link(onEvent1,9409052:doAdd,[])
}
Add(Charset,10912153,343,315)
{
Type=9
link(onCharset,16573114:doEvent2,[])
}
Add(Charset,6781189,315,203)
{
Type=7
}
Add(Hub,6834885,308,308)
{
link(onEvent1,15541894:doConvert,[(332,314)(332,279)])
link(onEvent2,10912153:doCharset,[])
}
Add(Hub,16573114,406,308)
{
InCount=2
OutCount=1
link(onEvent1,8368524:doEvent4,[(452,314)(452,202)])
}
Add(StreamConvertor,15541894,343,273)
{
Mode=2
link(onResult,16573114:doEvent1,[(391,279)(391,314)])
}
карма: 26

0
Редактировалось 1 раз(а), последний 2020-09-09 16:11:27