📄 teedbcrosstab.pas
字号:
begin
tmpSeries.Add(tmpValue,tmpLabel,clTeeColor);
with Series.ParentChart do
for t:=0 to SeriesCount-1 do
if tmpSeries<>Series[t] then
if tmpSeries.Count>Series[t].Count then
for tt:=1 to (tmpSeries.Count-Series[t].Count) do
Series[t].Add(0,tmpLabel);
end
else
begin
With tmpSeries.MandatoryValueList do
case Formula of
gfCount,
gfSum: Value[tmpPoint]:=Value[tmpPoint]+tmpValue;
end;
end;
Next;
end;
finally
GotoBookMark(tmpBookMark);
FreeBookmark(tmpBookMark);
EnableControls;
TChartAccess(Series.ParentChart).BroadcastSeriesEvent(Series,seAdd);
end;
end;
end;
Procedure TDBChartCrossTabEditor.EnableCombos;
begin
EnableControls(DataSet<>nil,[CBAgg,CBValue,CBGroup,CBLabels]);
end;
procedure TDBChartCrossTabEditor.CBSourcesChange(Sender: TObject);
begin
inherited;
EnableCombos;
FillFields([CBValue,CBGroup,CBLabels]);
BApply.Enabled:=True;
end;
procedure TDBChartCrossTabEditor.FormShow(Sender: TObject);
begin
SkipValidation:=True;
inherited;
if not Assigned(TheSeries) then exit;
if TheSeries.DataSource is TDBCrossTabSource then
DataSource:=TDBCrossTabSource(TheSeries.DataSource)
else
begin
DataSource:=TDBCrossTabSource.Create(TheSeries.Owner);
DataSource.Name:=TeeGetUniqueName(DataSource.Owner,'DBCrossTabSource');
end;
With CBSources do
ItemIndex:=Items.IndexOfObject(DataSource.DataSet);
EnableCombos;
FillFields([CBValue,CBGroup,CBLabels]);
if DataSource.Formula=gfSum then CBAgg.ItemIndex:=0
else CBAgg.ItemIndex:=1;
With CBValue do ItemIndex:=Items.IndexOf(DataSource.ValueField);
With CBGroup do ItemIndex:=Items.IndexOf(DataSource.GroupField);
With CBLabels do ItemIndex:=Items.IndexOf(DataSource.LabelField);
CBActive.Checked:=DataSource.Active;
CBCase.Checked:=DataSource.CaseSensitive;
CBHide.Checked:=DataSource.HideSeries;
BApply.Enabled:=Assigned(TheSeries) and (DataSource<>TheSeries.DataSource);
end;
{ TDBCrossTabSource }
constructor TDBCrossTabSource.Create(AOwner: TComponent);
begin
inherited;
FFormula:=gfSum;
FCase:=True;
FHideSeries:=True;
end;
class function TDBCrossTabSource.Description: String;
begin
result:=TeeMsg_CrossTab;
end;
class function TDBCrossTabSource.Editor: TComponentClass;
begin
result:=TDBChartCrossTabEditor;
end;
class function TDBCrossTabSource.HasSeries(
ASeries: TChartSeries): Boolean;
begin
result:=(ASeries.DataSource is TDBCrossTabSource);
end;
procedure TDBChartCrossTabEditor.BApplyClick(Sender: TObject);
Function GetFieldCombo(Combo:TComboBox):String;
begin
With Combo do
if ItemIndex=-1 then result:=Text
else result:=Items[ItemIndex];
end;
begin
inherited;
CheckReplaceSource(DataSource);
TheSeries.Tag:=0;
with DataSource do
begin
Case CBAgg.ItemIndex of
0: Formula:=gfSum;
else
Formula:=gfCount;
end;
ValueField:=GetFieldCombo(CBValue);
GroupField:=GetFieldCombo(CBGroup);
LabelField:=GetFieldCombo(CBLabels);
DataSet:=Self.DataSet;
CaseSensitive:=CBCase.Checked;
HideSeries:=CBHide.Checked;
Active:=CBActive.Checked;
end;
BApply.Enabled:=False;
end;
procedure TDBCrossTabSource.Load;
begin
if Assigned(Series) and Assigned(DataSet) and
(ValueField<>'') and DataSet.Active then
LoadDataSet;
end;
procedure TDBChartCrossTabEditor.CBAggChange(Sender: TObject);
begin
inherited;
BApply.Enabled:=True;
end;
procedure TDBChartCrossTabEditor.FormDestroy(Sender: TObject);
begin
if Assigned(DataSource) and
(not Assigned(DataSource.Series)) then
DataSource.Free;
inherited;
end;
type
TDBChartDataSourceAccess=class(TDBChartDataSource);
procedure TDBCrossTabSource.SetDataSet(const Value: TDataSet);
begin
if FDataSet<>Value then
begin
Close;
FDataSet:=Value;
ISource.Free;
ISource:=TDBChartDataSource.Create(nil); { 5.02 }
// No "with" here due to CLR restriction...
if Assigned(FDataSet) then
begin
FDataSet.FreeNotification(Self); // 7.01
TDBChartDataSourceAccess(ISource).SetDataSet(FDataSet);
end;
TDBChartDataSourceAccess(ISource).OnCheckDataSet:=DataSourceCheckDataSet;
TDBChartDataSourceAccess(ISource).OnCloseDataSet:=DataSourceCloseDataSet;
end;
end;
Procedure TDBCrossTabSource.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited;
if (Operation=opRemove) and Assigned(FDataSet) and (AComponent=FDataSet) then // 7.01
DataSet:=nil;
end;
procedure TDBCrossTabSource.RemoveSeries;
var t : Integer;
begin
if Assigned(Series.ParentChart) then
begin
t:=0;
with Series.ParentChart do
while t<SeriesCount do
if (Series[t]<>Self.Series) and (TChartSeries(Series[t].Tag)=Self.Series) then
Series[t].Free
else
Inc(t);
end;
if not (csDestroying in Series.ComponentState) then
begin
Series.Clear;
Series.Title:='';
end;
end;
procedure TDBCrossTabSource.DataSourceCloseDataSet(ADataSet: TDataSet);
begin
if (not KeepDataOnClose) and Assigned(Series) then
RemoveSeries;
end;
procedure TDBCrossTabSource.SetActive(const Value:Boolean);
begin
inherited;
if not Active then DataSourceCloseDataSet(DataSet);
end;
procedure TDBCrossTabSource.DataSourceCheckDataSet(ADataSet: TDataSet);
begin
Refresh;
end;
class function TDBCrossTabSource.Available(AChart: TCustomAxisPanel):Boolean;
begin
result:=AChart is TCustomChart;
end;
procedure TDBCrossTabSource.SetFormula(const Value: TGroupFormula);
begin
if FFormula<>Value then
begin
Close;
FFormula:=Value;
end;
end;
procedure TDBCrossTabSource.SetGroup(const Value: String);
begin
if FGroup<>Value then
begin
Close;
FGroup:=Value;
end;
end;
procedure TDBCrossTabSource.SetLabel(const Value: String);
begin
if FLabel<>Value then
begin
Close;
FLabel:=Value;
end;
end;
procedure TDBCrossTabSource.SetValue(const Value: String);
begin
if FValue<>Value then
begin
Close;
FValue:=Value;
end;
end;
destructor TDBCrossTabSource.Destroy;
begin
ISource.Free;
inherited;
end;
procedure TDBChartCrossTabEditor.CBActiveClick(Sender: TObject);
begin
BApply.Enabled:=True;
end;
procedure TDBCrossTabSource.SetCase(const Value: Boolean);
begin
if FCase<>Value then
begin
Close;
FCase:=Value;
end;
end;
procedure TDBChartCrossTabEditor.CBCaseClick(Sender: TObject);
begin
BApply.Enabled:=True;
end;
procedure TDBChartCrossTabEditor.CBHideClick(Sender: TObject);
begin
BApply.Enabled:=True;
end;
initialization
RegisterClass(TDBCrossTabSource);
TeeSources.Add({$IFDEF CLR}TObject{$ENDIF}(TDBCrossTabSource));
finalization
TeeSources.Remove({$IFDEF CLR}TObject{$ENDIF}(TDBCrossTabSource));
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -