📄 tntwidestrings.pas
字号:
if (Count = 1) and (Get(0) = '') then
Result := WideString(QuoteChar) + QuoteChar
else
begin
Result := '';
for I := 0 to Count - 1 do
begin
S := Get(I);
P := PWideChar(S);
while not ((P^ in [WideChar(#0)..WideChar(' ')]) or (P^ = QuoteChar) or (P^ = Delimiter)) do
Inc(P);
if (P^ <> #0) then S := WideQuotedStr(S, QuoteChar);
Result := Result + S + Delimiter;
end;
System.Delete(Result, Length(Result), 1);
end;
end;
function TWideStrings.GetName(Index: Integer): WideString;
begin
Result := ExtractName(Get(Index));
end;
function TWideStrings.GetObject(Index: Integer): TObject;
begin
Result := nil;
end;
function TWideStrings.GetEnumerator: TWideStringsEnumerator;
begin
Result := TWideStringsEnumerator.Create(Self);
end;
function TWideStrings.GetTextW: PWideChar;
begin
Result := WStrNew(PWideChar(GetTextStr));
end;
function TWideStrings.GetTextStr: WideString;
var
I, L, Size, Count: Integer;
P: PWideChar;
S, LB: WideString;
begin
Count := GetCount;
Size := 0;
LB := sLineBreak;
for I := 0 to Count - 1 do Inc(Size, Length(Get(I)) + Length(LB));
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 * SizeOf(WideChar));
Inc(P, L);
end;
L := Length(LB);
if L <> 0 then
begin
System.Move(Pointer(LB)^, P^, L * SizeOf(WideChar));
Inc(P, L);
end;
end;
end;
function TWideStrings.GetValue(const Name: WideString): WideString;
var
I: Integer;
begin
I := IndexOfName(Name);
if I >= 0 then
Result := Copy(Get(I), Length(Name) + 2, MaxInt) else
Result := '';
end;
function TWideStrings.IndexOf(const S: WideString): Integer;
begin
for Result := 0 to GetCount - 1 do
if CompareStrings(Get(Result), S) = 0 then Exit;
Result := -1;
end;
function TWideStrings.IndexOfName(const Name: WideString): Integer;
var
P: Integer;
S: WideString;
begin
for Result := 0 to GetCount - 1 do
begin
S := Get(Result);
P := Pos(NameValueSeparator, S);
if (P <> 0) and (CompareStrings(Copy(S, 1, P - 1), Name) = 0) then Exit;
end;
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.InsertObject(Index: Integer; const S: WideString;
AObject: TObject);
begin
Insert(Index, S);
PutObject(Index, AObject);
end;
procedure TWideStrings.LoadFromFile(const FileName: WideString);
var
Stream: TStream;
begin
Stream := TTntFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try
LoadFromStream(Stream);
finally
Stream.Free;
end;
end;
procedure TWideStrings.LoadFromStream(Stream: TStream);
var
Size: Integer;
S: WideString;
begin
BeginUpdate;
try
Size := Stream.Size - Stream.Position;
SetString(S, nil, Size div SizeOf(WideChar));
Stream.Read(Pointer(S)^, Length(S) * SizeOf(WideChar));
SetTextStr(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: 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);
begin
if Reader.NextValue in [vaString, vaLString] then
SetTextStr(Reader.ReadString) {JCL compatiblity}
else if Reader.NextValue = vaWString then
SetTextStr(Reader.ReadWideString) {JCL compatiblity}
else begin
BeginUpdate;
try
Clear;
Reader.ReadListBegin;
while not Reader.EndOfList do
if Reader.NextValue in [vaString, vaLString] then
Add(Reader.ReadString) {TStrings compatiblity}
else
Add(Reader.ReadWideString);
Reader.ReadListEnd;
finally
EndUpdate;
end;
end;
end;
procedure TWideStrings.SaveToFile(const FileName: WideString);
var
Stream: TStream;
begin
Stream := TTntFileStream.Create(FileName, fmCreate);
try
SaveToStream(Stream);
finally
Stream.Free;
end;
end;
procedure TWideStrings.SaveToStream(Stream: TStream);
var
SW: WideString;
begin
SW := GetTextStr;
Stream.WriteBuffer(PWideChar(SW)^, Length(SW) * SizeOf(WideChar));
end;
procedure TWideStrings.SetCapacity(NewCapacity: Integer);
begin
// do nothing - descendents may optionally implement this method
end;
procedure TWideStrings.SetCommaText(const Value: WideString);
begin
Delimiter := ',';
QuoteChar := '"';
SetDelimitedText(Value);
end;
procedure TWideStrings.SetStringsAdapter(const Value: IWideStringsAdapter);
begin
if FAdapter <> nil then FAdapter.ReleaseStrings;
FAdapter := Value;
if FAdapter <> nil then FAdapter.ReferenceStrings(Self);
end;
procedure TWideStrings.SetTextW(const Text: PWideChar);
begin
SetTextStr(Text);
end;
procedure TWideStrings.SetTextStr(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)]) and (P^ <> WideLineSeparator) do
Inc(P);
SetString(S, Start, P - Start);
Add(S);
if P^ = #13 then Inc(P);
if P^ = #10 then Inc(P);
if P^ = WideLineSeparator then Inc(P);
end;
finally
EndUpdate;
end;
end;
procedure TWideStrings.SetUpdateState(Updating: Boolean);
begin
end;
procedure TWideStrings.SetValue(const Name, Value: WideString);
var
I: Integer;
begin
I := IndexOfName(Name);
if Value <> '' then
begin
if I < 0 then I := Add('');
Put(I, Name + NameValueSeparator + Value);
end else
begin
if I >= 0 then Delete(I);
end;
end;
procedure TWideStrings.WriteData(Writer: TWriter);
var
I: Integer;
begin
Writer.WriteListBegin;
for I := 0 to Count-1 do begin
Writer.WriteWideString(Get(I));
end;
Writer.WriteListEnd;
end;
procedure TWideStrings.SetDelimitedText(const Value: WideString);
var
P, P1: PWideChar;
S: WideString;
begin
BeginUpdate;
try
Clear;
P := PWideChar(Value);
while P^ in [WideChar(#1)..WideChar(' ')] do
Inc(P);
while P^ <> #0 do
begin
if P^ = QuoteChar then
S := WideExtractQuotedStr(P, QuoteChar)
else
begin
P1 := P;
while (P^ > ' ') and (P^ <> Delimiter) do
Inc(P);
SetString(S, P1, P - P1);
end;
Add(S);
while P^ in [WideChar(#1)..WideChar(' ')] do
Inc(P);
if P^ = Delimiter then
begin
P1 := P;
Inc(P1);
if P1^ = #0 then
Add('');
repeat
Inc(P);
until not (P^ in [WideChar(#1)..WideChar(' ')]);
end;
end;
finally
EndUpdate;
end;
end;
function TWideStrings.GetDelimiter: WideChar;
begin
if not (sdDelimiter in FDefined) then
Delimiter := ',';
Result := FDelimiter;
end;
function TWideStrings.GetQuoteChar: WideChar;
begin
if not (sdQuoteChar in FDefined) then
QuoteChar := '"';
Result := FQuoteChar;
end;
procedure TWideStrings.SetDelimiter(const Value: WideChar);
begin
if (FDelimiter <> Value) or not (sdDelimiter in FDefined) then
begin
Include(FDefined, sdDelimiter);
FDelimiter := Value;
end
end;
procedure TWideStrings.SetQuoteChar(const Value: WideChar);
begin
if (FQuoteChar <> Value) or not (sdQuoteChar in FDefined) then
begin
Include(FDefined, sdQuoteChar);
FQuoteChar := Value;
end
end;
function TWideStrings.CompareStrings(const S1, S2: WideString): Integer;
begin
Result := WideCompareText(S1, S2);
end;
function TWideStrings.GetNameValueSeparator: WideChar;
begin
{$IFDEF COMPILER_7_UP}
if not (sdNameValueSeparator in FDefined) then
NameValueSeparator := '=';
Result := FNameValueSeparator;
{$ELSE}
Result := '=';
{$ENDIF}
end;
{$IFDEF COMPILER_7_UP}
procedure TWideStrings.SetNameValueSeparator(const Value: WideChar);
begin
if (FNameValueSeparator <> Value) or not (sdNameValueSeparator in FDefined) then
begin
Include(FDefined, sdNameValueSeparator);
FNameValueSeparator := Value;
end
end;
{$ENDIF}
function TWideStrings.GetValueFromIndex(Index: Integer): WideString;
begin
if Index >= 0 then
Result := Copy(Get(Index), Length(Names[Index]) + 2, MaxInt) else
Result := '';
end;
procedure TWideStrings.SetValueFromIndex(Index: Integer; const Value: WideString);
begin
if Value <> '' then
begin
if Index < 0 then Index := Add('');
Put(Index, Names[Index] + NameValueSeparator + Value);
end
else
if Index >= 0 then Delete(Index);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -