teeediseri.pas

来自「Delphi TeeChartPro.6.01的源代码」· PAS 代码 · 共 1,024 行 · 第 1/2 页

PAS
1,024
字号
{**************************************************}
{  TCustomChartSeries (or derived) Editor Dialog   }
{  Copyright (c) 1996-2003 by David Berneda        }
{**************************************************}
unit TeeEdiSeri;
{$I TeeDefs.inc}

interface

uses
  {$IFNDEF LINUX}
  Windows, Messages,
  {$ENDIF}
  SysUtils, Classes,
  {$IFDEF CLX}
  QGraphics, QControls, QForms, QDialogs, QStdCtrls, QExtCtrls, QComCtrls,
  QButtons, QGrids, QTypes,
  {$ELSE}
  Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, Buttons,
  Grids,
  {$ENDIF}
  TeEngine, TeeCustomShapeEditor, TeeProcs, TeCanvas, TeePenDlg,
  Chart, TeeSourceEdit, TeeChartGrid, TeeNavigator, TeeLisB;

type
  TFormTeeSeries = class(TForm,ITeeEventListener)
    CBPersistent: TCheckBox;
    PageSeries: TPageControl;
    TheTabSheet: TTabSheet;
    TabGeneral: TTabSheet;
    GB5: TGroupBox;
    L27: TLabel;
    CBShowInLegend: TCheckBox;
    CBCursor: TComboFlat;
    GB2: TGroupBox;
    L15: TLabel;
    L21: TLabel;
    EPercentFormat: TEdit;
    TabMarks: TTabSheet;
    TabDataSource: TTabSheet;
    GBHorizAxis: TGroupBox;
    CBHorizAxis: TComboFlat;
    CBXDateTime: TCheckBox;
    GBVertAxis: TGroupBox;
    CBVertAxis: TComboFlat;
    CBYDateTime: TCheckBox;
    PageControlMarks: TPageControl;
    TabSheet1: TTabSheet;
    CBMarksVisible: TCheckBox;
    CBMarkClip: TCheckBox;
    L23: TLabel;
    SEMarksAngle: TEdit;
    UDMarksAngle: TUpDown;
    Label3: TLabel;
    EMarksEvery: TEdit;
    UDEvery: TUpDown;
    CBMultiLine: TCheckBox;
    LSort: TLabel;
    CBSort: TComboFlat;
    CBSeries: TComboFlat;
    ImageSeries: TImage;
    LabelSeriesClass: TLabel;
    Panel1: TPanel;
    CBFormat: TComboFlat;
    Panel2: TPanel;
    PanTop: TPanel;
    CBDataSourcestyle: TComboFlat;
    LDepth: TLabel;
    EDepth: TEdit;
    UDDepth: TUpDown;
    CBDepth: TCheckBox;
    CBAllVisible: TCheckBox;
    PaintBox1: TPaintBox;
    Panel3: TPanel;
    RGMarkStyle: TComboFlat;
    Label1: TLabel;
    NewDataButton: TButton;
    EditDataButton: TButton;
    DeleteDataButton: TButton;
    ChartGrid1: TChartGrid;
    ChartGridNavigator1: TChartGridNavigator;
    Panel4: TPanel;
    Label2: TLabel;
    ESamples: TEdit;
    CBSamplesDefault: TCheckBox;
    BApplyRandom: TButton;
    TabSheet2: TTabSheet;
    BMarkLinCol: TButtonPen;
    L32: TLabel;
    SEArrowLength: TEdit;
    UDArrowsLength: TUpDown;
    Label4: TLabel;
    EArrowDist: TEdit;
    UDArrowDist: TUpDown;
    BCalloutPointer: TButton;
    Label11: TLabel;
    CBHead: TComboFlat;
    Label12: TLabel;
    Edit1: TEdit;
    UDHeadSize: TUpDown;
    Timer1: TTimer;
    procedure EPercentFormatChange(Sender: TObject);
    procedure PageSeriesChange(Sender: TObject);
    procedure CBSeriesChange(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure RGMarkStyleClick(Sender: TObject);
    procedure CBPersistentClick(Sender: TObject);
    procedure CBYDateTimeClick(Sender: TObject);
    procedure CBXDateTimeClick(Sender: TObject);
    procedure CBDataSourcestyleChange(Sender: TObject);
    procedure CBShowInLegendClick(Sender: TObject);
    procedure CBCursorChange(Sender: TObject);
    procedure SEArrowLengthChange(Sender: TObject);
    procedure CBMarkClipClick(Sender: TObject);
    procedure CBMarksVisibleClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure SEMarksAngleChange(Sender: TObject);
    procedure CBHorizAxisChange(Sender: TObject);
    procedure CBVertAxisChange(Sender: TObject);
    procedure EMarksEveryChange(Sender: TObject);
    procedure CBMultiLineClick(Sender: TObject);
    procedure CBSortChange(Sender: TObject);
    procedure CBFormatChange(Sender: TObject);
    procedure PageSeriesChanging(Sender: TObject;
      var AllowChange: Boolean);
    procedure CBDepthClick(Sender: TObject);
    procedure EDepthChange(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure CBAllVisibleClick(Sender: TObject);
    procedure PaintBox1Paint(Sender: TObject);
    procedure PaintBox1Click(Sender: TObject);
    procedure CBSamplesDefaultClick(Sender: TObject);
    procedure ESamplesChange(Sender: TObject);
    procedure BApplyRandomClick(Sender: TObject);
    procedure EArrowDistChange(Sender: TObject);
    procedure BCalloutPointerClick(Sender: TObject);
    procedure CBHeadChange(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure ChartGrid1SetEditText(Sender: TObject; ACol, ARow: Integer;
      const Value: String);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
    TheChart        : TCustomAxisPanel;
    TheSeriesForms  : Array[1..4] of TForm;
    NumSeriesForms  : Integer;
    CreatingForm    : Boolean;
    ChangingPage    : Boolean;
    IMarksObject    : TFormTeeShape;
    LastSeries      : TChartSeries;
    Function AddToTab(AForm:TForm; ATab:TTabSheet; AObject:TObject):TForm;
    Function CanModifySeries:Boolean;
    Function CheckCanClose:Boolean;
    procedure CheckCBSamples;
    procedure DestroyDataSourceForm;
    procedure EnableMultiLine;
    procedure FillAxis(Items:TStrings; Horizontal:Boolean);
    procedure SetTabDataSource;
    procedure TeeEvent(Event: TTeeEvent);  { interface }
  protected
    procedure CreateDataSourceForm;
  public
    { Public declarations }
    TheSeries             : TChartSeries;
    IsDssGraph            : Boolean;
    ShowTabDataSource     : Boolean;
    ShowTabGeneral        : Boolean;
    ShowTabMarks          : Boolean;
    DataSourceStyle       : TBaseSourceEditor;
    TheListBox            : TChartListBox;

    procedure DestroySeriesForms;
    Procedure FillAxes;
    Function InsertSeriesForm( EditorClass:TFormClass;
                               Position:Integer;
                               Const EditorTabName:String;
                               AnObject:TPersistent):TForm;
    Procedure SetCBSeries;
  end;

  { Used by TeeChart Pro ActiveX and TeeChartOffice }
  TOnCreateEditSeries=Procedure(Sender:TFormTeeSeries; AChart:TCustomChart);
  TOnCreateEditSeriesObj=Procedure(Sender:TFormTeeSeries; AChart:TCustomChart) of object;

var InternalOnCreateEditSeries:TOnCreateEditSeries=nil;
    InternalOnCreateEditSeriesObj:TOnCreateEditSeriesObj=nil;

Function SeriesEditorForm(Series:TChartSeries):TFormClass;

implementation

{$IFNDEF CLX}
{$R *.DFM}
{$ELSE}
{$R *.xfm}
{$ENDIF}

Uses TeeConst, TeeGally, TeeBrushDlg, TeeFuncEdit,
     TeePoEdi,
     Series {<-because TPointSeries editor trick} ;

{ TFormTeeSeries}
procedure TFormTeeSeries.EPercentFormatChange(Sender: TObject);
begin
  TheSeries.PercentFormat:=LocalToDelphiFormat(EPercentFormat.Text);
end;

Procedure TFormTeeSeries.SetCBSeries;
begin
  if Assigned(TheSeries) then
  begin
    CBSeries.ItemIndex:=CBSeries.Items.IndexOfObject(TheSeries);
    CBSeriesChange(Self);
  end
  else PageSeries.Visible:=False;
end;

procedure TFormTeeSeries.EnableMultiLine;
begin
  CBMultiLine.Enabled:=TheSeries.Marks.Style in
    [smsLabelPercent,smsLabelValue,smsPercentTotal,smsLabelPercentTotal,smsXY];
end;

procedure TFormTeeSeries.FillAxis(Items:TStrings; Horizontal:Boolean);
var t : Integer;
begin
  With Items do While Count>3 do Delete(Count-1);
  With TheSeries.ParentChart do
  begin
    for t:=5 to Axes.Count-1 do
    if (Axes[t].Horizontal and Horizontal) or
       ((not Axes[t].Horizontal) and (not Horizontal)) then
         Items.AddObject(TeeMsg_CustomAxesEditor+' '+IntToStr(t-5),Axes[t]);
  end;
end;

procedure TFormTeeSeries.PageSeriesChange(Sender: TObject);

  procedure SetTabSeriesMarks;

    Function AllSeriesVisible:Boolean;
    var t : Integer;
    begin
      result:=True;
      With TheSeries.ParentChart do
      for t:=0 to SeriesCount-1 do
      if not Series[t].Marks.Visible then
      begin
        result:=False;
        exit;
      end;
    end;

  begin
    if not Assigned(IMarksObject) then
       IMarksObject:=InsertTeeObjectForm(PageControlMarks,nil);

    With TheSeries.Marks do
    begin
      RGMarkStyle.ItemIndex  :=Ord(Style);
      UDArrowsLength.Position:=Callout.Length;
      UDArrowDist.Position   :=Callout.Distance;
      UDMarksAngle.Position  :=Angle;
      CBMarkClip.Checked     :=Clip;
      UDEvery.Position       :=DrawEvery;
      CBMultiLine.Checked    :=MultiLine;
      CBMarksVisible.Checked :=Visible;
      BMarkLinCol.LinkPen(Callout.Arrow);
      CBHead.ItemIndex       :=Ord(Callout.ArrowHead);
      UDHeadSize.Position    :=Callout.ArrowHeadSize;
    end;
    CBAllVisible.Checked:=AllSeriesVisible;
    EnableMultiLine;
    IMarksObject.RefreshControls(TheSeries.Marks);
  end;

  procedure SetTabSeriesGeneral;
  var tmpSt : String;
      tmpCursor : TCursor;
  begin
    if Assigned(TheSeries) then
    With TheSeries do
    begin
      CBShowInLegend.Checked   :=ShowInLegend;
      CBDepth.Checked          :=Depth=-1;
      if Depth=-1 then UDDepth.Position:=0
                  else UDDepth.Position:=Depth;

      AddDefaultValueFormats(CBFormat.Items);

      tmpSt:=DelphiToLocalFormat(ValueFormat);
      With CBFormat.Items do if IndexOf(tmpSt)=-1 then Add(tmpSt);
      CBFormat.Text:=tmpSt;

      EPercentFormat.Text:=DelphiToLocalFormat(PercentFormat);

      FillAxes;

      With CBHorizAxis do
      Case TheSeries.HorizAxis of
        aTopAxis:       ItemIndex:=0;
        aBottomAxis:    ItemIndex:=1;
        aBothHorizAxis: ItemIndex:=2;
      else
        ItemIndex:=Items.IndexOfObject(TheSeries.CustomHorizAxis);
      end;

      With CBVertAxis do
      Case TheSeries.VertAxis of
        aLeftAxis:     ItemIndex:=0;
        aRightAxis:    ItemIndex:=1;
        aBothVertAxis: ItemIndex:=2;
      else
        ItemIndex:=Items.IndexOfObject(TheSeries.CustomVertAxis);
      end;

      CBXDateTime.Checked:=XValues.DateTime;
      CBYDateTime.Checked:=YValues.DateTime;

      Case MandatoryValueList.Order of
        loNone       : CBSort.ItemIndex:= 2;
        loAscending  : CBSort.ItemIndex:= 0;
        loDescending : CBSort.ItemIndex:= 1;
      end;

      ShowControls(ValuesList.Count<=2,[CBSort,LSort,LDepth,EDepth,UDDepth,CBDepth]);

      tmpCursor:=Cursor;
    end
    else tmpCursor:=crDefault;

    TeeFillCursors(CBCursor,tmpCursor);
  end;

begin
  With PageSeries do
  if ActivePage=TabGeneral then SetTabSeriesGeneral else
  if ActivePage=TabMarks then SetTabSeriesMarks     else
  if ActivePage=TabDataSource then SetTabDataSource;
  ChangingPage:=False;
end;

Procedure TFormTeeSeries.FillAxes;
begin
  FillAxis(CBHorizAxis.Items,True);
  FillAxis(CBVertAxis.Items,False);
end;

type
   TChartSeriesAccess=class(TChartSeries);

procedure TFormTeeSeries.SetTabDataSource;
var tmp : Integer;
    t   : Integer;
    tmpSource : TTeeSeriesSourceClass;
begin
  {$IFDEF CLX}
  if not Assigned(TheSeries) then exit;
  {$ENDIF}

  tmp:=CBDataSourceStyle.ItemIndex;

  if Assigned(TheSeries.FunctionType) then
     CBDataSourceStyle.ItemIndex:=2
  else
  if not Assigned(TheSeries.DataSource) then
  begin
    if (TheSeries.Count>0) and (not TChartSeriesAccess(TheSeries).ManualData) then
       CBDataSourceStyle.ItemIndex:=1
    else
       CBDataSourceStyle.ItemIndex:=0;
  end
  else
  if TheSeries.DataSource is TChartSeries then
     CBDataSourceStyle.ItemIndex:=2
  else

  begin
    tmpSource:=nil;
    for t:=0 to TeeSources.Count-1 do
    if TTeeSeriesSourceClass(TeeSources[t]).HasSeries(TheSeries) then
    begin
      tmpSource:=TTeeSeriesSourceClass(TeeSources[t]);
      break;
    end;

    With CBDataSourceStyle do
    if Assigned(tmpSource) then
       ItemIndex:=Items.IndexOfObject(TObject(tmpSource))
    else
       ItemIndex:=0;
  end;

  if CBDataSourceStyle.ItemIndex<>tmp then CreateDataSourceForm;
end;

Function TFormTeeSeries.AddToTab(AForm:TForm; ATab:TTabSheet; AObject:TObject):TForm;
begin
  result:=AForm;
  result.Align:=alClient;
  Inc(NumSeriesForms);
  TheSeriesForms[NumSeriesForms]:=result;
  result.Align:=alClient;
  TeeTranslateControl(result);
  AddFormTo(result,ATab,Integer(AObject));
end;

Function TFormTeeSeries.InsertSeriesForm( EditorClass:TFormClass;
                                          Position:Integer;
                                          Const EditorTabName:String;
                                          AnObject:TPersistent):TForm;
var tmpPage  : TTabSheet;
begin
  tmpPage:=TTabSheet.Create(Self);
  With tmpPage do
  begin
    PageControl:=PageSeries;
    PageIndex:=Position;
    Caption:=EditorTabName;
  end;
  result:=AddToTab(EditorClass.Create(Self),tmpPage,AnObject);
end;

type TTeePanelAccess=class(TCustomTeePanel);

procedure TFormTeeSeries.DestroySeriesForms;
var t       : Integer;
    tmpPage : TTabSheet;
begin
  for t:=1 to NumSeriesForms do
  if Assigned(TheSeriesForms[t]) then
  begin
    tmpPage:=(TheSeriesForms[t].Parent as TTabSheet);
    FreeAndNil(TheSeriesForms[t]);
    if tmpPage.PageIndex>0 then
       if not (csDestroying in tmpPage.PageControl.ComponentState) then
          tmpPage.Free;
  end;

  NumSeriesForms:=0;

  DestroyDataSourceForm;
end;

type TSeriesAccess=class(TCustomChartSeries);

Function SeriesEditorForm(Series:TChartSeries):TFormClass;
begin
  result:=TFormClass(GetClass(TSeriesAccess(Series).GetEditorClass));
end;

procedure TFormTeeSeries.CBSeriesChange(Sender: TObject);

  Procedure CreateTheSeriesForm;
  var tmpClass : TFormClass;
  begin
    tmpClass:=SeriesEditorForm(TheSeries);
    if Assigned(tmpClass) then
       AddToTab(tmpClass.Create(Self),TheTabSheet,TheSeries)
    else
    begin
      DestroySeriesForms;
      TheTabSheet.TabVisible:=False;
    end;
  end;

  Procedure HideSeriesPage;
  begin
    ImageSeries.Visible:=False;
    LabelSeriesClass.Caption:='';
    PageSeries.Visible:=False;
  end;

  Function FindTab(Const ATab:String):TTabSheet;
  var t : Integer;
  begin
    with PageSeries do
    begin
      result:=nil;
      for t:=0 to PageCount-1 do
      if Pages[t].Caption=ATab then
      begin
        result:=Pages[t];
        break;
      end;
    end;
  end;

  Procedure AddTeeSources;
  var t: Integer;
      tmpSource : TTeeSeriesSourceClass;
  begin
    { remove source styles from combobox }
    with CBDataSourceStyle.Items do
         while Count>3 do Delete(Count-1);

    { add sources that are available for this chart type }
    for t:=0 to TeeSources.Count-1 do { 5.02 }
    begin
      tmpSource:=TTeeSeriesSourceClass(TeeSources[t]);
      if CBDataSourceStyle.Items.IndexOfObject(TObject(tmpSource))=-1 then
      with tmpSource do
           if Available(TheSeries.ParentChart) then
              CBDataSourceStyle.Items.AddObject(Description,TObject(tmpSource));
    end;
  end;

var OldTab    : String;
    tmpBitmap : TBitmap;
begin
  CreatingForm:=True;

⌨️ 快捷键说明

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