staram się dbać o to za pomocą prostego parsera. Mam dwie funkcje, jedna nazywa się NumStringParts, która zwraca liczbę "części" w ciągu znaków ze specjalnym ogranicznikiem (w twoim przypadku powyżej spacji), a GetStrPart zwraca określoną część z łańcucha z określonym ogranicznikiem. Obie te procedury były używane od czasów mojego Turbo Pascala w wielu projektach.
function NumStringParts(SourceStr,Delimiter:String):Integer;
var
offset : integer;
curnum : integer;
begin
curnum := 1;
offset := 1;
while (offset <> 0) do
begin
Offset := Pos(Delimiter,SourceStr);
if Offset <> 0 then
begin
Inc(CurNum);
Delete(SourceStr,1,(Offset-1)+Length(Delimiter));
end;
end;
result := CurNum;
end;
function GetStringPart(SourceStr,Delimiter:String;Num:Integer):string;
var
offset : integer;
CurNum : integer;
CurPart : String;
begin
CurNum := 1;
Offset := 1;
While (CurNum <= Num) and (Offset <> 0) do
begin
Offset := Pos(Delimiter,SourceStr);
if Offset <> 0 then
begin
CurPart := Copy(SourceStr,1,Offset-1);
Delete(SourceStr,1,(Offset-1)+Length(Delimiter));
Inc(CurNum)
end
else
CurPart := SourceStr;
end;
if CurNum >= Num then
Result := CurPart
else
Result := '';
end;
Przykład zastosowania:
var
st : string;
f1,f2 : double;
begin
st := 'a number 12.35 and another 13.415';
ShowMessage('Total String parts = '+IntToStr(NumStringParts(st,#32)));
f1 := StrToFloatDef(GetStringPart(st,#32,3),0.0);
f2 := StrToFloatDef(GetStringPart(st,#32,6),0.0);
ShowMessage('Float 1 = '+FloatToStr(F1)+' and Float 2 = '+FloatToStr(F2));
end;
Procedury te cuda dla prostych lub ściśle oddzielonych przecinkami łańcuchów też. Te procedury działają cudownie w Delphi 2009/2010.
Dzięki za to. Właśnie to czego potrzebuje. Przykład użycia: ScanFormat ("numer 27 ciąg Hello", "numer% d ciąg% s", [@ anInt, @ aString]); Uwaga: Wyodrębnianie ciągu znaków nie będzie działać, jeśli pierwszy znak występujący po ciągu znaków jest również zawarty w samym ciągu. –