因为项目的关系,需要将数据以柱状图进行呈现,因为使用一般的ASP画图较为繁琐,找到了OWC,向它请教,但它只教给我VBScript的方法,至于delphi中ASP的写法,只有teach myself 了。万事不怕难。历程如下:
首先定义两个记录类型的数组,为图例和柱状的数据做准备
//定义记录型数组(记录标签,最多为两个)
type
TOWCLabelData =record
LabelCaption : string;
end;
//定义记录型数组(记录数据项目,最多为两个)
type
TOWCRecordData =record
XAxesName : string;
XAxesValue1 : string;
XAxesValue2 : string;
end;
OWCRecordData : array of TOWCRecordData;//SetLength(Data.OWCRecordData,intLength);
OWCLabelData : array of TOWCLabelData;//SetLength(Data.OWCRecordData,intLength);
以下为实际过程的实现
{
根据传递变体数组,显示的维数,是否显示图例参数生成变体返回值.
应可以生成X轴类别名称为多个,项目名称为一个,标签可以设置多个
FColumCount对应 X轴类别数量 ,图表默认有一个图例,如FColumCount大于1
则添加第二个图例
数据的填充使用两个记录类型的数组,使用时,将数据填充到数组中
数组说明
1.TOWCLabelData =record 定义记录型数组(记录标签,最多为两个)
LabelCaption : string;标签数据
2.TOWCRecordData =record 定义记录型数组(记录数据项目,最多为两个)
XAxesName : string; X轴项目名称
XAxesValue1 : string; X轴第一列数据
XAxesValue2 : string; X轴第二列数据
参数说明
FTitleCaption: 图表标题
FHasLegend:是否显示标签
FLabelCount:X轴显示每一个项目数据列数
}
function TDataModule1.BuildOWCVarientData(FTitleCaption : Variant;FHasLegend : boolean;FLabelCount : integer) : Variant;
var
ChartSpace1 : OleVariant;
cht : variant;
c : variant;
dl,categoryAxis : variant;
LegendData : Variant;//标签数据
XAxesName : Variant;//X轴项目名称
XAxesData : Variant;//X轴数据
intNum : integer;
begin // cht.Type = c.chChartTypePie '设置图表类型为饼图
try
ChartSpace1 :=CreateOleObject('OWC11.ChartSpace');
cht :=ChartSpace1.Charts.Add;
c :=ChartSpace1.Constants;
ChartSpace1.HasChartSpaceTitle := True;
ChartSpace1.ChartSpaceTitle.Caption :=FTitleCaption; //'设置图表工作区标题内容
ChartSpace1.ChartSpaceTitle.Font.Bold := True;
ChartSpace1.ChartSpaceTitle.Font.Color := 'blue'; //设置图表工作区标题的颜色
ChartSpace1.ChartSpaceTitle.Font.Italic := False; //设置图表工作区标题是否为斜体
ChartSpace1.ChartSpaceTitle.Font.Name := '隶书'; //设置图表工作区标题内容的字体
ChartSpace1.ChartSpaceTitle.Font.Size := 18; //设置图表工作区标题内容的大小(单位:磅)
ChartSpace1.ChartSpaceTitle.Font.Underline := c.owcUnderlineStyleSingle; //设置下划线属性
cht.Axes[0].MajorUnit := 10; //设置Y轴刻度递增值
if FHasLegend then
begin
LegendData :=varArrayCreate([0,9],varVariant);
for intNum :=Low(OWCLabelData) to High(OWCLabelData) do
begin
LegendData[intNum] :=OWCLabelData[intNum].LabelCaption;
end;
cht.HasLegend :=FHasLegend; //指定图表工作区中含有图例
cht.Legend.Font.Size := 9; //其他有关字体项的设置参见设置图表标题部分
cht.Legend.Position := c.chLegendPositionBottom ;//设置图例对其方式
cht.SetData(c.chDimSeriesNames, c.chDataLiteral,LegendData); //系列
end;
//创建Variant类型的数组
XAxesName :=varArrayCreate([0,9],varVariant);
XAxesData :=varArrayCreate([0,9],varVariant);
//填充数据
for intNum :=Low(OWCRecordData) to High(OWCRecordData) do
begin
XAxesName[intNum] :=OWCRecordData[intNum].XAxesName;
XAxesData[intNum] :=OWCRecordData[intNum].XAxesValue1;
end;
cht.SetData(c.chDimCategories, c.chDataLiteral, XAxesName);//横项(分类轴)X轴 名称
cht.SeriesCollection[0].SetData( c.chDimValues, c.chDataLiteral, XAxesData);//X轴 数据
dl := cht.SeriesCollection[0].DataLabelsCollection.Add; //添加图例的数据标记
if FLabelCount > 1 then
begin
for intNum :=Low(OWCRecordData) to High(OWCRecordData) do
begin
XAxesData[intNum] :=OWCRecordData[intNum].XAxesValue2;
end;
cht.SeriesCollection[1].SetData( c.chDimValues, c.chDataLiteral, XAxesData);
dl :=cht.SeriesCollection[1].DataLabelsCollection.Add;//添加图例的数据标记
end;
dl.HasValue := True;
dl.HasPercentage := False;
dl.Font.Size := 9;
dl.Font.Color := 'red';
dl.Position := c.chLegendPositionRight;
//设置纵向数值属性
categoryAxis := cht.Axes[c.chAxisPositionBottom];
categoryAxis.Font.Size := 9;
//设置分类组属性
categoryAxis := cht.Axes[c.chAxisPositionLeft];
categoryAxis.Font.Size := 9;
//cht.Type := c.chChartTypePie; //设置图表类型为饼图
//cht.Type := c.chChartTypeColumnClustered; //设置图表类型为簇状柱
//cht.Type := c.chChartTypeLineMarkers; //设置图表类型为折线图
//cht.Type :=c.chChartTypeBarClustered3D;
//cht.type :=c.chChartTypePie3D;
Result :=ChartSpace1.GetPicture('GIF',750,420);
finally
ChartSpace1.Clear;
end;
end;
需要说明的是,这段程序,比较有局限性,只能进行一个类型柱的显示。另外柱的个数也有所限制。但可以通过传递参数进行增减。同时OWC也可以直接连接数据源进行显示的,如Access等。但我没有进行实践。但通过以上的项目的实现,OWC在web图形显示方式上,有着比较实用的价值的,同时还可以显示折线和饼图。
但是对于三维效果的图象,不能用鼠标进行旋转,这应该是OWC以及我的一个遗憾吧。
22:47,又要工作了,今夜无眠