Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
Delphi 12 Athens
|
AW: String richtig auswerten
16. Dez 2010, 13: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;
|
|
Zitat
|