Implementujeme iterator pro Bookmarklist

vložil Radek Červinka 26. března 2019 22:14

Už od verze 2007 Delphi podporuje procházení přes for - in, bohužel některé třídy stále tuto podporu nemají.

Požadovaný stav:

var
  bmk: TBookmark;
begin
  for bmk in  DBGrid1.SelectedRows do
  begin
//xxx
  end;
end;

Bohužel ale

[dcc32 Error] Unit18.pas(33): E2431 for-in statement cannot operate on collection type 'TBookmarkList' because 'TBookmarkList' does not contain a member for 'GetEnumerator', or it is inaccessible

Ukáži jak jednoduše doimplementovat podporu bez zásahu do zdrojových kódu RTL. Pro tuto akci využijeme class helper.

Nebudeme chodit kolem horké kaše a ukažme si kód.

unit uBookmarks;

interface
uses
  db, Vcl.DBGrids;
type
// vlastni enumerator

  TBookmarkListEnumerator = record
   private
     FIndex: Integer;
     FList : TBookmarkList;
   public
     constructor Create(list: TBookmarkList);
     function GetCurrent: TBookmark; inline;
     function MoveNext: Boolean; inline;
     property Current: TBookmark read GetCurrent;
   end;

// class helper přidávající volání GetEnumerator

   TBookmarkListHelper = class helper for TBookMarkList
   public
     function GetEnumerator: TBookmarkListEnumerator;
   end;

implementation

{ TBookmarkListEnumerator }

constructor TBookmarkListEnumerator.Create(list: TBookmarkList);
begin
  FList := list;
  FIndex := 0;
end;

function TBookmarkListEnumerator.GetCurrent: TBookmark;
begin
  Result := FList.Items[FIndex - 1];
end;

function TBookmarkListEnumerator.MoveNext: Boolean;
begin
  Result := FIndex < FList.Count ;
  if Result then
    Inc(FIndex);
end;
{ TBookmarkListHelper }

function TBookmarkListHelper.GetEnumerator: TBookmarkListEnumerator;
begin
  Result := TBookmarkListEnumerator.Create(Self);
end;

end.

V podstatě je to jednoduché, přes class helper přidáme funkci GetEnumerator, která vrátí vlastní enumerátor (jedná se o rekord, takže neřešíme uvolnění) a zbytek necháme na kompilátoru.

A nyní kdykoliv máme v uses jednotku s naším vylepšením můžeme použít for-in i pro TBookmarkList.

Tagy:

Delphi | Praxe | Rozšíření Delphi

Komentáře

27.3.2019 14:37:26 #

Delfin

Zajimave reseny enumerator dat resultsetu TDataset (i objektu z nej dedenych): https://www.uweraabe.de/Blog/2017/02/09/dataset-enumerator-reloaded/.

Delfin

Komentování ukončeno

Naše nabídka

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy).

love Delphi

O Delphi.cz

Delphi je moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64, Mac OSX, Linux a na iPhone a Android.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Poslední komentáře

Comment RSS

Dle měsíců