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