6 Messages, Windows, Controls, StdCtrls, SysUtils, Classes, Types;
11 TWideMemo = class(TMemo)
13 function GetEncodeText: AnsiString;
14 procedure SetEncodeText(SrcText: AnsiString);
16 procedure CreateWindowHandle(const Params: TCreateParams); override;
18 constructor Create(AOwner: TComponent); override;
19 procedure InsertText(SrcText: AnsiString);
20 property EncodeText: AnsiString read GetEncodeText write SetEncodeText;
26 constructor TWideMemo.Create(AOwner: TComponent);
28 inherited Create(AOwner);
31 procedure TWideMemo.CreateWindowHandle(const Params: TCreateParams);
33 // ClassName: WideString;
37 // ClassName := WideString(WinClassName);
38 // WindowHandle := CreateWindowExW(ExStyle, PWideChar(ClassName), '', Style,
39 WindowHandle := CreateWindowExW(ExStyle, 'EDIT', '', Style,
40 X, Y, Width, Height, WndParent, 0,
42 // SendMessage(WindowHandle, WM_SETTEXT, 0, Longint(Caption));
46 function TWideMemo.GetEncodeText: AnsiString;
52 BufSJ: array[0..16] of AnsiChar;
57 Len := GetWindowTextLengthW(Handle);
59 BufUCSize := LenUC * SizeOf(WideChar);
60 BufUC := AllocMem(BufUCSize);
61 ZeroMemory(BufUC, BufUCSize);
62 GetWindowTextW(Handle, BufUC, LenUC);
64 WideCharToMultiByte(CP_ACP, 0, BufUC, LenUC, nil, 0, nil, @UseDefChar);
65 if (UseDefChar = False) then begin
66 Result := AnsiString(BufUC);
68 for Cnt := 0 to Len do
70 ZeroMemory(@BufSJ, 16);
71 WideCharToMultiByte(CP_ACP, 0, @BufUC[Cnt], 1, BufSJ, 16, nil, @UseDefChar);
72 if (UseDefChar = False) then begin
73 TextSJ := TextSJ + AnsiString(BufSJ);
75 TextSJ := TextSJ + Format('&#%d;', [Ord(BufUC[Cnt])]);
83 procedure TWideMemo.SetEncodeText(SrcText: AnsiString);
92 while Length(TextSJ) > 0 do begin
93 CodePos := AnsiPos('&#', TextSJ);
94 if (CodePos < 1) then begin
95 TextUC := TextUC + WideString(TextSJ);
98 if (CodePos > 1) then begin
99 TextUC := TextUC + WideString(Copy(TextSJ, 1, CodePos - 1));
100 Delete(TextSJ, 1, CodePos - 1);
102 CodePos := AnsiPos(';', TextSJ);
103 if (CodePos < 1) then begin
104 TextUC := TextUC + WideString(TextSJ);
107 CodeSJ := Copy(TextSJ, 3, CodePos - 3);
108 CodeVal := StrToIntDef(CodeSJ, 0);
109 if ((CodeVal < 1) or (CodeVal > $FFFF)) then begin
110 TextUC := TextUC + WideString(Copy(TextSJ, 1, CodePos));
112 TextUC := TextUC + WideString(WideChar(CodeVal));
114 Delete(TextSJ, 1, CodePos);
117 SetWindowTextW(Handle, PWideChar(TextUC));
120 procedure TWideMemo.InsertText(SrcText: AnsiString);
127 FullText: WideString;
131 InsText := WideString(SrcText);
133 LenUC := GetWindowTextLengthW(Handle) + 1;
134 BufUCSize := LenUC * SizeOf(WideChar);
135 BufUC := AllocMem(BufUCSize);
136 ZeroMemory(BufUC, BufUCSize);
137 GetWindowTextW(Handle, BufUC, LenUC);
138 FullText := WideString(BufUC);
143 SendMessageW(Handle, EM_GETSEL, WPARAM(@SelS), LPARAM(@SelE));
145 if (SelS <> SelE) then
146 Delete(FullText, SelS + 1, SelE - SelS);
147 Insert(InsText, FullText, SelS + 1);
149 SetWindowTextW(Handle, PWideChar(FullText));
151 AftCurPos := LongInt(SelS) + Length(InsText);
153 SendMessageW(Handle, EM_SETSEL, AftCurPos, AftCurPos);