tforin2.pp 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. program project1;
  2. {$mode objfpc}{$H+}
  3. {$apptype console}
  4. uses
  5. Classes;
  6. type
  7. { TStringEnumerator }
  8. TStringEnumerator = class // reverse enumerator
  9. private
  10. FString: String;
  11. FIndex: Integer;
  12. function GetCurrent: Char; inline;
  13. public
  14. constructor Create(AString: String);
  15. function MoveNext: Boolean;
  16. property Current: Char read GetCurrent;
  17. end;
  18. { TStringEnumerator }
  19. function TStringEnumerator.GetCurrent: Char;
  20. begin
  21. Result := FString[FIndex];
  22. end;
  23. constructor TStringEnumerator.Create(AString: String);
  24. begin
  25. inherited Create;
  26. FString := AString;
  27. FIndex := Length(FString) + 1;
  28. end;
  29. function TStringEnumerator.MoveNext: Boolean;
  30. begin
  31. dec(FIndex);
  32. Result := FIndex > 0;
  33. end;
  34. // define an operator for the string type
  35. operator enumerator (const s: string): TStringEnumerator;inline;
  36. begin
  37. Result := TStringEnumerator.Create(s);
  38. end;
  39. procedure LoopString(s: string);
  40. function getstring(s: string): string;
  41. begin
  42. result:=s;
  43. end;
  44. var
  45. c: char;
  46. begin
  47. // check loop in string. output is 'tset' for the string 'test' :)
  48. for c in getstring(s) do
  49. write(c);
  50. WriteLn;
  51. end;
  52. procedure LoopClass;
  53. var
  54. L: TStringList;
  55. S: String;
  56. begin
  57. L := TStringList.Create;
  58. L.Add('1');
  59. L.Add('2');
  60. L.Add('3');
  61. for S in L do
  62. WriteLn(S);
  63. L.Free;
  64. end;
  65. begin
  66. LoopString('test');
  67. LoopClass;
  68. end.