{"id":4163,"date":"2020-10-21T14:03:53","date_gmt":"2020-10-21T13:03:53","guid":{"rendered":"https:\/\/solidt.eu\/site\/?p=4163"},"modified":"2025-05-09T15:00:14","modified_gmt":"2025-05-09T14:00:14","slug":"delphi-enumerate-over-tdataset","status":"publish","type":"post","link":"https:\/\/solidt.eu\/site\/delphi-enumerate-over-tdataset\/","title":{"rendered":"Delphi enumerate over TDataSet"},"content":{"rendered":"\n<p>More about enumerators: <a href=\"https:\/\/www.thedelphigeek.com\/2007\/03\/fun-with-enumerators.html\">https:\/\/www.thedelphigeek.com\/2007\/03\/fun-with-enumerators.html<\/a><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"lua\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">unit DataSet.Enumerator;\n\ninterface\n\nuses DB;\n\n{\nExample:\nvar\n  t: TDataSet;\nbegin\n  for t in memTable1 do\n    ShowMessage(t.FieldByName('Name').AsString + ' ' + t.FieldByName('Email').AsString);\nend;\n}\n\ntype\n  TDataSetEnumerator = class\n  private\n      FDataSet: TDataSet;\n      FDoFirst: boolean;\n  public\n      constructor Create(ADataSet: TDataSet);\n      function GetCurrent: TDataSet;\n      function MoveNext: boolean;\n      property Current: TDataSet read GetCurrent;\n  end;\n\n  TDataSetHelper = class helper for TDataSet\n  public\n    function GetEnumerator: TDataSetEnumerator;\n  end;\n\nimplementation\n\n{ TDataSetEnumerator }\n\nconstructor TDataSetEnumerator.Create(ADataSet: TDataSet);\nbegin\n  FDoFirst := True;\n  FDataSet := ADataSet;\n  FDataSet.Open;\nend;\n\nfunction TDataSetEnumerator.GetCurrent: TDataSet;\nbegin\n  Result := FDataSet;\nend;\n\nfunction TDataSetEnumerator.MoveNext: boolean;\nbegin\n  if FDoFirst then\n  begin\n    FDoFirst := False;\n    FDataSet.First;\n  end else\n    FDataSet.Next;\n  Result := not FDataSet.EOF;\nend;\n\n{ TDataSetHelper }\n\nfunction TDataSetHelper.GetEnumerator: TDataSetEnumerator;\nbegin\n  Result:= TDataSetEnumerator.Create(Self);\nend;\n\nend.\n<\/pre>\n\n\n\n<p>Example:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"lua\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">unit uMain;\n\ninterface\n\nuses\n  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,\n  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, FireDAC.Stan.Intf, FireDAC.Stan.Option,\n  FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf,\n  FireDAC.DApt.Intf, Data.DB, FireDAC.Comp.DataSet, FireDAC.Comp.Client, DataSet.Enumerator;\n\ntype\n  TForm1 = class(TForm)\n    memTable1: TFDMemTable;\n    fieldName: TStringField;\n    fieldEmail: TStringField;\n    procedure FormCreate(Sender: TObject);\n  end;\n\nvar\n  Form1: TForm1;\n\nimplementation\n\n{$R *.dfm}\n\nprocedure TForm1.FormCreate(Sender: TObject);\nvar\n  t: TDataSet;\nbegin\n  memTable1.Open;\n\n  memTable1.Append;\n  memTable1.FieldByName('Name').AsString := 'Test';\n  memTable1.FieldByName('Email').AsString := 'test@test.com';\n  memTable1.Post;\n\n  memTable1.Append;\n  memTable1.FieldByName('Name').AsString := 'Test 2';\n  memTable1.FieldByName('Email').AsString := 'test 2@test.com';\n  memTable1.Post;\n\n  memTable1.Append;\n  memTable1.FieldByName('Name').AsString := 'Test 3';\n  memTable1.FieldByName('Email').AsString := 'test 3@test.com';\n  memTable1.Post;\n\n  for t in memTable1 do\n    ShowMessage(t.FieldByName('Name').AsString + ' ' + t.FieldByName('Email').AsString);\nend;\n\nend.\n<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"lua\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">uses\n  System.Generics.Collections;\n\n\nfunction Count&lt;T>(AList: TEnumerable&lt;T>): Integer;\nvar\n  Enumerator: TEnumerator&lt;T>;\nbegin\n  Result := 0;\n  Enumerator := AList.GetEnumerator;\n  try\n    while Enumerator.MoveNext do\n      Inc(Result);\n  finally\n    Enumerator.Free;\n  end;\nend;\n\nfunction First&lt;T>(AList: TEnumerable&lt;T>): T;\nvar\n  Enumerator: TEnumerator&lt;T>;\nbegin\n  Enumerator := AList.GetEnumerator;\n  try\n    if Enumerator.MoveNext then\n      Exit(Enumerator.Current)\n    else\n      raise Exception.Create('First&lt;T>: Sequence contains no elements');\n  finally\n    Enumerator.Free;\n  end;\nend;\n\nfunction Any&lt;T>(AList: TEnumerable&lt;T>): Boolean;\nvar\n  Enumerator: TEnumerator&lt;T>;\nbegin\n  Enumerator := AList.GetEnumerator;\n  try\n    Result := Enumerator.MoveNext;\n  finally\n    Enumerator.Free;\n  end;\nend;\n\nfunction ToArray&lt;T>(AList: TEnumerable&lt;T>): TArray&lt;T>;\nvar\n  List: TList&lt;T>;\nbegin\n  List := TList&lt;T>.Create;\n  try\n    List.AddRange(AList);\n    Result := List.ToArray;\n  finally\n    List.Free;\n  end;\nend;\n\n\n\n<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"lua\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">uses\n  System.SysUtils, System.Generics.Collections, System.Generics.Defaults;\n\ntype\n  TEnumerableHelper&lt;T> = record helper for TEnumerable&lt;T>\n    function Any: Boolean;\n    function First: T;\n    function ToArray: TArray&lt;T>;\n    function Count: Integer;\n  end;\n\n{ Implementatie }\n\nfunction TEnumerableHelper&lt;T>.Any: Boolean;\nvar\n  Enumerator: TEnumerator&lt;T>;\nbegin\n  Enumerator := Self.GetEnumerator;\n  try\n    Result := Enumerator.MoveNext;\n  finally\n    Enumerator.Free;\n  end;\nend;\n\nfunction TEnumerableHelper&lt;T>.First: T;\nvar\n  Enumerator: TEnumerator&lt;T>;\nbegin\n  Enumerator := Self.GetEnumerator;\n  try\n    if Enumerator.MoveNext then\n      Exit(Enumerator.Current)\n    else\n      raise Exception.Create('First&lt;T>: Sequence contains no elements');\n  finally\n    Enumerator.Free;\n  end;\nend;\n\nfunction TEnumerableHelper&lt;T>.ToArray: TArray&lt;T>;\nvar\n  TempList: TList&lt;T>;\nbegin\n  TempList := TList&lt;T>.Create;\n  try\n    TempList.AddRange(Self);\n    Result := TempList.ToArray;\n  finally\n    TempList.Free;\n  end;\nend;\n\nfunction TEnumerableHelper&lt;T>.Count: Integer;\nvar\n  Enumerator: TEnumerator&lt;T>;\nbegin\n  Result := 0;\n  Enumerator := Self.GetEnumerator;\n  try\n    while Enumerator.MoveNext do\n      Inc(Result);\n  finally\n    Enumerator.Free;\n  end;\nend;\n<\/pre>\n\n\n\n<p>Usage<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"lua\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">var\n  List: TList&lt;Integer>;\n  FirstItem: Integer;\n  Items: TArray&lt;Integer>;\nbegin\n  List := TList&lt;Integer>.Create;\n  try\n    List.AddRange([5, 10, 15]);\n\n    if List.Any then\n      FirstItem := List.First;\n\n    Items := List.ToArray;\n  finally\n    List.Free;\n  end;\nend;\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>More about enumerators: https:\/\/www.thedelphigeek.com\/2007\/03\/fun-with-enumerators.html Example: Usage<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-4163","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/4163","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/comments?post=4163"}],"version-history":[{"count":8,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/4163\/revisions"}],"predecessor-version":[{"id":9488,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/4163\/revisions\/9488"}],"wp:attachment":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/media?parent=4163"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/categories?post=4163"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/tags?post=4163"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}