Einzelnen Beitrag anzeigen

Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: String richtig auswerten

  Alt 16. Dez 2010, 12:16
Normalerweise werden Zeilen unter Windows mit #13#10 getrennt(nicht mit #10#13).

Man kann sich auch schnell selbst was schreiben:
- nur %s Platzhalter
- Platzhalter müssen durch Text, mindestens ein Zeichen, von einander getrennt sein(Trenntext)
- der eingefügte Text darf nicht den nachfolgenden Trenntext enthalten
Delphi-Quellcode:
type
  TStringVar = ^string;

function ExtraxtFormatFields(const AFormat, AValue: string; const AFields: array of TStringVar): Boolean;
{---}
  function GetPos(const substr, str: AnsiString; out idx: Integer): Boolean; inline;
  begin
    idx := Pos(substr, str);
    Result := (idx > 0);
  end;
{---}
var
  sTrenn: array of string;
  i, idx: Integer;
  s: string;
begin
  Result := False;
  s := AFormat;
  i := 0;
  while GetPos('%s', s, idx) do
  begin
    if idx = 1 then
    begin
      if i > 0 then
      begin
        Exit; // %s%s ohne Trennzeichen ist ungültig
      end;
    end;
    SetLength(sTrenn, i + 1);
    sTrenn[i] := Copy(s, 1, idx - 1);
    Inc(i);
    Delete(s, 1, idx + 1);
  end;
  SetLength(sTrenn, i + 1);
  sTrenn[i] := s;

  if Length(sTrenn) > Length(AFields) then
  begin
    s := AValue;
    if sTrenn[0] <> 'then
    begin
      if Pos(sTrenn[0], s) <> 1 then
        Exit; // Format stimmt nicht mit dem String überein
      Delete(s, 1, Length(sTrenn[0]));
    end;

    for i := 0 to High(AFields) do
    begin
      if sTrenn[i + 1] = 'then
        AFields[i]^ := s // letzte Variable
      else
      begin
        idx := Pos(sTrenn[i + 1], s);
        if idx = 0 then
          Exit; // Format stimmt nicht mit dem String überein
        AFields[i]^ := Copy(s, 1, idx - 1);
        Delete(s, 1, idx + Length(sTrenn[i + 1]) - 1);
      end;
    end;
    Result := True;
  end;
end;

procedure Test;
const
  CR = Chr(13); // carriage return
  LF = Chr(10); // line feed
  CRLF = CR + LF;
  TEXT_FORMAT =
    '%s{'              + CRLF +
    '(''%s'';''%s'')'  + CRLF +
    ' (RECT)'          + CRLF +
    ' (''%s'';''%s'')' + CRLF +
    '}';
var
  s: string;
  one, two, three, four, five: string;
begin
  s := Format(TEXT_FORMAT, ['one', 'two', 'three', 'four', 'five']);

  if ExtraxtFormatFields(TEXT_FORMAT, s, [@one, @two, @three, @four, @five]) then
  begin
    ShowMessage(one + CRLF + two + CRLF + three + CRLF + four + CRLF + five);
  end;
end;
  Mit Zitat antworten Zitat