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 + -
显示快捷键?