TAChart: Add TChartSeriesLegend.Order property

git-svn-id: trunk@31395 -
This commit is contained in:
ask 2011-06-26 08:45:35 +00:00
parent 1584ede71a
commit e6b1840fc4
4 changed files with 41 additions and 3 deletions

View File

@ -60,8 +60,9 @@ object Form1: TForm1
Source = ListChartSource2 Source = ListChartSource2
end end
object Chart1FuncSeries1: TFuncSeries object Chart1FuncSeries1: TFuncSeries
Legend.OnDraw = Chart1FuncSeries1DrawLegend Legend.Order = 0
Legend.UserItemsCount = 2 Legend.UserItemsCount = 2
Legend.OnDraw = Chart1FuncSeries1DrawLegend
Extent.XMax = 5 Extent.XMax = 5
Extent.UseXMin = True Extent.UseXMin = True
Extent.UseXMax = True Extent.UseXMax = True

View File

@ -311,13 +311,18 @@ end;
procedure TCustomChartSeries.GetLegendItemsBasic(AItems: TChartLegendItems); procedure TCustomChartSeries.GetLegendItemsBasic(AItems: TChartLegendItems);
var var
i: Integer; i, oldCount: Integer;
begin begin
oldCount := AItems.Count;
if Assigned(Legend.OnDraw) then if Assigned(Legend.OnDraw) then
for i := 0 to Legend.UserItemsCount - 1 do for i := 0 to Legend.UserItemsCount - 1 do
AItems.Add(TLegendItemUserDrawn.Create(i, Legend.OnDraw, Title)) AItems.Add(TLegendItemUserDrawn.Create(i, Legend.OnDraw, Title))
else else
GetLegendItems(AItems); GetLegendItems(AItems);
for i := oldCount to AItems.Count - 1 do
with AItems[i] do
if Order = LEGEND_ITEM_ORDER_AS_ADDED then
Order := Legend.Order;
end; end;
function TCustomChartSeries.GetNearestPoint( function TCustomChartSeries.GetNearestPoint(

View File

@ -927,6 +927,7 @@ end;
function TChart.GetLegendItems(AIncludeHidden: Boolean): TChartLegendItems; function TChart.GetLegendItems(AIncludeHidden: Boolean): TChartLegendItems;
var var
i: Integer; i: Integer;
j: Integer = MaxInt;
begin begin
Result := TChartLegendItems.Create; Result := TChartLegendItems.Create;
try try
@ -934,6 +935,12 @@ begin
with Series[i] do with Series[i] do
if AIncludeHidden or (Active and GetShowInLegend) then if AIncludeHidden or (Active and GetShowInLegend) then
GetLegendItemsBasic(Result); GetLegendItemsBasic(Result);
for i := Result.Count - 1 downto 0 do
if Result[i].Order = LEGEND_ITEM_ORDER_AS_ADDED then begin
Result[i].Order := j;
j -= 1;
end;
Result.Sort(@LegendItemCompare);
except except
FreeAndNil(Result); FreeAndNil(Result);
raise; raise;

View File

@ -27,6 +27,7 @@ const
DEF_LEGEND_SPACING = 4; DEF_LEGEND_SPACING = 4;
DEF_LEGEND_MARGIN = 4; DEF_LEGEND_MARGIN = 4;
DEF_LEGEND_SYMBOL_WIDTH = 20; DEF_LEGEND_SYMBOL_WIDTH = 20;
LEGEND_ITEM_ORDER_AS_ADDED = -1;
type type
{ TLegendItem } { TLegendItem }
@ -34,12 +35,14 @@ type
TLegendItem = class TLegendItem = class
private private
FColor: TColor; FColor: TColor;
FOrder: Integer;
FText: String; FText: String;
public public
constructor Create(const AText: String; AColor: TColor = clTAColor); constructor Create(const AText: String; AColor: TColor = clTAColor);
procedure Draw(ADrawer: IChartDrawer; const ARect: TRect); virtual; procedure Draw(ADrawer: IChartDrawer; const ARect: TRect); virtual;
public public
property Color: TColor read FColor write FColor; property Color: TColor read FColor write FColor;
property Order: Integer read FOrder write FOrder;
end; end;
TLegendItemDrawEvent = procedure ( TLegendItemDrawEvent = procedure (
@ -181,9 +184,11 @@ type
private private
FMultiplicity: TLegendMultiplicity; FMultiplicity: TLegendMultiplicity;
FOnDraw: TLegendItemDrawEvent; FOnDraw: TLegendItemDrawEvent;
FOrder: Integer;
FUserItemsCount: Integer; FUserItemsCount: Integer;
procedure SetMultiplicity(AValue: TLegendMultiplicity); procedure SetMultiplicity(AValue: TLegendMultiplicity);
procedure SetOnDraw(AValue: TLegendItemDrawEvent); procedure SetOnDraw(AValue: TLegendItemDrawEvent);
procedure SetOrder(AValue: Integer);
procedure SetUserItemsCount(AValue: Integer); procedure SetUserItemsCount(AValue: Integer);
public public
constructor Create(AOwner: TCustomChart); constructor Create(AOwner: TCustomChart);
@ -192,12 +197,18 @@ type
published published
property Multiplicity: TLegendMultiplicity property Multiplicity: TLegendMultiplicity
read FMultiplicity write SetMultiplicity default lmSingle; read FMultiplicity write SetMultiplicity default lmSingle;
property OnDraw: TLegendItemDrawEvent read FOnDraw write SetOnDraw; property Order: Integer
read FOrder write SetOrder default LEGEND_ITEM_ORDER_AS_ADDED;
property UserItemsCount: Integer property UserItemsCount: Integer
read FUserItemsCount write SetUserItemsCount default 1; read FUserItemsCount write SetUserItemsCount default 1;
property Visible default true; property Visible default true;
published
property OnDraw: TLegendItemDrawEvent read FOnDraw write SetOnDraw;
end; end;
function LegendItemCompare(AItem1, AItem2: Pointer): Integer;
implementation implementation
uses uses
@ -206,6 +217,11 @@ uses
const const
SYMBOL_TEXT_SPACING = 4; SYMBOL_TEXT_SPACING = 4;
function LegendItemCompare(AItem1, AItem2: Pointer): Integer;
begin
Result := Sign(TLegendItem(AItem1).Order - TLegendItem(AItem2).Order);
end;
{ TChartLegendItems } { TChartLegendItems }
function TChartLegendItems.GetItem(AIndex: Integer): TLegendItem; function TChartLegendItems.GetItem(AIndex: Integer): TLegendItem;
@ -223,6 +239,7 @@ end;
constructor TLegendItem.Create(const AText: String; AColor: TColor); constructor TLegendItem.Create(const AText: String; AColor: TColor);
begin begin
FColor := AColor; FColor := AColor;
FOrder := LEGEND_ITEM_ORDER_AS_ADDED;
FText := AText; FText := AText;
end; end;
@ -548,6 +565,7 @@ end;
constructor TChartSeriesLegend.Create(AOwner: TCustomChart); constructor TChartSeriesLegend.Create(AOwner: TCustomChart);
begin begin
inherited Create(AOwner); inherited Create(AOwner);
FOrder := LEGEND_ITEM_ORDER_AS_ADDED;
FVisible := true; FVisible := true;
FUserItemsCount := 1; FUserItemsCount := 1;
end; end;
@ -566,6 +584,13 @@ begin
StyleChanged(Self); StyleChanged(Self);
end; end;
procedure TChartSeriesLegend.SetOrder(AValue: Integer);
begin
if FOrder = AValue then exit;
FOrder := AValue;
StyleChanged(Self);
end;
procedure TChartSeriesLegend.SetUserItemsCount(AValue: Integer); procedure TChartSeriesLegend.SetUserItemsCount(AValue: Integer);
begin begin
if FUserItemsCount = AValue then exit; if FUserItemsCount = AValue then exit;