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

📄 rm_chart.pas

📁 这是一个功能强大
💻 PAS
📖 第 1 页 / 共 4 页
字号:

procedure TRMChartForm.SaveSeriesOptions;

  function _GetRButton(b: array of TRadioButton): Integer;
  var
    i: Integer;
  begin
    Result := 0;
    for i := 0 to High(b) do
    begin
      if b[i].Checked then
        Result := i;
    end;
  end;

begin
  FChartView.ChartShowLegend := chkChartShowLegend.Checked;
  FChartView.ChartShowAxis := chkChartShowAxis.Checked;
  FChartView.ChartDim3D := chkChartDim3D.Checked;

  if FSeries = nil then Exit;

  if cmbSeriesType.ItemIndex >= 0 then
    FSeries.ChartType := cmbSeriesType.ItemIndex;
  FSeries.MarksStyle := _GetRButton([rdbStyle1, rdbStyle2, rdbStyle3, rdbStyle4, rdbStyle5]);
  FSeries.ShowMarks := chkSeriesShowMarks.Checked;
  FSeries.Colored := chkSeriesMultiColor.Checked;

  FSeries.Top10Num := StrToInt(editTop10Num.Text);
  FSeries.Top10Label := edtTop10Label.Text;
  FSeries.Color := FBtnColor.CurrentColor;
  FSeries.DataType := TRMChartSeriesDataType(rdbDataSource.ItemIndex);
  FSeries.SortOrder := TRMChartSeriesSortOrder(rdbSortType.ItemIndex);
  case FSeries.DataType of
    rmdtBandData:
      begin
        FSeries.XObject := cmbLegend.Text;
        FSeries.YObject := cmbValue.Text;
      end;
    rmdtDBData:
      begin
        FSeries.DataSet := cmbDataSet.Text;
        FSeries.YObject := ComboBox2.Text;
        FSeries.XObject := ComboBox1.Text;
      end;
    rmdtFixedData:
      begin
        FSeries.XObject := edtXValues.Text;
        FSeries.YObject := edtYValues.Text;
      end;
  end;
end;

procedure TRMChartForm.Add1Click(Sender: TObject);
var
  lPoint: TPoint;
begin
  lPoint := btnAddSeries.ClientToScreen(Point(0, btnAddSeries.Height));
  PopupSeries.Popup(lPoint.X, lPoint.Y);
end;

procedure TRMChartForm.Delete1Click(Sender: TObject);
var
  lIndex: Integer;
  lSeries: TChartSeries;
begin
  if (TreeView1.Selected = nil) or (TreeView1.Selected.AbsoluteIndex < 1) then Exit;

  FOldSelected := TreeView1.Selected.GetPrev;
  lIndex := TreeView1.Selected.AbsoluteIndex - 1;
  FChartView.DeleteSeries(lIndex);
  TreeView1.Items.Delete(TreeView1.Selected);
  TreeView1.Selected := FOldSelected;

  lSeries := FChartView.Chart.Series[lIndex];
  FChartView.Chart.SeriesList.Delete(lIndex);
  lSeries.Free;

  lIndex := TreeView1.Selected.AbsoluteIndex - 1;
  if lIndex >= 0 then
    FSeries := FChartView.Series[lIndex]
  else
    FSeries := nil;

  LoadSeriesOptions;
  FOldSelected := TreeView1.Selected;
end;

procedure TRMChartForm.FormShow(Sender: TObject);

  procedure _GetDatasets;
  begin
    cmbDataSet.Items.BeginUpdate;
    FReport.Dictionary.GetDataSets(cmbDataSet.Items);
    cmbDataSet.Items.Insert(0, RMLoadStr(SNotAssigned));
    cmbDataSet.Items.EndUpdate;
  end;

begin
  _GetDataSets;

  FInspector.Enabled := FChartView.UseChartSetting;
  btnCharUI.Visible := FChartView.UseChartSetting and TRMTeeChartUIPlugIn.HaveChartEditor;
  //Tab3.TabVisible := not Button1.Visible;

  SetTreeView;
  FOldSelected := TreeView1.Selected;
end;

procedure TRMChartForm.MoveUp1Click(Sender: TObject);
var
  lIndex: Integer;
begin
  if TreeView1.Selected = nil then Exit;

  lIndex := TreeView1.Selected.AbsoluteIndex - 1;
  if (lIndex > 0) then
  begin
    TreeView1.Selected.MoveTo(TreeView1.Selected.GetPrev, naInsert);
    FChartView.Chart.SeriesList.Exchange(lIndex, lIndex - 1);
    FChartView.FSeriesList.Exchange(lIndex, lIndex - 1);
  end;
end;

procedure TRMChartForm.MoveDown1Click(Sender: TObject);
var
  lIndex: Integer;
begin
  if TreeView1.Selected = nil then Exit;

  lIndex := TreeView1.Selected.AbsoluteIndex - 1;
  if (lIndex >= 0) and (lIndex < TreeView1.Items.Count - 2) then
  begin
    TreeView1.Selected.GetNext.MoveTo(TreeView1.Selected, naInsert);
    FChartView.Chart.SeriesList.Exchange(lIndex, lIndex + 1);
    FChartView.FSeriesList.Exchange(lIndex, lIndex + 1);
  end;
end;

procedure TRMChartForm.btnOkClick(Sender: TObject);
begin
  SaveSeriesOptions;
end;

procedure TRMChartForm.btnCharUIClick(Sender: TObject);
var
  i, lCount: Integer;
  lRMSeries: TRMChartSeries;
begin
  SaveSeriesOptions;

  FChartView.Chart.View3D := FChartView.ChartDim3D;
  FChartView.Chart.Legend.Visible := FChartView.ChartShowLegend;
  FChartView.Chart.AxisVisible := FChartView.ChartShowAxis;

  TRMTeeChartUIPlugIn.Edit(FChartView.Chart);

  FChartView.ChartDim3D := FChartView.Chart.View3D;
  FChartView.ChartShowLegend := FChartView.Chart.Legend.Visible;
  FChartView.ChartShowAxis := FChartView.Chart.AxisVisible;

  lCount := FChartView.SeriesCount - FChartView.Chart.SeriesCount - 1;
  for i := 0 to lCount do
  begin
    FChartView.DeleteSeries(FChartView.SeriesCount - 1);
  end;

  lCount := FChartView.Chart.SeriesCount - FChartView.SeriesCount - 1;
  for i := 0 to lCount do
  begin
    lRMSeries := FChartView.AddSeries;
    lRMSeries.Title := FChartView.FChart.Series[i].Title;
    lRMSeries.Colored := FChartView.FChart.Series[i].ColorEachPoint;
    lRMSeries.ShowMarks := FChartView.FChart.Series[i].Marks.Visible;
    lRMSeries.MarksStyle := Integer(FChartView.FChart.Series[i].Marks.Style);
  end;

  SetTreeView;
end;

procedure TRMChartForm.cmbSeriesTypeDrawItem(Control: TWinControl;
  Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
  lStr: string;
  lBitmap: TBitmap;
begin
  lStr := cmbSeriesType.Items[Index];
  lBitmap := TBitmap.Create;
  try
    ImageList2.GetBitmap(Index + 1, lBitmap);
    cmbSeriesType.Canvas.FillRect(Rect);
    cmbSeriesType.Canvas.BrushCopy(
      Bounds(Rect.Left + 4, Rect.Top, lBitmap.Width, lBitmap.Height),
      lBitmap,
      Bounds(0, 0, lBitmap.Width, lBitmap.Height),
      lBitmap.TransparentColor);

    cmbSeriesType.Canvas.TextOut(Rect.Left + 10 + lBitmap.Width,
      Rect.Top + (Rect.Bottom - Rect.Top - cmbSeriesType.Canvas.TextHeight(lStr)) div 2,
      lStr);
  finally
    lBitmap.Free;
  end;
end;

procedure TRMChartForm.rdbDataSourceClick(Sender: TObject);
begin
  RMSetControlsEnabled(gpbObjects, (FSeries <> nil) and (rdbDataSource.ItemIndex = 0));
  RMSetControlsEnabled(GroupBox1, (FSeries <> nil) and (rdbDataSource.ItemIndex = 2));
  RMSetControlsEnabled(GroupBox2, (FSeries <> nil) and (rdbDataSource.ItemIndex = 1));
end;

procedure TRMChartForm.cmbDataSetChange(Sender: TObject);
begin
  if cmbDataSet.ItemIndex < 1 then
  begin
    ComboBox2.Items.Clear;
    ComboBox1.Items.Clear;
  end
  else
  begin
    FReport.Dictionary.GetDataSetFields(cmbDataSet.Items[cmbDataSet.ItemIndex], ComboBox2.Items);
    ComboBox1.Items.Assign(ComboBox2.Items);
  end;
end;

procedure TRMChartForm.cmbDataSetDrawItem(Control: TWinControl;
  Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
  s: string;
  lBmp: TBitmap;
begin
  with TComboBox(Control) do
  begin
    s := Items[Index];
    if Control = cmbDataSet then
      lBmp := FDataSetBMP
    else
      lBmp := FFieldBMP;

    Canvas.FillRect(Rect);
    Canvas.BrushCopy(
      Bounds(Rect.Left + 2, Rect.Top, lBmp.Width, lBmp.Height),
      lBmp,
      Bounds(0, 0, lBmp.Width, lBmp.Height),
      lBmp.TransparentColor);
    Canvas.TextOut(Rect.Left + 4 + lBmp.Width, Rect.Top, s);
  end;
end;

procedure TRMChartForm.SetSeriesType(aNode: TTreeNode; aChartType: Integer);
var
  lSeries: TChartSeries;
  lIndex: Integer;
begin
  lIndex := aNode.AbsoluteIndex - 1;
  if FChartView.Chart.SeriesCount <= lIndex then
  begin
    lSeries := ChartTypes[aChartType].Create(FChartView.Chart);
    FChartView.Chart.AddSeries(lSeries);
  end
  else if FSeries <> nil then
  begin
    lSeries := ChartTypes[aChartType].Create(FChartView.Chart);
    FChartView.Chart.AddSeries(lSeries);
    lSeries.Title := FChartView.Chart.Series[lIndex].Title;
    FChartView.Chart.SeriesList.Exchange(lIndex, FChartView.Chart.SeriesCount - 1);

    aNode.ImageIndex := aChartType + 1;
    aNode.SelectedIndex := aNode.ImageIndex;

    lSeries := FChartView.Chart.Series[FChartView.Chart.SeriesCount - 1];
    FChartView.Chart.SeriesList.Delete(FChartView.Chart.SeriesCount - 1);
    lSeries.Free;
  end;
end;

procedure TRMChartForm.TreeView1Click(Sender: TObject);
var
  lIndex: Integer;
begin
  if (TreeView1.Selected = nil) or (TreeView1.Selected = FOldSelected) then Exit;

  FOldSelected := TreeView1.Selected;
  SaveSeriesOptions;
  lIndex := TreeView1.Selected.AbsoluteIndex - 1;
  if lIndex >= 0 then
    FSeries := FChartView.Series[lIndex]
  else
    FSeries := nil;

  LoadSeriesOptions;
end;

procedure TRMChartForm.mnuLineClick(Sender: TObject);
var
  lNode: TTreeNode;
begin
  SaveSeriesOptions;

  FSeries := FChartView.AddSeries;
  FSeries.ChartType := TMenuItem(Sender).Tag;

  TreeView1.SetFocus;
  lNode := TreeView1.Items.AddChild(TreeView1.Items[0], FSeries.Title);
  lNode.ImageIndex := FSeries.ChartType + 1;
  lNode.SelectedIndex := lNode.ImageIndex;
  TreeView1.Selected := lNode;
  SetSeriesType(lNode, FSeries.ChartType);
  FChartView.FChart.Series[FChartView.FChart.SeriesCount - 1].Title := FSeries.Title;
  FOldSelected := TreeView1.Selected;

  //ListBox1.ItemIndex := ListBox1.Items.Count - 1;
  LoadSeriesOptions;
end;

procedure TRMChartForm.cmbSeriesTypeClick(Sender: TObject);
begin
  if cmbSeriesType.ItemIndex >= 0 then
  begin
    FSeries.ChartType := cmbSeriesType.ItemIndex;
    SetSeriesType(TreeView1.Selected, FSeries.ChartType);
    FInspector.Clear;
    if TreeView1.Selected = TreeView1.Items[0] then
      FInspector.Add(FChartView.Chart)
    else
      FInspector.Add(FChartView.Chart.Series[TreeView1.Selected.AbsoluteIndex - 1]);
  end;
end;

procedure TRMChartForm.OnColorChangeEvent(Sender: TObject);
begin
  SetInspControls;
end;

procedure TRMChartForm.chkChartShowAxisClick(Sender: TObject);
begin
  SetInspControls;
end;

procedure TRMChartForm.SetInspControls;
begin
  FBtnColor.Enabled := not chkSeriesMultiColor.Checked;
  if not FInspector.Enabled then Exit;

  if FInspector.Objects[0] = FChartView.Chart then
  begin
    FChartView.Chart.AxisVisible := chkChartShowAxis.Checked;
    FChartView.Chart.Legend.Visible := chkChartShowLegend.Checked;
    FChartView.Chart.View3D := chkChartDim3D.Checked;
  end
  else
  begin
    TChartSeries(FInspector.Objects[0]).ColorEachPoint := chkSeriesMultiColor.Checked;
    TChartSeries(FInspector.Objects[0]).ColorEachPoint := chkSeriesMultiColor.Checked;
    TChartSeries(FInspector.Objects[0]).Marks.Visible := chkSeriesShowMarks.Checked;
    if rdbStyle1.Checked then
      TChartSeries(FInspector.Objects[0]).Marks.Style := TSeriesMarksStyle(0)
    else if rdbStyle2.Checked then
      TChartSeries(FInspector.Objects[0]).Marks.Style := TSeriesMarksStyle(1)
    else if rdbStyle3.Checked then
      TChartSeries(FInspector.Objects[0]).Marks.Style := TSeriesMarksStyle(2)
    else if rdbStyle4.Checked then
      TChartSeries(FInspector.Objects[0]).Marks.Style := TSeriesMarksStyle(3)
    else if rdbStyle5.Checked then
      TChartSeries(FInspector.Objects[0]).Marks.Style := TSeriesMarksStyle(4);
  end;

  FInspector.UpdateItems;
end;

procedure TRMChartForm.OnAfterModifyEvent(Sender: TObject; const aPropName, aPropValue: string);
begin
  if not FInspector.Enabled then Exit;

  if FInspector.Objects[0] = FChartView.Chart then
  begin
    chkChartShowAxis.Checked := FChartView.Chart.AxisVisible;
    chkChartShowLegend.Checked := FChartView.Chart.Legend.Visible;
    chkChartDim3D.Checked := FChartView.Chart.View3D;
  end
  else
  begin
    TreeView1.Selected.Text := TChartSeries(FInspector.Objects[0]).Title;
    chkSeriesMultiColor.Checked := TChartSeries(FInspector.Objects[0]).ColorEachPoint;
    chkSeriesShowMarks.Checked := TChartSeries(FInspector.Objects[0]).Marks.Visible;
    case Integer(TChartSeries(FInspector.Objects[0]).Marks.Style) of
      0: rdbStyle1.Checked := True;
      1: rdbStyle2.Checked := True;
      2: rdbStyle3.Checked := True;
      3: rdbStyle4.Checked := True;
      4: rdbStyle5.Checked := True;
    end;
  end;
end;

procedure TRMChartForm.SetTreeView;
var
  i: Integer;
  lNode: TTreeNode;
begin
  TreeView1.Items[0].DeleteChildren;
  for i := 0 to FChartView.SeriesCount - 1 do
  begin
    lNode := TreeView1.Items.AddChild(TreeView1.Items[0], FChartView.Series[i].Title);
    lNode.ImageIndex := FChartView.Series[i].ChartType + 1;
    lNode.SelectedIndex := lNode.ImageIndex;
    SetSeriesType(lNode, FChartView.Series[i].ChartType);
    FChartView.FChart.Series[i].Title := FChartView.Series[i].Title;
  end;

  TreeView1.Items[0].Expand(True);
  TreeView1.Selected := TreeView1.Items[0];
  LoadSeriesOptions;
end;

procedure TRMChartForm.TreeView1Editing(Sender: TObject; Node: TTreeNode;
  var AllowEdit: Boolean);
begin
  AllowEdit := not (TreeView1.Selected = TreeView1.Items[0]);
end;

procedure TRMChartForm.TreeView1Edited(Sender: TObject; Node: TTreeNode;
  var S: String);
begin
  if FSeries = nil then Exit;

  if Node <> TreeView1.Items[0] then
  begin
    FSeries.Title := S;
    FChartView.FChart[Node.AbsoluteIndex - 1].Title := S;
    SetInspControls;
  end;
end;



{------------------------------------------------------------------------------}
{------------------------------------------------------------------------------}

procedure TRMChartView_AssignChart(var Value: Variant; Args: TJvInterpreterArgs);
begin
  TRMChartView(Args.Obj).AssignChart(TChart(V2O(Args.Values[0])));
end;

procedure TRMChartView_Read_Count(var Value: Variant; Args: TJvInterpreterArgs);
begin
  Value := TRMChartView(Args.Obj).SeriesCount;
end;

procedure TRMChartView_Read_Items(var Value: Variant; Args: TJvInterpreterArgs);
begin
  Value := O2V(TRMChartView(Args.Obj).Series[Args.Values[0]]);
end;

procedure TRMChartView_Write_Items(const Value: Variant; Args: TJvInterpreterArgs);
begin
//  TList(Args.Obj).Items[Args.Values[0]] := V2P(Value);
end;

procedure RM_RegisterRAI2Adapter(RAI2Adapter: TJvInterpreterAdapter);
begin
  with RAI2Adapter do
  begin
    AddClass('ReportMachine', TChart, 'TChart');
    AddClass('ReportMachine', TRMChartView, 'TRMChartView');
    AddCLass('ReportMachine', TRMChartSeries, 'TRMChartSeries');

    AddGet(TRMChartView, 'AssignChart', TRMChartView_AssignChart, 1, [0], varEmpty);

    AddGet(TRMChartView, 'Count', TRMChartView_Read_Count, 0, [0], varEmpty);
    AddGet(TRMChartView, 'SeriesCount', TRMChartView_Read_Count, 0, [0], varEmpty);
    AddIGet(TRMChartView, 'Series', TRMChartView_Read_Items, 1, [0], varEmpty);
    AddIDGet(TRMChartView, TRMChartView_Read_Items, 1, [0], varEmpty);
    AddISet(TRMChartView, 'Series', TRMChartView_Write_Items, 1, [1]);
    AddIDSet(TRMChartView, TRMChartView_Write_Items, 1, [1]);
  end;
end;

initialization
  uChartUIClassList := TList.Create;
  RMRegisterObjectByRes(TRMChartView, 'RM_CHAROBJECT', RMLoadStr(SInsChart), TRMChartForm);

  RMInterpreter_Chart.RegisterJvInterpreterAdapter(GlobalJvInterpreterAdapter);
  RM_RegisterRAI2Adapter(GlobalJvInterpreterAdapter);

finalization
  uChartUIClassList.Free;
  uChartUIClassList := nil;
{$ENDIF}
end.

⌨️ 快捷键说明

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