Browse Source

* Simplified SetDelimitedText

git-svn-id: trunk@46531 -
michael 5 years ago
parent
commit
51b43aff3f
1 changed files with 23 additions and 52 deletions
  1. 23 52
      rtl/objpas/classes/stringl.inc

+ 23 - 52
rtl/objpas/classes/stringl.inc

@@ -547,6 +547,11 @@ var
   end;
 
   Function CheckQuoted : Boolean;
+  { Paraphrased from Delphi XE2 help:
+    Strings must be separated by Delimiter characters or spaces.
+    They may be enclosed in QuoteChars.
+    QuoteChars in the string must be repeated to distinguish them from the QuoteChars enclosing the string.
+  }
 
   begin
     Result:=(AValue[i]=aQuoteChar) and (aQuoteChar<>#0);
@@ -567,60 +572,29 @@ var
     i:=j+1;
   end;
 
-begin
- BeginUpdate;
-
- i:=1;
- j:=1;
- aNotFirst:=false;
+  Procedure MaybeSkipSpaces; inline;
 
- { Paraphrased from Delphi XE2 help:
- Strings must be separated by Delimiter characters or spaces.
- They may be enclosed in QuoteChars.
- QuoteChars in the string must be repeated to distinguish them from the QuoteChars enclosing the string.
- }
- try
-  if DoClear then
-    Clear;
-  len:=length(AValue);
-  If aStrictDelimiter then
-    begin
-    while i<=len do
-      begin
-      // skip delimiter
-      if aNotFirst and (i<=len) and (AValue[i]=aDelimiter) then
+  begin
+    if Not aStrictDelimiter then
+      while (i<=len) and (Ord(AValue[i])<=Ord(' ')) do
         inc(i);
-      // read next string
-      if i>len then
-        begin
-        if aNotFirst then Add('');
-        end
-      else
-        begin
-        If not CheckQuoted then
-          begin
-          // next string is not quoted; read until delimiter
-          j:=i;
-          while (j<=len) and
-                (AValue[j]<>aDelimiter) do inc(j);
-          Add( Copy(AValue,i,j-i));
-          i:=j;
-          end;
-        end;
-      aNotFirst:=true;
-      end;
-    end
-  else 
-    begin
+  end;
+
+begin
+  BeginUpdate;
+  i:=1;
+  j:=1;
+  aNotFirst:=false;
+  try
+    if DoClear then
+      Clear;
+    len:=length(AValue);
     while i<=len do
       begin
       // skip delimiter
       if aNotFirst and (i<=len) and (AValue[i]=aDelimiter) then
         inc(i);
-
-      // skip spaces
-      while (i<=len) and (Ord(AValue[i])<=Ord(' ')) do inc(i);
-    
+      MaybeSkipSpaces;
       // read next string
       if i>len then
         begin
@@ -634,19 +608,16 @@ begin
           // next string is not quoted; read until control character/space/delimiter
           j:=i;
           while (j<=len) and
-                (Ord(AValue[j])>Ord(' ')) and
+                (aStrictDelimiter or (Ord(AValue[j])>Ord(' '))) and
                 (AValue[j]<>aDelimiter) do
             inc(j);
           Add( Copy(AValue,i,j-i));
           i:=j;
           end;
         end;
-      // skip spaces
-      while (i<=len) and (Ord(AValue[i])<=Ord(' ')) do
-        inc(i);
+      MaybeSkipSpaces;
       aNotFirst:=true;
       end; // While I<=Len
-    end; // If StrictDelimiter
  finally
    EndUpdate;
  end;