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);
16 function SetClipboard(SrcText: WideString): Boolean;
17 function GetClipboard(IsClear: Boolean): WideString;
19 procedure CreateWindowHandle(const Params: TCreateParams); override;
21 constructor Create(AOwner: TComponent); override;
23 procedure InsertText(InsText: WideString);
24 procedure QuotePaste(QuoteStr: AnsiString);
25 property EncodeText: AnsiString read GetEncodeText write SetEncodeText;
31 constructor TWideMemo.Create(AOwner: TComponent);
33 inherited Create(AOwner);
36 procedure TWideMemo.Free;
41 procedure TWideMemo.CreateWindowHandle(const Params: TCreateParams);
43 ClassName: WideString;
47 ClassName := WideString(WinClassName);
48 WindowHandle := CreateWindowExW(ExStyle, PWideChar(ClassName), '', Style,
49 X, Y, Width, Height, WndParent, 0,
51 SendMessage(WindowHandle, WM_SETTEXT, 0, Longint(Caption));
55 function TWideMemo.GetWideText: WideString;
60 // 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 Result := GetClipboard(True);
83 function TWideMemo.GetEncodeText: AnsiString;
85 _WC_NO_BEST_FIT_CHARS = $400;
90 BufSJ: array[0..16] of AnsiChar;
96 TextUC := GetWideText;
97 BufUC := PWideChar(TextUC);
98 Len := Length(TextUC);
101 WideCharToMultiByte(CP_ACP, _WC_NO_BEST_FIT_CHARS, BufUC, LenUC, nil, 0, nil, @UseDefChar);
102 if (UseDefChar = False) then begin
103 Result := AnsiString(BufUC);
105 for Cnt := 0 to Len - 1 do
107 ZeroMemory(@BufSJ, 16);
108 WideCharToMultiByte(CP_ACP, _WC_NO_BEST_FIT_CHARS, @BufUC[Cnt], 1, BufSJ, 16, nil, @UseDefChar);
109 if (UseDefChar = False) then begin
110 TextSJ := TextSJ + AnsiString(BufSJ);
112 TextSJ := TextSJ + Format('&#%d;', [Ord(BufUC[Cnt])]);
119 procedure TWideMemo.SetEncodeText(SrcText: AnsiString);
128 while Length(TextSJ) > 0 do begin
129 CodePos := AnsiPos('&#', TextSJ);
130 if (CodePos < 1) then begin
131 TextUC := TextUC + WideString(TextSJ);
134 if (CodePos > 1) then begin
135 TextUC := TextUC + WideString(Copy(TextSJ, 1, CodePos - 1));
136 Delete(TextSJ, 1, CodePos - 1);
138 CodePos := AnsiPos(';', TextSJ);
139 if (CodePos < 1) then begin
140 TextUC := TextUC + WideString(TextSJ);
143 CodeSJ := Copy(TextSJ, 3, CodePos - 3);
144 CodeVal := StrToIntDef(CodeSJ, 0);
145 if ((CodeVal < 1) or (CodeVal > $FFFF)) then begin
146 TextUC := TextUC + WideString(Copy(TextSJ, 1, CodePos));
148 TextUC := TextUC + WideString(WideChar(CodeVal));
150 Delete(TextSJ, 1, CodePos);
153 SetWindowTextW(Handle, PWideChar(TextUC));
156 function TWideMemo.SetClipboard(SrcText: WideString): Boolean;
164 LenUC := Length(SrcText);
165 CopySize := LenUC * SizeOf(WideChar);
166 BufUCSize := (LenUC + 1) * SizeOf(WideChar);
167 MemHandle := GlobalAlloc(GMEM_DDESHARE or GMEM_MOVEABLE, BufUCSize);
168 BufUC := GlobalLock(MemHandle);
169 ZeroMemory(BufUC, BufUCSize);
170 CopyMemory(BufUC, PWideChar(SrcText), CopySize);
171 GlobalUnlock(MemHandle);
173 if (OpenClipboard(Handle) = True) then begin
175 SetClipboardData(CF_UNICODETEXT, MemHandle);
179 GlobalFree(MemHandle);
184 function TWideMemo.GetClipboard(IsClear: Boolean): WideString;
190 if (OpenClipboard(Handle) = True) then begin
191 MemHandle := GetClipboardData(CF_UNICODETEXT);
192 if (MemHandle <> 0) then begin
193 TextP := PWideChar(GlobalLock(MemHandle));
194 if not (TextP = nil) then begin
195 TextGet := WideString(TextP);
196 GlobalUnlock(MemHandle);
199 if (IsClear = True) then
206 procedure TWideMemo.InsertText(InsText: WideString);
210 // FullText: WideString;
211 // AftCurPos: LongInt;
215 FullText := GetWideText;
219 SendMessageW(Handle, EM_GETSEL, WPARAM(@SelS), LPARAM(@SelE));
221 if (SelS <> SelE) then
222 Delete(FullText, SelS + 1, SelE - SelS);
223 Insert(InsText, FullText, SelS + 1);
225 SetWindowTextW(Handle, PWideChar(FullText));
227 AftCurPos := LongInt(SelS) + Length(InsText);
229 SendMessageW(Handle, EM_SETSEL, AftCurPos, AftCurPos);
232 TextOrg := GetClipboard(False);
234 if (SetClipboard(InsText) = True) then begin
236 SendMessageW(Handle, WM_PASTE, 0, 0);
238 SetClipboard(TextOrg);
244 procedure TWideMemo.QuotePaste(QuoteStr: AnsiString);
252 TextSrc := GetClipboard(False);
254 RetChar := AnsiString(#13#10);
256 while (Length(TextSrc) > 0) do begin
257 Ret := Pos(RetChar, TextSrc);
258 if (Ret < 1) then begin //
\89ü
\8ds
\82È
\82µ
259 TextDst := TextDst + QuoteUC + TextSrc;
263 //
\89ü
\8ds
\82Ü
\82Å
\82Ì1
\8ds
264 TextDst := TextDst + QuoteUC + Copy(TextSrc, 1, Ret + 1);
265 Delete(TextSrc, 1, Ret + 1);
268 if (Length(TextDst) > 0) then