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

📄 rm_chart.pas

📁 这是一个功能强大
💻 PAS
📖 第 1 页 / 共 4 页
字号:
  if (FSeriesList.Count < 1) and (Memo.Count = 0) then
  begin
    RMWriteByte(aStream, 1);
    lStream := TMemoryStream.Create;
    lEMF := nil;
    try
      lEMF := FChart.TeeCreateMetafile(False, Rect(0, 0, spWidth, spHeight));
      lEMF.SaveToStream(lStream);

      lStream.Position := 0;
      RMWriteInt32(aStream, lStream.Size);
      aStream.CopyFrom(lStream, 0);
    finally
      lStream.Free;
      FreeAndNil(lEMF);
    end;
  end
  else
    RMWriteByte(aStream, 0);

  if UseChartSetting then
  begin
    RMWriteByte(aStream, 1);
    FChart.Name := '';
    for i := 0 to FChart.SeriesList.Count - 1 do
      FChart.SeriesList[i].Name := '';

    lSavePos := aStream.Position;
    RMWriteInt32(aStream, lSavePos);
    lSavePos1 := aStream.Position;
    aStream.WriteComponent(FChart);
    lPos := aStream.Position;
    aStream.Position := lSavePos;
    RMWriteInt32(aStream, lPos - lSavePos1);
    aStream.Position := lPos;
  end
  else
    RMWriteByte(aStream, 0);
end;

procedure TRMChartView.DefinePopupMenu(Popup: TRMCustomMenuItem);
begin
  inherited DefinePopupMenu(Popup);
end;

procedure TRMChartView.Prepare;
var
  i: Integer;
begin
  if not ParentReport.MasterReport.FinalPass then
    FSaveMemo := '';

  Memo.Clear;
  for i := 0 to FSeriesList.Count - 1 do
  begin
    Series[i].Init;
  end;
end;

procedure TRMChartView.OnHook(aView: TRMView);
var
  lSeries: TRMChartSeries;
  i: Integer;

  procedure _GetValue(const aObjName: string; aIndex: Integer);
  var
    lStr: string;
    lNewValue: string;
  begin
    if AnsiCompareText(aView.Name, aObjName) <> 0 then Exit;

    lNewValue := '';
    if THackView(aView).Memo1.Count > 0 then
    begin
      lStr := THackView(aView).Memo1[0];
      if lStr <> '' then
        lNewValue := lStr
      else
      begin
        if aIndex = 1 then
          lNewValue := '0;'
        else
          lNewValue := '';
      end
    end
    else
    begin
      if aIndex = 1 then
        lNewValue := '0'
      else
        lNewValue := '';
    end;

    if aIndex = 0 then
    begin
      SetLength(lSeries.FXValues, Length(lSeries.FXValues) + 1);
      lSeries.FXValues[Length(lSeries.FXValues) - 1] := lNewValue;
    end
    else if aIndex = 1 then
    begin
      SetLength(lSeries.FYValues, Length(lSeries.FYValues) + 1);
      if RMIsValidFloat(lNewValue) then
        lSeries.FYValues[Length(lSeries.FYValues) - 1] := RMStrToFloat(lNewValue)
      else
        lSeries.FYValues[Length(lSeries.FYValues) - 1] := 0;
    end;
  end;

begin
  for i := 0 to FSeriesList.Count - 1 do
  begin
    lSeries := Series[i];
    if lSeries.DataType = rmdtBandData then
    begin
      _GetValue(lSeries.XObject, 0);
      _GetValue(lSeries.YObject, 1);
    end;
  end;

  if UseDoublePass and
    (ParentReport.MasterReport.DoublePass and (not ParentReport.MasterReport.FinalPass)) then
  begin
    FSaveMemo := Memo.Text;
  end;
end;

procedure TRMChartView.ShowEditor;
var
  tmpForm: TRMChartForm;
  lStream: TMemoryStream;
  lSaveFlag: Boolean;
begin
  lStream := TMemoryStream.Create;
  tmpForm := TRMChartForm.Create(Application);
  lSaveFlag := UseChartSetting;
  try
    UseChartSetting := True;
    tmpForm.FReport := ParentReport;
    SaveToStream(lStream);
    lStream.Position := 0;
    tmpForm.FChartView.LoadFromStream(lStream);
    tmpForm.FChartView.UseChartSetting := lSaveFlag;

    UseChartSetting := lSaveFlag;
    if tmpForm.ShowModal = mrOK then
    begin
      RMDesigner.BeforeChange;
      lStream.Clear;

      UseChartSetting := True;
      tmpForm.FChartView.UseChartSetting := True;
      tmpForm.FChartView.SaveToStream(lStream);
      lStream.Position := 0;
      LoadFromStream(lStream);
      RMDesigner.AfterChange;
    end;
  finally
    UseChartSetting := lSaveFlag;
    lStream.Free;
    tmpForm.Free;
  end;
end;

function TRMChartView.GetUseChartSetting: Boolean;
begin
  Result := FFlags and flChartUseChartSetting = flChartUseChartSetting;
end;

procedure TRMChartView.SetUseChartSetting(Value: Boolean);
begin
  FFlags := FFlags and (not flChartUseChartSetting);
//{$IFDEF TeeChartPro}
  if Value then
    FFlags := FFlags + flChartUseChartSetting;
//{$ENDIF}
end;

function TRMChartView.GetDirectDraw: Boolean;
begin
  Result := (FFlags and flChartDirectDraw) = flChartDirectDraw;
end;

procedure TRMChartView.SetDirectDraw(Value: Boolean);
begin
  FFlags := (FFlags and not flChartDirectDraw);
  if Value then
    FFlags := FFlags + flChartDirectDraw;
end;

function TRMChartView.GetViewCommon: string;
begin
  Result := '[Chart]';
end;

procedure TRMChartView.ClearContents;
begin
  Clear;
  inherited;
end;

function TRMChartView.GetPropValue(aObject: TObject; aPropName: string;
  var aValue: Variant; Args: array of Variant): Boolean;
begin
  Result := True;
  if aPropName = 'CHART' then
  begin
    aValue := O2V(FChart);
  end
  else
    Result := inherited GetPropValue(aObject, aPropName, aValue, Args);
end;

{------------------------------------------------------------------------------}
{------------------------------------------------------------------------------}
{ TRMCustomTeeChartUI }

class procedure TRMCustomTeeChartUI.Edit(aTeeChart: TCustomChart);
begin
end;

{******************************************************************************
 *
 ** C H A R T   U I   P L U G I N
 *
{******************************************************************************}
{------------------------------------------------------------------------------}
{------------------------------------------------------------------------------}
{TRMTeeChartUIPlugIn}

class procedure TRMTeeChartUIPlugIn.Register(aChartUIClass: TRMCustomTeeChartUIClass);
begin
//  uChartUIPlugInLock.Acquire;
  try
    uChartUIClassList.Add(aChartUIClass);
  finally
//    uChartUIPlugInLock.Release;
  end;
end;

class procedure TRMTeeChartUIPlugIn.UnRegister(aChartUIClass: TRMCustomTeeChartUIClass);
begin
//  uChartUIPlugInLock.Acquire;
  try
    uChartUIClassList.Remove(aChartUIClass);
  finally
//    uChartUIPlugInLock.Release;
  end;
end;

class function TRMTeeChartUIPlugIn.GetChartUIClass: TRMCustomTeeChartUIClass;
begin
//  uChartUIPlugInLock.Acquire;
  try
    if uChartUIClassList.Count > 0 then
      Result := TRMCustomTeeChartUIClass(uChartUIClassList[0])
    else
      Result := nil;
  finally
//    uChartUIPlugInLock.Release;
  end;
end;

class procedure TRMTeeChartUIPlugIn.Edit(aTeeChart: TCustomChart);
var
  lChartUIClass: TRMCustomTeeChartUIClass;
begin
  lChartUIClass := GetChartUIClass;
  if (lChartUIClass <> nil) then
    lChartUIClass.Edit(aTeeChart);
end;

class function TRMTeeChartUIPlugIn.HaveChartEditor: Boolean;
begin
  Result := (GetChartUIClass <> nil);
end;

{------------------------------------------------------------------------------}
{------------------------------------------------------------------------------}
{ TRMChartForm }

procedure TRMChartForm.FormCreate(Sender: TObject);
var
  i, j: Integer;
  t: TRMView;
  liPage: TRMCustomPage;
begin
  FDataSetBMP := TBitmap.Create;
  FFieldBMP := TBitmap.Create;

  FDataSetBMP.LoadFromResourceName(hInstance, 'RM_FLD1');
  FFieldBMP.LoadFromResourceName(hInstance, 'RM_FLD2');

  Page1.ActivePage := TabSheet1;
  FBtnColor := TRMColorPickerButton.Create(Self);
  FBtnColor.Parent := gpbSeriesOptions;
  FBtnColor.ColorType := rmptFill;
  FBtnColor.Flat := False;
  FBtnColor.SetBounds(120, 30, 115, 25);
  FBtnColor.OnColorChange := OnColorChangeEvent;

  for i := 0 to RMDesigner.Report.Pages.Count - 1 do
  begin
    liPage := RMDesigner.Report.Pages[i];
    if liPage is TRMReportPage then
    begin
      for j := 0 to THackPage(liPage).Objects.Count - 1 do
      begin
        t := THackPage(liPage).Objects[j];
        if t is TRMCustomMemoView then
          cmbLegend.Items.Add(t.Name);
      end;
    end;
  end;

  cmbValue.Items.Assign(cmbLegend.Items);
  FChartView := TRMChartView(RMCreateObject(rmgtAddin, 'TRMChartView'));

  Panel1.BevelOuter := bvNone;
  FInspector := TELPropertyInspector.Create(Self);
  with FInspector do
  begin
    Parent := Panel1;
    Align := alClient;
    OnAfterModify := OnAfterModifyEvent;
  end;

  Localize;
end;

procedure TRMChartForm.FormDestroy(Sender: TObject);
begin
  FChartView.Free;

  FDataSetBMP.Free;
  FFieldBMP.Free;
end;

procedure TRMChartForm.Localize;
var
  i: Integer;
begin
  Font.Name := RMLoadStr(SRMDefaultFontName);
  Font.Size := StrToInt(RMLoadStr(SRMDefaultFontSize));
  Font.Charset := StrToInt(RMLoadStr(SCharset));

  RMSetStrProp(Self, 'Caption', rmRes + 590);
//  RMSetStrProp(Tab1, 'Caption', rmRes + 591);
//  RMSetStrProp(Tab2, 'Caption', rmRes + 592);
  RMSetStrProp(Tab3, 'Caption', rmRes + 604);
  RMSetStrProp(TabSheet1, 'Caption', rmRes + 592 {7});
  RMSetStrProp(gpbObjects, 'Caption', rmRes + 594);
  RMSetStrProp(gpbMarks, 'Caption', rmRes + 605);
  RMSetStrProp(gpbTopGroup, 'Caption', rmRes + 611);
  RMSetStrProp(gpbChartOptions, 'Caption', rmRes + 595);
  RMSetStrProp(gpbSeriesType, 'Caption', rmRes + 593);
  RMSetStrProp(gpbSeriesOptions, 'Caption', rmRes + 642);

  RMSetStrProp(chkChartDim3D, 'Caption', rmRes + 596);
  RMSetStrProp(chkChartShowLegend, 'Caption', rmRes + 598);
  RMSetStrProp(chkChartShowAxis, 'Caption', rmRes + 599);

  RMSetStrProp(chkSeriesShowMarks, 'Caption', rmRes + 600);
  RMSetStrProp(chkSeriesMultiColor, 'Caption', rmRes + 601);

  RMSetStrProp(rdbStyle1, 'Caption', rmRes + 606);
  RMSetStrProp(rdbStyle2, 'Caption', rmRes + 607);
  RMSetStrProp(rdbStyle3, 'Caption', rmRes + 608);
  RMSetStrProp(rdbStyle4, 'Caption', rmRes + 609);
  RMSetStrProp(rdbStyle5, 'Caption', rmRes + 610);

  RMSetStrProp(Label1, 'Caption', rmRes + 602);
  RMSetStrProp(Label2, 'Caption', rmRes + 603);
  RMSetStrProp(Label3, 'Caption', rmRes + 612);
  RMSetStrProp(Label4, 'Caption', rmRes + 613);
  RMSetStrProp(Label5, 'Caption', rmRes + 614);

//  RMSetStrProp(Add1, 'Caption', rmRes + 616);
//  RMSetStrProp(Delete1, 'Caption', rmRes + 617);
//  RMSetStrProp(EditTitle1, 'Caption', rmRes + 618);
//  RMSetStrProp(MoveUp1, 'Caption', rmRes + 619);
//  RMSetStrProp(MoveDown1, 'Caption', rmRes + 620);

  cmbSeriesType.Items.Clear;
  cmbSeriesType.Items.Add(RMLoadStr(rmRes + 624));
  cmbSeriesType.Items.Add(RMLoadStr(rmRes + 625));
  cmbSeriesType.Items.Add(RMLoadStr(rmRes + 626));
  cmbSeriesType.Items.Add(RMLoadStr(rmRes + 627));
  cmbSeriesType.Items.Add(RMLoadStr(rmRes + 628));
  cmbSeriesType.Items.Add(RMLoadStr(rmRes + 629));
  cmbSeriesType.Items.Add(RMLoadStr(rmRes + 643));
  cmbSeriesType.Items.Add(RMLoadStr(rmRes + 644));

  RMSetStrProp(GroupBox2, 'Caption', rmRes + 594);
  RMSetStrProp(Label7, 'Caption', rmRes + 602);
  RMSetStrProp(Label8, 'Caption', rmRes + 603);
  RMSetStrProp(Label10, 'Caption', rmRes + 621);

  RMSetStrProp(rdbDataSource, 'Caption', rmRes + 631);
  rdbDataSource.Items.Clear;
  rdbDataSource.Items.Add(RMLoadStr(rmRes + 632));
  rdbDataSource.Items.Add(RMLoadStr(rmRes + 633));
  rdbDataSource.Items.Add(RMLoadStr(rmRes + 634));
  RMSetStrProp(rdbSortType, 'Caption', rmRes + 635);
  rdbSortType.Items.Clear;
  rdbSortType.Items.Add(RMLoadStr(rmRes + 636));
  rdbSortType.Items.Add(RMLoadStr(rmRes + 637));
  rdbSortType.Items.Add(RMLoadStr(rmRes + 638));
  RMSetStrProp(GroupBox1, 'Caption', rmRes + 639);

  RMSetStrProp(lblXValue, 'Caption', rmRes + 640);
  RMSetStrProp(lblYValue, 'Caption', rmRes + 641);

  RMSetStrProp(btnCharUI, 'Caption', rmRes + 623);
  btnOk.Caption := RMLoadStr(SOk);
  btnCancel.Caption := RMLoadStr(SCancel);

  for i := 0 to cmbSeriesType.Items.Count - 1 do
    PopupSeries.Items[i].Caption := cmbSeriesType.Items[i];
end;

procedure TRMChartForm.LoadSeriesOptions;

  procedure _SetRButton(b: array of TRadioButton; n: Integer);
  begin
    if (n >= Low(b)) and (n <= High(b)) then
      b[n].Checked := True;
  end;

begin
  FInspector.Clear;
  if (TreeView1.Selected = TreeView1.Items[0]) or (not FChartView.UseChartSetting) then
    FInspector.Add(FChartView.Chart)
  else
    FInspector.Add(FChartView.Chart.Series[TreeView1.Selected.AbsoluteIndex - 1]);

  RMSetControlsEnabled(gpbSeriesType, FSeries <> nil);
  RMSetControlsEnabled(gpbSeriesOptions, FSeries <> nil);
  RMSetControlsEnabled(gpbObjects, FSeries <> nil);
  RMSetControlsEnabled(gpbTopGroup, FSeries <> nil);
  RMSetControlsEnabled(gpbSeriesType, FSeries <> nil);
  RMSetControlsEnabled(rdbDataSource, FSeries <> nil);
  RMSetControlsEnabled(rdbSortType, FSeries <> nil);
  RMSetControlsEnabled(gpbMarks, FSeries <> nil);
  rdbDataSourceClick(nil);

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

  if FSeries = nil then
  begin
    rdbDataSourceClick(nil);
    Exit;
  end;

  cmbSeriesType.ItemIndex := FSeries.ChartType;
  _SetRButton([rdbStyle1, rdbStyle2, rdbStyle3, rdbStyle4, rdbStyle5], FSeries.MarksStyle);
  chkSeriesShowMarks.Checked := FSeries.ShowMarks;
  chkSeriesMultiColor.Checked := FSeries.Colored;
  editTop10Num.Text := IntToStr(FSeries.Top10Num);
  edtTop10Label.Text := FSeries.Top10Label;
  FBtnColor.CurrentColor := FSeries.Color;
  FBtnColor.Enabled := not chkSeriesMultiColor.Checked;
  rdbDataSource.ItemIndex := Byte(FSeries.DataType);
  rdbSortType.ItemIndex := Byte(FSeries.SortOrder);
  rdbDataSourceClick(nil);

  cmbLegend.Text := '';
  cmbValue.Text := '';
  cmbDataSet.Text := '';
  ComboBox1.Text := '';
  ComboBox2.Text := '';
  edtXValues.Text := '';
  edtYValues.Text := '';
  case FSeries.DataType of
    rmdtBandData:
      begin
        cmbLegend.Text := FSeries.XObject;
        cmbValue.Text := FSeries.YObject;
      end;
    rmdtDBData:
      begin
        cmbDataSet.ItemIndex := cmbDataSet.Items.IndexOf(FSeries.DataSet);
        cmbDataSetChange(nil);
        ComboBox2.ItemIndex := ComboBox2.Items.IndexOf(FSeries.YObject);
        ComboBox1.ItemIndex := ComboBox1.Items.IndexOf(FSeries.XObject);
      end;
    rmdtFixedData:
      begin
        edtXValues.Text := FSeries.FXObject;
        edtYValues.Text := FSeries.FYObject;
      end;
  end;
end;

⌨️ 快捷键说明

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