diff --git a/components/tachart/demo/listbox/Unit1.lfm b/components/tachart/demo/listbox/Unit1.lfm index 9083f40ba4..1c0e61de8a 100644 --- a/components/tachart/demo/listbox/Unit1.lfm +++ b/components/tachart/demo/listbox/Unit1.lfm @@ -108,6 +108,7 @@ object Form1: TForm1 Top = 0 Width = 138 Chart = Chart + OnAddSeries = ChartListboxAddSeries OnCheckboxClick = ChartListboxCheckboxClick OnItemClick = ChartListboxItemClick OnSeriesIconDblClick = ChartListboxSeriesIconDblClick diff --git a/components/tachart/demo/listbox/Unit1.pas b/components/tachart/demo/listbox/Unit1.pas index c27c7b1bf7..b10d9cc418 100644 --- a/components/tachart/demo/listbox/Unit1.pas +++ b/components/tachart/demo/listbox/Unit1.pas @@ -7,7 +7,7 @@ interface uses Classes, SysUtils, TASources, TASeries, TAGraph, CheckLst, Spin, ComCtrls, ExtCtrls, StdCtrls, FileUtil, Forms, Controls, Graphics, Dialogs, - TAChartListbox; + TAChartListbox, TACustomSeries, TALegend; type @@ -48,13 +48,15 @@ type procedure CbShowSeriesIconChange(Sender: TObject); procedure CbCheckStyleChange(Sender: TObject); procedure CbKeepSeriesOutChange(Sender: TObject); + procedure ChartListboxAddSeries(ASender: TChartListbox; + ASeries: TCustomChartSeries; AItems: TChartLegendItems; + var ASkip: Boolean); procedure EdColumnsChange(Sender: TObject); procedure FormCreate(Sender: TObject); procedure ChartListboxCheckboxClick(Sender: TObject; Index: Integer); procedure ChartListboxClick(Sender: TObject); procedure ChartListboxItemClick(Sender: TObject; Index: Integer); procedure ChartListboxSeriesIconDblClick(Sender: TObject; Index: Integer); - procedure ChartListboxPopulate(Sender: TObject); private procedure CreateData; end; @@ -120,12 +122,6 @@ begin [ItemIndex, Series[ItemIndex].Title])); end; -procedure TForm1.ChartListboxPopulate(Sender: TObject); -begin - ChartListbox.RemoveSeries(SinSeries); - ChartListbox.RemoveSeries(CosSeries); -end; - procedure TForm1.FormCreate(Sender: TObject); begin CreateData; @@ -154,6 +150,13 @@ begin Options := Options - [cloShowIcons]; end; +procedure TForm1.ChartListboxAddSeries(ASender: TChartListbox; + ASeries: TCustomChartSeries; AItems: TChartLegendItems; var ASkip: Boolean); +begin + ASkip := CbKeepSeriesOut.Checked and + ((ASeries = SinSeries) or (ASeries = CosSeries)); +end; + procedure TForm1.CbCheckStyleChange(Sender:TObject); begin if CbCheckStyle.Checked then @@ -164,13 +167,7 @@ end; procedure TForm1.CbKeepSeriesOutChange(Sender: TObject); begin - if CbKeepSeriesOut.Checked then begin - ChartListbox.OnPopulate := @ChartListboxPopulate; - ChartListbox.RemoveSeries(SinSeries); - ChartListbox.RemoveSeries(CosSeries); - end - else - ChartListbox.OnPopulate := nil; + ChartListbox.SeriesChanged(Self); end; procedure TForm1.EdColumnsChange(Sender: TObject); diff --git a/components/tachart/tachartlistbox.pas b/components/tachart/tachartlistbox.pas index 34feeffa5b..d863ffa0d2 100644 --- a/components/tachart/tachartlistbox.pas +++ b/components/tachart/tachartlistbox.pas @@ -36,9 +36,16 @@ uses TAChartUtils, TACustomSeries, TALegend, TAGraph; type + TChartListbox = class; + TChartListboxIndexEvent = procedure ( ASender: TObject; AIndex: Integer) of object; + TChartListboxAddSeriesEvent = procedure ( + ASender: TChartListbox; ASeries: TCustomChartSeries; + AItems: TChartLegendItems; var ASkip: Boolean + ) of object; + TCheckBoxesStyle = (cbsCheckbox, cbsRadiobutton); TChartListOption = (cloShowCheckboxes, cloShowIcons); @@ -55,6 +62,7 @@ type FLegendItems: TChartLegendItems; FListener: TListener; FLockCount: Integer; + FOnAddSeries: TChartListboxAddSeriesEvent; FOnCheckboxClick: TChartListboxIndexEvent; FOnItemClick: TChartListboxIndexEvent; FOnPopulate: TNotifyEvent; @@ -65,10 +73,10 @@ type function GetLegendItem(AIndex: Integer): TLegendItem; function GetSeries(AIndex: Integer): TCustomChartSeries; function GetSeriesCount: Integer; - procedure SeriesChanged(ASender: TObject); procedure SetChart(AValue: TChart); procedure SetChecked(AIndex: Integer; AValue: Boolean); procedure SetCheckStyle(AValue: TCheckBoxesStyle); + procedure SetOnAddSeries(AValue: TChartListboxAddSeriesEvent); procedure SetOnPopulate(AValue: TNotifyEvent); procedure SetOptions(AValue: TChartListOptions); @@ -98,6 +106,8 @@ type function FindSeriesIndex(ASeries: TCustomChartSeries): Integer; procedure MeasureItem(AIndex: Integer; var AHeight: Integer); override; procedure RemoveSeries(ASeries: TCustomChartSeries); + procedure SeriesChanged(ASender: TObject); + property Checked[AIndex: Integer]: Boolean read GetChecked write SetChecked; property Series[AIndex: Integer]: TCustomChartSeries read GetSeries; property SeriesCount: Integer read GetSeriesCount; @@ -109,6 +119,8 @@ type property Options: TChartListOptions read FOptions write SetOptions default SHOW_ALL; published + property OnAddSeries: TChartListboxAddSeriesEvent + read FOnAddSeries write SetOnAddSeries; property OnCheckboxClick: TChartListboxIndexEvent read FOnCheckboxClick write FOnCheckboxClick; property OnItemClick: TChartListboxIndexEvent @@ -254,13 +266,20 @@ function TChartListbox.CreateLegendItems: TChartLegendItems; a single legend item is used } var i: Integer; + skip: Boolean; begin Result := TChartLegendItems.Create; try if FChart = nil then exit; for i := 0 to FChart.SeriesCount - 1 do - if FChart.Series[i] is TCustomChartSeries then + if FChart.Series[i] is TCustomChartSeries then begin + if Assigned(OnAddSeries) then begin + skip := false; + FOnAddSeries(Self, TCustomChartSeries(FChart.Series[i]), Result, skip); + if skip then continue; + end; TCustomChartSeries(FChart.Series[i]).GetSingleLegendItem(Result); + end; except FreeAndNil(Result); raise; @@ -551,6 +570,13 @@ begin Invalidate; end; +procedure TChartListbox.SetOnAddSeries(AValue: TChartListboxAddSeriesEvent); +begin + if TMethod(FOnAddSeries) = TMethod(AValue) then exit; + FOnAddSeries := AValue; + Populate; +end; + procedure TChartListbox.SetOnPopulate(AValue: TNotifyEvent); begin if TMethod(FOnPopulate) = TMethod(AValue) then exit;