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;
97 _WC_NO_BEST_FIT_CHARS = $400;
102 BufSJ: array[0..16] of AnsiChar;
103 UseDefChar: LongBool;
108 TextUC := GetWideText;
109 BufUC := PWideChar(TextUC);
110 Len := Length(TextUC);
113 WideCharToMultiByte(CP_ACP, _WC_NO_BEST_FIT_CHARS, BufUC, LenUC, nil, 0, nil, @UseDefChar);
114 if (UseDefChar = False) then begin
115 Result := AnsiString(BufUC);
117 for Cnt := 0 to Len - 1 do
119 ZeroMemory(@BufSJ, 16);
120 WideCharToMultiByte(CP_ACP, _WC_NO_BEST_FIT_CHARS, @BufUC[Cnt], 1, BufSJ, 16, nil, @UseDefChar);
121 if (UseDefChar = False) then begin
122 TextSJ := TextSJ + AnsiString(BufSJ);
124 TextSJ := TextSJ + Format('&#%d;', [Ord(BufUC[Cnt])]);
131 procedure TWideMemo.SetEncodeText(SrcText: AnsiString);
140 while Length(TextSJ) > 0 do begin
141 CodePos := AnsiPos('&#', TextSJ);
142 if (CodePos < 1) then begin
143 TextUC := TextUC + WideString(TextSJ);
146 if (CodePos > 1) then begin
147 TextUC := TextUC + WideString(Copy(TextSJ, 1, CodePos - 1));
148 Delete(TextSJ, 1, CodePos - 1);
150 CodePos := AnsiPos(';', TextSJ);
151 if (CodePos < 1) then begin
152 TextUC := TextUC + WideString(TextSJ);
155 CodeSJ := Copy(TextSJ, 3, CodePos - 3);
156 CodeVal := StrToIntDef(CodeSJ, 0);
157 if ((CodeVal < 1) or (CodeVal > $FFFF)) then begin
158 TextUC := TextUC + WideString(Copy(TextSJ, 1, CodePos));
160 TextUC := TextUC + WideString(WideChar(CodeVal));
162 Delete(TextSJ, 1, CodePos);
165 SetWindowTextW(Handle, PWideChar(TextUC));
168 procedure TWideMemo.InsertText(InsText: WideString);
175 // FullText: WideString;
176 // AftCurPos: LongInt;
181 FullText := GetWideText;
185 SendMessageW(Handle, EM_GETSEL, WPARAM(@SelS), LPARAM(@SelE));
187 if (SelS <> SelE) then
188 Delete(FullText, SelS + 1, SelE - SelS);
189 Insert(InsText, FullText, SelS + 1);
191 SetWindowTextW(Handle, PWideChar(FullText));
193 AftCurPos := LongInt(SelS) + Length(InsText);
195 SendMessageW(Handle, EM_SETSEL, AftCurPos, AftCurPos);
198 LenUC := Length(InsText);
199 CopySize := LenUC * SizeOf(WideChar);
200 BufUCSize := (LenUC + 1) * SizeOf(WideChar);
201 MemHandle := GlobalAlloc(GMEM_DDESHARE or GMEM_MOVEABLE, BufUCSize);
202 BufUC := GlobalLock(MemHandle);
203 ZeroMemory(BufUC, BufUCSize);
204 CopyMemory(BufUC, PWideChar(InsText), CopySize);
205 GlobalUnlock(MemHandle);
207 if (OpenClipboard(Handle) = True) then begin
209 SetClipboardData(CF_UNICODETEXT, MemHandle);
212 SendMessageW(Handle, WM_PASTE, 0, 0);
214 GlobalFree(MemHandle);