📄 rm_chart.pas
字号:
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 + -