mirror of
				https://gitlab.com/freepascal.org/lazarus/lazarus.git
				synced 2025-11-04 14:29:25 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			132 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			132 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
{
 | 
						|
 | 
						|
 *****************************************************************************
 | 
						|
  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.
 | 
						|
 |