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

📄 teedbcrosstab.pas

📁 TeeChart 7.0 With Source在Delphi 7.0中的安装
💻 PAS
📖 第 1 页 / 共 2 页
字号:
        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 + -