- or how to find ways to add own helpers and keeping existing helpers.
Delphi/Object Pascal does not allow for multiple helpers for the same type to be available at the same time.
So in my little example I wanted a string function that would split a string by a char, but up till a given max length.
A scenario for that use could be if you need to feed a system that has limited fixed size fields, spanning over more fields - CompanyName1, CampanyName2 only being 30 chars each. And for readability and UI, you also need to consider not to split mid-word.
To overcome the issue with the one helper active per type, defined your own matching type:
Define the new record helper for that type with its function:
function SplitMaxProper(const ch: char; const len: Integer): TArray<string>;
end;
Since we also want to use the normal string helpers within the helper function, we need to do some casting when referring to the helpers type itself:
var
sl: TStringList;
begin
var sidx := 0;
var done := False;
sl := TStringList.Create;
try
while (not done) do
begin
var delta := string(Self).LastIndexOf(ch, sidx+len, len);
if (delta = -1) or (string(Self).Length-sidx <= len) then
begin
sl.Add(Trim(string(Self).Substring(sidx)));
done := True;
end
else
sl.Add(Trim(string(Self).Substring(sidx, delta-sidx)));
sidx := delta;
end;
Result := sl.ToStringArray;
finally
sl.Free;
end;
end;
And when using the new string helper we do need to cast to get to our new function:
begin
meSplitText.Clear;
var len := StrToInt(edSplitLength.Text);
var str := MyString(edTextToSplit.Text);
meSplitText.Lines.AddStrings(str.SplitMaxProper(#32, len));
end;
Disclaimer: The code is done so that it does fix better in the narrow width of my blog layout, and the function might also need some optimization :)
A note on the LastIndexOf string helper functions, the current official documentation seems to me a bit unclear:
StartIndex
specifies the offset in this 0-based string where the LastIndexOf method begins the search, and Count
specifies the end offset where the search ends.
Do remember that the search in this case, of cause goes from right to left - so StartIndex would normally be the length of the string.
I started with a Stephen King book title pun, so I should also comment on the quote used in the image shown - a quote from the brilliant author Tom Holt and the book The Portable Door - which is highly recommended, even if you have watched the movie adaptation, which is also good - but different - since adapting Tom Holt's books is no trivial task.
/Enjoy
No comments:
Post a Comment