📄 fr_chart.pas
字号:
{******************************************}
{ }
{ FastReport v2.4 }
{ Chart Add-In Object }
{ }
{ Copyright (c) 1998-2001 by Tzyganenko A. }
{ }
{******************************************}
unit FR_Chart;
interface
{$I FR.inc}
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
FR_Class, ExtCtrls, TeeProcs, TeEngine, Chart, Series, StdCtrls, FR_Ctrls,
ComCtrls, Menus;
type
TChartOptions = packed record
ChartType: Byte;
Dim3D, IsSingle, ShowLegend, ShowAxis, ShowMarks, Colored: Boolean;
MarksStyle: Byte;
Top10Num: Integer;
Reserved: Array[0..35] of Byte;
end;
TfrChartObject = class(TComponent) // fake component
end;
TfrChartView = class(TfrView)
private
FChart: TChart;
FPicture: TMetafile;
CurStr: Integer;
LastLegend: String;
function ShowChart: Boolean;
procedure ChartEditor(Sender: TObject);
public
ChartOptions: TChartOptions;
LegendObj, ValueObj, Top10Label: String;
constructor Create; override;
destructor Destroy; override;
procedure Draw(Canvas: TCanvas); override;
procedure StreamOut(Stream: TStream); override;
procedure LoadFromStream(Stream: TStream); override;
procedure SaveToStream(Stream: TStream); override;
procedure DefinePopupMenu(Popup: TPopupMenu); override;
procedure DefineProperties; override;
procedure OnHook(View: TfrView); override;
procedure ShowEditor; override;
procedure AssignChart(AChart: TCustomChart);
property Chart: TChart read FChart;
end;
TfrChartForm = class(TForm)
Image1: TImage;
Page1: TPageControl;
Tab1: TTabSheet;
GroupBox1: TGroupBox;
SB1: TfrSpeedButton;
SB2: TfrSpeedButton;
SB3: TfrSpeedButton;
SB4: TfrSpeedButton;
SB5: TfrSpeedButton;
SB6: TfrSpeedButton;
Tab2: TTabSheet;
Button1: TButton;
Button2: TButton;
GroupBox2: TGroupBox;
Label1: TLabel;
E1: TEdit;
Label2: TLabel;
E2: TEdit;
GroupBox3: TGroupBox;
CB1: TCheckBox;
CB2: TCheckBox;
CB3: TCheckBox;
CB4: TCheckBox;
CB6: TCheckBox;
CB5: TCheckBox;
Tab3: TTabSheet;
GroupBox4: TGroupBox;
RB1: TRadioButton;
RB2: TRadioButton;
RB3: TRadioButton;
RB4: TRadioButton;
RB5: TRadioButton;
GroupBox5: TGroupBox;
Label3: TLabel;
Label4: TLabel;
E3: TEdit;
E4: TEdit;
Label5: TLabel;
procedure FormShow(Sender: TObject);
private
{ Private declarations }
procedure Localize;
public
{ Public declarations }
end;
implementation
uses FR_Intrp, FR_Pars, FR_Utils, FR_Const;
{$R *.DFM}
type
THackView = class(TfrView)
end;
TSeriesClass = class of TChartSeries;
var
frChartForm: TfrChartForm;
const
ChartTypes: Array[0..5] of TSeriesClass =
(TLineSeries, TAreaSeries, TPointSeries,
TBarSeries, THorizBarSeries, TPieSeries);
function ExtractFieldName(const Fields: string; var Pos: Integer): string;
var
i: Integer;
begin
i := Pos;
while (i <= Length(Fields)) and (Fields[i] <> ';') do Inc(i);
Result := Copy(Fields, Pos, i - Pos);
if (i <= Length(Fields)) and (Fields[i] = ';') then Inc(i);
Pos := i;
end;
constructor TfrChartView.Create;
begin
inherited Create;
FChart := TChart.Create(frChartForm);
with FChart do
begin
Parent := frChartForm;
Visible := False;
BevelInner := bvNone;
BevelOuter := bvNone;
end;
with ChartOptions do
begin
Dim3D := True;
IsSingle := True;
ShowLegend := True;
ShowMarks := True;
Colored := True;
end;
FPicture := TMetafile.Create;
BaseName := 'Chart';
Flags := Flags or flWantHook;
end;
destructor TfrChartView.Destroy;
begin
if frChartForm <> nil then FChart.Free;
FPicture.Free;
inherited Destroy;
end;
procedure TfrChartView.DefineProperties;
begin
inherited DefineProperties;
AddProperty('Chart', [frdtHasEditor, frdtOneObject], ChartEditor);
end;
procedure TfrChartView.AssignChart(AChart: TCustomChart);
var
tmpSeries: TChartSeries;
tmpS: TChartSeriesClass;
i: Integer;
begin
FChart.RemoveAllSeries;
FChart.Assign(AChart);
for i := 0 to AChart.SeriesCount - 1 do
begin
tmpS := TChartSeriesClass(AChart.Series[i].ClassType);
tmpSeries := tmpS.Create(FChart);
tmpSeries.Assign(AChart.Series[i]);
tmpSeries.AssignValues(AChart.Series[i]);
tmpSeries.Marks.Assign(AChart.Series[i].Marks);
{ tmpSeries.Marks.Visible := AChart.Series[i].Marks.Visible;
tmpSeries.Marks.Style := AChart.Series[i].Marks.Style; }
tmpSeries.SeriesColor := AChart.Series[i].SeriesColor;
FChart.AddSeries(tmpSeries);
end;
Memo.Clear;
ValueObj := ''; LegendObj := '';
FPicture.Clear;
end;
function TfrChartView.ShowChart: Boolean;
var
i, j, c1, c2: Integer;
LegS, ValS, s: String;
Ser: TChartSeries;
EMF: TMetafile;
procedure PaintChart;
var
c: TColor;
begin
with Canvas do
begin
c := FillColor;
if c = clNone then
c := clWhite;
Chart.Color := c;
EMF := Chart.TeeCreateMetafile(False, Rect(0, 0, SaveDX, SaveDY));
StretchDraw(DRect, EMF);
EMF.Free;
end;
end;
function Str2Float(s: String): Double;
begin
s := Trim(s);
while (Length(s) > 0) and not (s[1] in ['-', '0'..'9']) do
s := Copy(s, 2, 255); // trim all non-digit chars at the begin
while (Length(s) > 0) and not (s[Length(s)] in ['0'..'9']) do
s := Copy(s, 1, Length(s) - 1); // trim all non-digit chars at the end
while Pos(ThousandSeparator, s) <> 0 do
Delete(s, Pos(ThousandSeparator, s), 1);
Result := 0;
try
Result := StrToFloat(s);
except;
end;
end;
procedure SortValues(var LegS, ValS: String);
var
i, j: Integer;
sl: TStringList;
s: String;
d: Double;
begin
sl := TStringList.Create;
sl.Sorted := True;
i := 1; j := 1;
while i <= Length(LegS) do
sl.Add(SysUtils.Format('%12.3f', [Str2Float(ExtractFieldName(ValS, j))]) + '=' +
ExtractFieldName(LegS, i));
LegS := ''; ValS := '';
for i := 1 to ChartOptions.Top10Num do
begin
s := sl[sl.Count - i];
ValS := ValS + Copy(s, 1, Pos('=', s) - 1) + ';';
LegS := LegS + Copy(s, Pos('=', s) + 1, 255) + ';';
end;
i := sl.Count - ChartOptions.Top10Num - 1; d := 0;
while i >= 0 do
begin
s := sl[i];
d := d + Str2Float(Copy(s, 1, Pos('=', s) - 1));
Dec(i);
end;
if Top10Label <> '' then
begin
LegS := LegS + Top10Label + ';';
ValS := ValS + FloatToStr(d) + ';';
end;
sl.Free;
end;
begin
if (Memo.Count = 0) and (LegendObj = '') and (ValueObj = '') then
if (FPicture.Width = 0) then
begin
PaintChart;
Result := True;
Exit;
end
else
begin
Canvas.StretchDraw(DRect, FPicture);
Result := True;
Exit;
end;
Result := False;
Chart.RemoveAllSeries;
with ChartOptions do
begin
Chart.Frame.Visible := False;
Chart.LeftWall.Brush.Style := bsClear;
Chart.BottomWall.Brush.Style := bsClear;
Chart.View3D := Dim3D;
Chart.Legend.Visible := ShowLegend;
{$IFNDEF Delphi2}
Chart.Title.Font.Charset := frCharset;
Chart.Legend.Font.Charset := frCharset;
Chart.RightAxis.LabelsFont.Charset := frCharset;
Chart.LeftAxis.LabelsFont.Charset := frCharset;
Chart.TopAxis.LabelsFont.Charset := frCharset;
Chart.BottomAxis.LabelsFont.Charset := frCharset;
{$ENDIF}
Chart.AxisVisible := ShowAxis;
Chart.View3DWalls := ChartType <> 5;
{$IFDEF Delphi4}
Chart.BackWall.Brush.Style := bsClear;
Chart.View3DOptions.Elevation := 315;
Chart.View3DOptions.Rotation := 360;
Chart.View3DOptions.Orthogonal := ChartType <> 5;
{$ENDIF}
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -