6 Messages, Windows, Controls, StdCtrls, SysUtils, Classes, Types;
11 TWideMemo = class(TMemo)
13 function GetWideText: WideString;
14 function GetEncodeText: AnsiString;
15 procedure SetEncodeText(SrcText: AnsiString);
17 procedure CreateWindowHandle(const Params: TCreateParams); override;
19 constructor Create(AOwner: TComponent); override;
21 procedure InsertText(InsText: WideString);
22 property EncodeText: AnsiString read GetEncodeText write SetEncodeText;
28 constructor TWideMemo.Create(AOwner: TComponent);
30 inherited Create(AOwner);
33 procedure TWideMemo.Free;
38 procedure TWideMemo.CreateWindowHandle(const Params: TCreateParams);
40 ClassName: WideString;
44 ClassName := WideString(WinClassName);
45 WindowHandle := CreateWindowExW(ExStyle, PWideChar(ClassName), '', Style,
46 X, Y, Width, Height, WndParent, 0,
48 SendMessage(WindowHandle, WM_SETTEXT, 0, Longint(Caption));
52 function TWideMemo.GetWideText: WideString;
57 // BufUCSize: Integer;
64 // Len := GetWindowTextLengthW(Handle);
65 // Len := Perform(WM_GETTEXTLENGTH, 0, 0);
67 // BufUCSize := LenUC * SizeOf(WideChar);
68 // BufUC := AllocMem(BufUCSize);
69 // ZeroMemory(BufUC, BufUCSize);
70 // GetWindowTextW(Handle, BufUC, LenUC);
71 // SendMessageW(Handle, WM_GETTEXT, WPARAM(LenUC), LPARAM(BufUC));
72 // Result := WideString(BufUC);
75 SendMessage(Handle, EM_GETSEL, WPARAM(@PosS), LPARAM(@PosE));
76 SendMessage(Handle, EM_SETSEL, 0, GetWindowTextLengthW(Handle));
77 SendMessage(Handle, WM_COPY, 0, 0);
78 SendMessage(Handle, EM_SETSEL, WPARAM(PosS), LPARAM(PosE));
80 if (OpenClipboard(Handle) = True) then begin
81 MemHandle := GetClipboardData(CF_UNICODETEXT);
82 if (MemHandle <> 0) then begin
83 TextP := PWideChar(GlobalLock(MemHandle));
84 if not (TextP = nil) then begin
85 TextUC := WideString(TextP);
86 GlobalUnlock(MemHandle);
95 function TWideMemo.GetEncodeText: AnsiString;
100 BufSJ: array[0..16] of AnsiChar;
101 UseDefChar: LongBool;
106 TextUC := GetWideText;
107 BufUC := PWideChar(TextUC);
108 Len := Length(TextUC);
111 WideCharToMultiByte(CP_ACP, 0, BufUC, LenUC, nil, 0, nil, @UseDefChar);
112 if (UseDefChar = False) then begin
113 Result := AnsiString(BufUC);
115 for Cnt := 0 to Len do
117 ZeroMemory(@BufSJ, 16);
118 WideCharToMultiByte(CP_ACP, 0, @BufUC[Cnt], 1, BufSJ, 16, nil, @UseDefChar);
119 if (UseDefChar = False) then begin
120 TextSJ := TextSJ + AnsiString(BufSJ);
122 TextSJ := TextSJ + Format('&#%d;', [Ord(BufUC[Cnt])]);
129 procedure TWideMemo.SetEncodeText(SrcText: AnsiString);
138 while Length(TextSJ) > 0 do begin
139 CodePos := AnsiPos('&#', TextSJ);
140 if (CodePos < 1) then begin
141 TextUC := TextUC + WideString(TextSJ);
144 if (CodePos > 1) then begin
145 TextUC := TextUC + WideString(Copy(TextSJ, 1, CodePos - 1));
146 Delete(TextSJ, 1, CodePos - 1);
148 CodePos := AnsiPos(';', TextSJ);
149 if (CodePos < 1) then begin
150 TextUC := TextUC + WideString(TextSJ);
153 CodeSJ := Copy(TextSJ, 3, CodePos - 3);
154 CodeVal := StrToIntDef(CodeSJ, 0);
155 if ((CodeVal < 1) or (CodeVal > $FFFF)) then begin
156 TextUC := TextUC + WideString(Copy(TextSJ, 1, CodePos));
158 TextUC := TextUC + WideString(WideChar(CodeVal));
160 Delete(TextSJ, 1, CodePos);
163 SetWindowTextW(Handle, PWideChar(TextUC));
166 procedure TWideMemo.InsertText(InsText: WideString);
173 // FullText: WideString;
174 // AftCurPos: LongInt;
179 FullText := GetWideText;
183 SendMessageW(Handle, EM_GETSEL, WPARAM(@SelS), LPARAM(@SelE));
185 if (SelS <> SelE) then
186 Delete(FullText, SelS + 1, SelE - SelS);
187 Insert(InsText, FullText, SelS + 1);
189 SetWindowTextW(Handle, PWideChar(FullText));
191 AftCurPos := LongInt(SelS) + Length(InsText);
193 SendMessageW(Handle, EM_SETSEL, AftCurPos, AftCurPos);
196 LenUC := Length(InsText);
197 CopySize := LenUC * SizeOf(WideChar);
198 BufUCSize := (LenUC + 1) * SizeOf(WideChar);
199 MemHandle := GlobalAlloc(GMEM_DDESHARE or GMEM_MOVEABLE, BufUCSize);
200 BufUC := GlobalLock(MemHandle);
201 ZeroMemory(BufUC, BufUCSize);
202 CopyMemory(BufUC, PWideChar(InsText), CopySize);
203 GlobalUnlock(MemHandle);
205 if (OpenClipboard(Handle) = True) then begin
207 SetClipboardData(CF_UNICODETEXT, MemHandle);
210 SendMessageW(Handle, WM_PASTE, 0, 0);
212 GlobalFree(MemHandle);