⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 frxcharteditor.pas

📁 报表源码 FastReport 3 is new generation of the report generators components. It consists of report engin
💻 PAS
📖 第 1 页 / 共 2 页
字号:
{******************************************}
{ }
{ FastReport v3.0 }
{ Chart design editor }
{ }
{ Copyright (c) 1998-2005 }
{ by Alexander Tzyganenko, }
{ Fast Reports Inc. }
{ }
{******************************************}

unit frxChartEditor;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Menus, ExtCtrls, Buttons, frxClass, frxChart, frxCustomEditors,
  frxCtrls, frxInsp, frxDock, TeeProcs, TeEngine, Chart, Series, ComCtrls,
  ImgList
{$IFDEF Delphi6}
, Variants
{$ENDIF};
  

type
  TfrxChartEditor = class(TfrxViewEditor)
  public
    function Edit:Boolean; override;
    function HasEditor:Boolean; override;
    procedure GetMenuItems; override;
    function Execute(Tag:Integer; Checked:Boolean):Boolean; override;
  end;

  TfrxChartEditorForm = class(TForm)
    OkB:TButton;
    Panel1:TPanel;
    InspSite:TPanel;
    ChartTree:TTreeView;
    Panel2:TPanel;
    ChartImages:TImageList;
    Image1:TImage;
    Popup:TPopupMenu;
    LineMI:TMenuItem;
    AreaMI:TMenuItem;
    PointMI:TMenuItem;
    BarMI:TMenuItem;
    HorizBarMI:TMenuItem;
    PieMI:TMenuItem;
    GanttMI:TMenuItem;
    FastLineMI:TMenuItem;
    TreePanel:TPanel;
    AddB:TSpeedButton;
    DeleteB:TSpeedButton;
    SourcePanel:TPanel;
    DBSourceRB:TRadioButton;
    FixedDataRB:TRadioButton;
    DBSourceP:TGroupBox;
    DatasetLbl:TLabel;
    X1Lbl:TLabel;
    Y1Lbl:TLabel;
    DatasetsCB:TComboBox;
    X1ValuesCB:TComboBox;
    Y1ValuesCB:TComboBox;
    FixedDataP:TGroupBox;
    X3Lbl:TLabel;
    Y3Lbl:TLabel;
    XValuesE:TEdit;
    YValuesE:TEdit;
    InsExpressionB1:TSpeedButton;
    InsExpressionB2:TSpeedButton;
    CancelB:TButton;
    OtherLbl:TGroupBox;
    ShowTopLbl:TLabel;
    CaptionLbl:TLabel;
    SortLbl:TLabel;
    TopNE:TEdit;
    TopNCaptionE:TEdit;
    SortCB:TComboBox;
    UpDown1:TUpDown;
    BandSourceP:TGroupBox;
    BandLbl:TLabel;
    X2Lbl:TLabel;
    Y2Lbl:TLabel;
    InsExpressionB3:TSpeedButton;
    InsExpressionB4:TSpeedButton;
    DatabandsCB:TComboBox;
    X2ValuesCB:TComboBox;
    Y2ValuesCB:TComboBox;
    BandSourceRB:TRadioButton;
    procedure FormShow(Sender:TObject);
    procedure ChartTreeClick(Sender:TObject);
    procedure AddBClick(Sender:TObject);
    procedure AddClick(Sender:TObject);
    procedure DeleteBClick(Sender:TObject);
    procedure InsExpressionB1Click(Sender:TObject);
    procedure InsExpressionB2Click(Sender:TObject);
    procedure DoClick(Sender:TObject);
    procedure FormCreate(Sender:TObject);
    procedure UpDown1Click(Sender:TObject; Button:TUDBtnType);
    procedure InsExpressionB3Click(Sender:TObject);
    procedure InsExpressionB4Click(Sender:TObject);
  private
    { Private declarations }
    FChart:TfrxChartView;
    FCurSeries:TfrxSeriesItem;
    FInspector:TfrxObjectInspector;
    FReport:TfrxReport;
    FUpdating:Boolean;
    procedure CalcWidth(RB:TRadioButton);
    procedure EnablePanel(P:TWinControl; E:Boolean);
    procedure FillDataFields;
    procedure FillDataFields1;
  public
    { Public declarations }
    constructor Create(AOwner:TComponent); override;
    destructor Destroy; override;
    property Chart:TfrxChartView read FChart write FChart;
  end;

implementation

uses frxDsgnIntf, frxUtils, GanttCh, frxRes;

{$R *.DFM}

type
  TSeriesClass = class of TChartSeries;
  THackControl = class(TControl);

const
  ChartSeries:array[0..7] of TSeriesClass =
    (TLineSeries, TAreaSeries, TPointSeries, TBarSeries, THorizBarSeries,
     TPieSeries, TGanttSeries, TFastLineSeries);

{ TfrxChartEditor }

function TfrxChartEditor.HasEditor:Boolean;
begin
  Result:= True;
end;

function TfrxChartEditor.Edit:Boolean;
begin
  with TfrxChartEditorForm.Create(Designer) do
  begin
    Chart.Assign(TfrxChartView(Component));
    Result:= ShowModal = mrOk;
    if Result then
      TfrxChartView(Component).Assign(Chart);
    Free;
  end;
end;

function TfrxChartEditor.Execute(Tag:Integer; Checked:Boolean):Boolean;
var
  i:Integer;
  c:TfrxComponent;
  v:TfrxChartView;
begin
  Result:= inherited Execute(Tag, Checked);
  for i:= 0 to Designer.SelectedObjects.Count-1 do
  begin
    c:= Designer.SelectedObjects[i];
    if (c is TfrxChartView) and not (rfDontModify in c.Restrictions) then
    begin
      v:= TfrxChartView(c);
      if Tag = 1 then
        v.Chart.View3D:= Checked
      else if Tag = 2 then
        v.Chart.AxisVisible:= Checked;
      Result:= True;
    end;
  end;
end;

procedure TfrxChartEditor.GetMenuItems;
var
  v:TfrxChartView;
begin
  v:= TfrxChartView(Component);
  AddItem(frxResources.Get('ch3D'), 1, v.Chart.View3D);
  AddItem(frxResources.Get('chAxis'), 2, v.Chart.AxisVisible);
  inherited;
end;

{ TfrxChartEditorForm }

constructor TfrxChartEditorForm.Create(AOwner:TComponent);
begin
  inherited;
  FReport:= TfrxCustomDesigner(AOwner).Report;
  FChart:= TfrxChartView.Create(FReport);
  FInspector:= TfrxObjectInspector.Create(Owner);
  with FInspector do
  begin
    SplitterPos:= InspSite.Width div 2;
    Box.Parent:= InspSite;
    Box.Align:= alClient;
  end;
  OnMouseWheelDown:= FInspector.FormMouseWheelDown;
  OnMouseWheelUp:= FInspector.FormMouseWheelUp;

  frxAssignImages(Image1.Picture.Bitmap, 16, 16, ChartImages);
  Image1.Free;
end;

destructor TfrxChartEditorForm.Destroy;
begin
  FChart.Free;
  inherited;
end;

procedure TfrxChartEditorForm.FormShow(Sender:TObject);

  procedure FillChartTree;
  var
    i, j, ind:Integer;
    n:TTreeNode;
  begin
    for i:= 0 to FChart.Chart.SeriesCount-1 do
    begin
      n:= ChartTree.Items.AddChild(ChartTree.Items[0], 'Series'+IntToStr(i+1));

      ind:= 9;
      for j:= 0 to 7 do
        if FChart.Chart.Series[i].ClassType = ChartSeries[j] then
        begin
          ind:= j+1;
          break;
        end;

      n.ImageIndex:= ind;
      n.SelectedIndex:= ind;
      n.StateIndex:= ind;
      n.Data:= FChart.Chart.Series[i];
    end;

    ChartTree.Items[0].Data:= FChart.Chart;
    ChartTree.FullExpand;
    ChartTree.Selected:= ChartTree.Items[0];
    ChartTreeClick(nil);
  end;

  procedure FillBandsList;
  var
    i:Integer;
    c:TfrxComponent;
  begin
    for i:= 0 to FReport.Designer.Objects.Count-1 do
    begin
      c:= FReport.Designer.Objects[i];
      if c is TfrxDataBand then
        DatabandsCB.Items.Add(c.Name);
    end;
  end;

begin
  FInspector.Inspect([FChart.Chart]);
  FillChartTree;
  FReport.GetDatasetList(DatasetsCB.Items);
  FillBandsList;

  CalcWidth(DBSourceRB);
  CalcWidth(BandSourceRB);
  CalcWidth(FixedDataRB);
  SortCB.Items.Add(frxResources.Get('chsoNone'));
  SortCB.Items.Add(frxResources.Get('chsoAscending'));
  SortCB.Items.Add(frxResources.Get('chsoDescending'));
end;

procedure TfrxChartEditorForm.ChartTreeClick(Sender:TObject);
var
  i:Integer;
begin
  i:= ChartTree.Selected.AbsoluteIndex-1;
  if i >= 0 then
    FCurSeries:= FChart.SeriesData[i] else
    FCurSeries:= nil;

  FInspector.Inspect([ChartTree.Selected.Data]);
  EnablePanel(SourcePanel, FCurSeries<>nil);
  DeleteB.Visible:= FCurSeries<>nil;

  if FCurSeries<>nil then
  begin
    FUpdating:= True;
    if FCurSeries.DataType = dtDBData then
    begin
      DBSourceRB.Checked:= True;
      EnablePanel(DBSourceP, True);
      EnablePanel(BandSourceP, False);
      EnablePanel(FixedDataP, False);
      X1ValuesCB.Text:= FCurSeries.XSource;
      Y1ValuesCB.Text:= FCurSeries.YSource;
      if FCurSeries.DataSet = nil then
        DatasetsCB.ItemIndex:=-1 else
        DatasetsCB.ItemIndex:= DatasetsCB.Items.IndexOf(
          FReport.GetAlias(FCurSeries.DataSet));
      FillDataFields;
    end
    else if FCurSeries.DataType = dtBandData then
    begin
      BandSourceRB.Checked:= True;
      EnablePanel(DBSourceP, False);
      EnablePanel(BandSourceP, True);
      EnablePanel(FixedDataP, False);
      X2ValuesCB.Text:= FCurSeries.XSource;
      Y2ValuesCB.Text:= FCurSeries.YSource;
      if FCurSeries.DataBand = nil then
        DatabandsCB.ItemIndex:=-1 else
        DatabandsCB.ItemIndex:= DatabandsCB.Items.IndexOf(FCurSeries.DataBand.Name);
      FillDataFields1;
    end
    else
    begin
      FixedDataRB.Checked:= True;
      EnablePanel(DBSourceP, False);
      EnablePanel(BandSourceP, False);
      EnablePanel(FixedDataP, True);
      XValuesE.Text:= FCurSeries.XSource;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -