📄 rxrichedit(unicode).pas
字号:
end;
function TWideStrings.WideAdd(const S: WideString): Integer;
begin
Result := GetCount;
WideInsert(Result, S);
end;
function TWideStrings.AddObject(const S: WideString; AObject: TObject): Integer;
begin
Result := Add(S);
PutObject(Result, AObject);
end;
procedure TWideStrings.AddStrings(Strings: TWideStrings);
var
I: Integer;
begin
BeginUpdate;
try
for I := 0 to Strings.Count - 1 do
AddObject(Strings[I], Strings.Objects[I]);
finally
EndUpdate;
end;
end;
procedure TWideStrings.Assign(Source: TPersistent);
begin
if Source is TWideStrings then
begin
BeginUpdate;
try
Clear;
AddStrings(TWideStrings(Source));
finally
EndUpdate;
end;
Exit;
end;
inherited Assign(Source);
end;
procedure TWideStrings.BeginUpdate;
begin
if FUpdateCount = 0 then SetUpdateState(True);
Inc(FUpdateCount);
end;
//Disable property editor, due to no need.
(*
procedure TWideStrings.DefineProperties(Filer: TFiler);
function DoWrite: Boolean;
begin
if Filer.Ancestor <> nil then
begin
Result := True;
if Filer.Ancestor is TWideStrings then
Result := not Equals(TWideStrings(Filer.Ancestor))
end
else Result := Count > 0;
end;
begin
Filer.DefineProperty('WideStrings', ReadData, WriteData, DoWrite);
end;
*)
procedure TWideStrings.EndUpdate;
begin
Dec(FUpdateCount);
if FUpdateCount = 0 then SetUpdateState(False);
end;
function TWideStrings.Equals(Strings: TWideStrings): Boolean;
var
I, Count: Integer;
begin
Result := False;
Count := GetCount;
if Count <> Strings.GetCount then Exit;
for I := 0 to Count - 1 do if Get(I) <> Strings.Get(I) then Exit;
Result := True;
end;
procedure TWideStrings.Error(const Msg: string; Data: Integer);
function ReturnAddr: Pointer;
asm
MOV EAX,[EBP+4]
end;
begin
raise EStringListError.CreateFmt(Msg, [Data]) at ReturnAddr;
end;
procedure TWideStrings.Error(Msg: PResStringRec; Data: Integer);
begin
Error(LoadResString(Msg), Data);
end;
procedure TWideStrings.Exchange(Index1, Index2: Integer);
var
TempObject: TObject;
TempString: WideString;
begin
BeginUpdate;
try
TempString := Strings[Index1];
TempObject := Objects[Index1];
Strings[Index1] := Strings[Index2];
Objects[Index1] := Objects[Index2];
Strings[Index2] := TempString;
Objects[Index2] := TempObject;
finally
EndUpdate;
end;
end;
function TWideStrings.Get(Index: Integer): string;
begin
Result := WideCharToString(PWideChar(WideGet(Index)));
end;
function TWideStrings.GetCapacity: Integer;
begin // descendants may optionally override/replace this default implementation
Result := Count;
end;
function TWideStrings.GetObject(Index: Integer): TObject;
begin
Result := nil;
end;
function TWideStrings.GetText: string;
begin
Result := WideCharToString(PWideChar(WideGetText));
end;
function TWideStrings.WideGetText: WideString;
var
I, L, Size, Count: Integer;
P: PWideChar;
S: WideString;
begin
Count := GetCount;
Size := 0;
for I := 0 to Count - 1 do Inc(Size, Length(Get(I)) + 2);
SetString(Result, nil, Size);
P := Pointer(Result);
for I := 0 to Count - 1 do
begin
S := Get(I);
L := Length(S);
if L <> 0 then
begin
System.Move(Pointer(S)^, P^, L*2);
Inc(P, L);
end;
P^ := #13;
Inc(P);
P^ := #10;
Inc(P);
end;
end;
(*
function TWideStrings.WideGetText: WideString;
var
I, {L, Size,} Count: Integer;
//P: PWideChar;
S: WideString;
begin
Count := GetCount;
//Size := 0;
S := WideString('');
for I := 0 to Count - 1 do
begin
if I > 0 then begin S := S + WideString('#13#10'); end;
S := S + WideGet(I); //this line maybe cause bad performance.
end;
end;
*)
function TWideStrings.IndexOf(const S: string): Integer;
begin
Result := WideIndexOf(WideString(PChar(S)));
end;
function TWideStrings.WideIndexOf(const S: WideString): Integer;
begin
for Result := 0 to GetCount - 1 do
if WideGet(Result) = S then Exit;
//if AnsiCompareText(Get(Result), S) = 0 then Exit;
Result := -1;
end;
function TWideStrings.IndexOfObject(AObject: TObject): Integer;
begin
for Result := 0 to GetCount - 1 do
if GetObject(Result) = AObject then Exit;
Result := -1;
end;
procedure TWideStrings.Insert(Index: Integer; const S: string);
begin
WideInsert(Index,WideString(PChar(S)));
end;
procedure TWideStrings.InsertObject(Index: Integer; const S: string; AObject: TObject);
begin
WideInsertObject(Index,WideString(PChar(S)),AObject);
end;
procedure TWideStrings.WideInsertObject(Index: Integer; const S: WideString; AObject: TObject);
begin
WideInsert(Index, S);
PutObject(Index, AObject);
end;
procedure TWideStrings.LoadFromFile(const FileName: string);
var
Stream: TStream;
begin
Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try
LoadFromStream(Stream);
finally
Stream.Free;
end;
end;
procedure TWideStrings.LoadFromStream(Stream: TStream);
var
Size: Integer;
tmp: string;
//S: WideString;
begin
BeginUpdate;
try
Size := Stream.Size - Stream.Position;
//S.SetLength(Size);
//SetString(S, nil, Size);
SetString(tmp, nil, Size+1);
Stream.Read(Pointer(tmp)^, Size);
//Stream.Read(Pointer(S)^, Size);
SetText(tmp);
//SetText(S);
finally
EndUpdate;
end;
end;
procedure TWideStrings.Move(CurIndex, NewIndex: Integer);
var
TempObject: TObject;
TempString: WideString;
begin
if CurIndex <> NewIndex then
begin
BeginUpdate;
try
TempString := Get(CurIndex);
TempObject := GetObject(CurIndex);
Delete(CurIndex);
InsertObject(NewIndex, TempString, TempObject);
finally
EndUpdate;
end;
end;
end;
procedure TWideStrings.Put(Index: Integer; const S: string);
begin
WidePut(Index,WideString(PChar(S)));
end;
procedure TWideStrings.WidePut(Index: Integer; const S: WideString);
var
TempObject: TObject;
begin
TempObject := GetObject(Index);
Delete(Index);
InsertObject(Index, S, TempObject);
end;
procedure TWideStrings.PutObject(Index: Integer; AObject: TObject);
begin
end;
(*
procedure TWideStrings.ReadData(Reader: TReader);
var
S: String;
W: WideString;
I: Integer;
Z: Integer;
N: Word;
begin
BeginUpdate;
try
Clear;
S:= Reader.ReadString;
SetLength(W, Length(S) div 4);
for I:= 1 to Length(S) div 4 do
begin
Val('$'+S[I*4-3]+S[I*4-2]+S[I*4-1]+S[I*2], N, Z);
W[I]:= WideChar(N);
end;
Text:= W;
finally
EndUpdate;
end;
end;
procedure TWideStrings.WriteData(Writer: TWriter);
var
I: Integer;
S: String;
W: WideString;
begin
W:= Text;
S:= '';
for I := 1 to Length(W) do
S:= S+IntToHex(Word(W[1]), 4);
Writer.WriteString(S);
end;
*)
procedure TWideStrings.SaveToFile(const FileName: string);
var
Stream: TStream;
begin
Stream := TFileStream.Create(FileName, fmCreate);
try
SaveToStream(Stream);
finally
Stream.Free;
end;
end;
procedure TWideStrings.SaveToStream(Stream: TStream);
var
//S: WideString;
tmp:string;
begin
//S := WideGetText;
//tmp := WideCharToString(PWideChar(S));
tmp := GetText;
Stream.WriteBuffer(Pointer(tmp)^, Length(tmp));
//Stream.WriteBuffer(Pointer(S)^, Length(S));
end;
procedure TWideStrings.SetCapacity(NewCapacity: Integer);
begin
// do nothing - descendants may optionally implement this method
end;
procedure TWideStrings.SetText(const Value: string);
begin
WideSetText(CharToWide(Value, __cp));
//WideSetText(WideCharToString(PWideChar(Value)));
end;
procedure TWideStrings.WideSetText(const Value: WideString);
var
P, Start: PWideChar;
S: WideString;
begin
BeginUpdate;
try
Clear;
P := Pointer(Value);
if P <> nil then
while P^ <> #0 do
begin
Start := P;
while not (P^ in [WideChar(#0), WideChar(#10), WideChar(#13)]) do Inc(P);
SetString(S, Start, P - Start);
Add(S);
if P^ = #13 then Inc(P);
if P^ = #10 then Inc(P);
end;
finally
EndUpdate;
end;
end;
function TWideStrings.GetCodePage: Word;
begin
Result := CP_OEMCP;
end;
(*
procedure TWideStrings.WideSetText(const Value: WideString);
var
P, Start: PChar;
S: WideString;
tmp: string;
begin
BeginUpdate;
try
Clear;
tmp := WideCharToString(PWideChar(Value));
P := PChar(tmp);
//P := Pointer(Value);
if P <> nil then
while P^ <> #0 do
begin
Start := P;
while not (P^ in [#0, #10, #13]) do Inc(P);
//while not (P^ in [WideChar(#0), WideChar(#10), WideChar(#13)]) do Inc(P);
SetString(tmp, Start, P - Start);
//SetString(S, Start, P - Start);
S := tmp;
Add(S);
if P^ = #13 then Inc(P);
if P^ = #10 then Inc(P);
end;
finally
EndUpdate;
end;
end;
*)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -