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)]) }
Редактировалось 1 раз(а), последний 2020-09-09 16:11:27
|