Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ExtractStrings ohne Ausnahmen in "" (https://www.delphipraxis.net/130433-extractstrings-ohne-ausnahmen.html)

frieder2008 8. Mär 2009 12:31


ExtractStrings ohne Ausnahmen in ""
 
Moin,

ich versuche gerade irgendwie, die ExtractStrings-Funktion (D5) so umzubauen, dass sie keine Sonderstellung für Anführungszeichen vergibt. Heißt: Die Funktion nimmt ", ', Lehrzeichen und Zeilenumbruch als Trennungszeichen; Trennzeichen innerhalb zweier Anführungszeichen werden ignoriert. Bsp.:

String:
Hans sucht Jürgen, und sagt ihm "Du Schweinehund"

Dann ergibt die zurückgegebene Liste (Komma auch als Trnnzeichen definiert).
Hans
sucht
Jürgen
und
sagt
ihm
Du Schweinehund

Ich brauche die Funktion jetzt aber so, dass sie ausnahmslos alle Sonderzeichen (also Nicht-Buchstaben) als Trennzeichen, d.h. Anführungzeichen IMMER als Trennzeichen ohne Sonderregel interpretiert.

Ok, ich hoffe, ich konnte mich verständlich machen. Problem jetzt: ich verstehe die VCL-Routine nicht bzw. finde nicht den Abschnitt für diese "Ausnahmeregel"..

Funktion aus der VCL:

Delphi-Quellcode:
  function ExtractStrings(Separators, WhiteSpace: TSysCharSet; Content: PChar;
  Strings: TStrings): Integer;
var
  Head, Tail: PChar;
  EOS, InQuote: Boolean;
  QuoteChar: Char;
  Item: string;
begin
  Result := 0;
  if (Content = nil) or (Content^=#0) or (Strings = nil) then Exit;
  Tail := Content;
  InQuote := False;
  QuoteChar := #0;
  Strings.BeginUpdate;
  try
    repeat
      while Tail^ in WhiteSpace + [#13, #10] do Inc(Tail);
      Head := Tail;
      while True do
      begin
        while (InQuote and not (Tail^ in ['''', '"', #0])) or
          not (Tail^ in Separators + [#0, #13, #10, '''', '"']) do Inc(Tail);
        if Tail^ in ['''', '"'] then
        begin
          if (QuoteChar <> #0) and (QuoteChar = Tail^) then
            QuoteChar := #0
          else QuoteChar := Tail^;
          InQuote := QuoteChar <> #0;
          Inc(Tail);
        end else Break;
      end;
      EOS := Tail^ = #0;
      if (Head <> Tail) and (Head^ <> #0) then
      begin
        if Strings <> nil then
        begin
          SetString(Item, Head, Tail - Head);
          Strings.Add(Item);
        end;
        Inc(Result);
      end;
      Inc(Tail);
    until EOS;
  finally
    Strings.EndUpdate;
  end;
end;
Kann mir jemand einen Hinweis geben?

himitsu 8. Mär 2009 12:40

Re: ExtractStrings ohne Ausnahmen in ""
 
hast du von deinem D5 die Quellcodes?

da kannst du GetParamStr nutzen ...
damit zerlegt Delphi-Referenz durchsuchenParamStr und Delphi-Referenz durchsuchenParamCount die Parameter.

frieder2008 8. Mär 2009 12:59

Re: ExtractStrings ohne Ausnahmen in ""
 
Zitat:

hast du von deinem D5 die Quellcodes?
Ja.

Hm, versteh' ich aber nicht ganz. Sowohl D-Hilfe als auch Parameterlisten kennen bei mir (D5) getparamstr nicht.

Und ich sehe auch (noch) nicht, wo paramstr in dem Delphi-Code von extractstrings ist. :gruebel:

Woran ich dachte, war, einfach die ExtractStrings-Funktion zu kopieren und entsprechend abzuändern.


Gruß & thx a lot

himitsu 8. Mär 2009 13:14

Re: ExtractStrings ohne Ausnahmen in ""
 
drum fragte ich ja, ob du die Quellcodes von Delphi hast ... das ist eine interne Funktion.

frieder2008 8. Mär 2009 13:44

Re: ExtractStrings ohne Ausnahmen in ""
 
kapia eck immer noch nich :duck:

himitsu 8. Mär 2009 13:54

Re: ExtractStrings ohne Ausnahmen in ""
 
Wenn du die Quellcodes des Delphieigenen Units hast, dann brauchst dir nur mal


ich hatte gar was Kleines fast fertig (bis der PC verreckt ist :wall: )
muß aber nun los ... mach's eventuell heut abend nochmal z.B. die Punktion ParamStr ansehn und gucken was die macht.

himitsu 8. Mär 2009 19:49

Re: ExtractStrings ohne Ausnahmen in ""
 
OK, hab grad nochmal nachgesehn ... D7 hat diese Funktion noch nicht, wurde also doch erst später eingeführt :oops:

hier wird erstmal nur das ' ' als Trennzeichen verwendet und wenn ein Teil mit " anfängt, dann bleibt er zusammen...
Delphi-Quellcode:
Function ExplodeEx(Const S: String): TStringDynArray;
  Var i, i2: Integer;

  Begin
    Result := nil;
    i := 1;
    While i <= Length(S) do Begin
      If S[i] = '"' Then Begin
        Inc(i);
        i2 := PosEx('"', S, i);
      End Else i2 := PosEx(' ', S, i + 1);
      If i2 = 0 Then i2 := Length(S) + 1;
      SetLength(Result, Length(Result) + 1);
      Result[High(Result)] := Copy(S, i, i2 - i);
      If (i2 < Length(S)) and (S[i2] = '"') and (S[i2 + 1] = ' ') Then Inc(i2);
      i := i2 + 1;
    End;
  End;
Delphi-Quellcode:
x := ExplodeEx('12 "34 56" 7 89');

// Ergebnis:
x[0] = '12'
x[1] = '34 56'
x[2] = '7'
x[3] = '89'

frieder2008 8. Mär 2009 19:53

Re: ExtractStrings ohne Ausnahmen in ""
 
Klasse, danke! Da kann ich ma versuchen, weiterzubauen! :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz