1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
{
*****************************************************************************
See the file COPYING.modifiedLGPL.txt, included in this distribution,
for details about the license.
*****************************************************************************
Authors: Alexander Klenin
}
unit TAEnumerators;
{$H+}
interface
uses
Classes, Types,
TACustomSeries, TAGraph;
type
TBasicFilteredChartSeriesEnumeratorFactory = class
strict protected
FChart: TChart;
FFilter: TBooleanDynArray;
public
constructor Create(AChart: TChart; AFilter: TBooleanDynArray = nil);
property Chart: TChart read FChart;
property Filter: TBooleanDynArray read FFilter;
end;
{$IFNDEF fpdoc} // Workaround for issue #18549.
generic TFilteredChartSeriesEnumerator<_T> = class
{$ELSE}
TFilteredChartSeriesEnumerator = class
{$ENDIF}
strict private
FFactory: TBasicFilteredChartSeriesEnumeratorFactory;
FPosition: Integer;
public
constructor Create(AFactory: TBasicFilteredChartSeriesEnumeratorFactory);
destructor Destroy; override;
function GetCurrent: _T;
function MoveNext: Boolean;
property Current: _T read GetCurrent;
end;
{$IFNDEF fpdoc} // Workaround for issue #18549.
generic TFilteredChartSeriesEnumeratorFactory<_T> = class(
TBasicFilteredChartSeriesEnumeratorFactory)
{$ELSE}
TFilteredChartSeriesEnumeratorFactory = class(
TBasicFilteredChartSeriesEnumeratorFactory)
{$ENDIF}
public
type
TEnum = specialize TFilteredChartSeriesEnumerator<_T>;
function GetEnumerator: TEnum;
end;
{$IFNDEF fpdoc} // Workaround for issue #18549.
TFilteredCustomChartSeriesEnumeratorFactory =
specialize TFilteredChartSeriesEnumeratorFactory<TCustomChartSeries>;
{$ENDIF}
function CustomSeries(
AChart: TChart; AFilter: TBooleanDynArray = nil
): TFilteredCustomChartSeriesEnumeratorFactory;
implementation
uses
SysUtils;
function CustomSeries(
AChart: TChart; AFilter: TBooleanDynArray):
TFilteredCustomChartSeriesEnumeratorFactory;
begin
Result := TFilteredCustomChartSeriesEnumeratorFactory.Create(AChart, AFilter);
end;
{ TBasicFilteredChartSeriesEnumeratorFactory }
constructor TBasicFilteredChartSeriesEnumeratorFactory.Create(
AChart: TChart; AFilter: TBooleanDynArray);
begin
FChart := AChart;
FFilter := AFilter;
end;
{ TFilteredChartSeriesEnumerator }
constructor TFilteredChartSeriesEnumerator.Create(
AFactory: TBasicFilteredChartSeriesEnumeratorFactory);
begin
FFactory := AFactory;
FPosition := -1;
end;
destructor TFilteredChartSeriesEnumerator.Destroy;
begin
FreeAndNil(FFactory);
inherited;
end;
function TFilteredChartSeriesEnumerator.GetCurrent: _T;
begin
Result := _T(FFactory.Chart.Series.List[FPosition]);
end;
function TFilteredChartSeriesEnumerator.MoveNext: Boolean;
begin
Result := false;
repeat
FPosition += 1;
if FPosition >= FFactory.Chart.SeriesCount then exit;
Result :=
(TBasicChartSeries(FFactory.Chart.Series.List[FPosition]).InheritsFrom(_T)) and
((FPosition > High(FFactory.Filter)) or FFactory.Filter[FPosition]);
until Result;
end;
{ TFilteredChartSeriesEnumeratorFactory }
function TFilteredChartSeriesEnumeratorFactory.GetEnumerator: TEnum;
begin
Result := TEnum.Create(Self);
end;
end.
|