Office Web Objects(OWC11)を使用して、グラフを表示させるForm applicationを作成して
います。
Seriesにデータを設定する際に、chDataLiteralでタブ区切り文字列により設定するとうま
くいくのですが、ChartSpace.DataSourceにADOレコードセットを設定し、chDataBoundでフ
ィールド名(カラム名)やフィールド番号(カラム番号)を入れて設定した場合、EOleException
クラスの例外が発生し、'パラメータが間違っています'と指摘され、うまくグラフを作れ
ません。
下記のコードの OleChartSpace.DataSource:=Rs; で、DataSourceがレコードセットを参照
できていないのが原因ではないかと考えています。
下手なコードをお見せして恥ずかしいのですが、どなたか解決方法をご教示していただき
たくお願いいたします。。
参考にしたのは、以下の記事です。
http://www.4guysfromrolla.com/webtech/022101-1.shtml
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?lngWId=4&txtCodeId=6429
http://japan.internet.com/developer/20051213/26.html
環境は、WindowsXp Pro SP2 + Delphi6Proです。
また、ChartSpace自体をdelphi上で表示・操作する方法があればとも思います。アドバイ
スをお願いします。
****************************************************************
usesに,JPEG,ComObjを追加して、
const
adOpenStatic=3;
adLockReadOnly=1;
adUseClient = 3;
adCmdText=1;
chChartTypeLineMarkers = $00000007;
chDataBound = $00000000;
chDataLiteral = $FFFFFFFF;
chDimCategories = $00000001;
chDimValues = $00000002;
procedure TForm1.Button1Click(Sender: TObject);
var
Cn:OleVariant;
Rs:OleVariant;
StrSQL:string;
i:integer;
StrDate,StrValue:string;
OleChartSpace:OleVariant;
JPG: TJpegImage;
begin
try
//ADOでRecordSetの取得
Cn:=CreateOleObject('ADODB.Connection');
Cn.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=StockDB.mdb';
Cn.Open;
Rs:=CreateOleObject('ADODB.Recordset');
Rs.CursorLocation:=adUseClient;
StrSQL:='select 日付,始値 from CompanyID';
Rs.Open(StrSQL,Cn,adOpenStatic,adLockReadOnly,adCmdText);
if Rs.Eof=true then exit;
Rs.MoveFirst;
i:=0;
//各フィールドのtab区切りの文字列の作成
StrDate:='';
StrValue:='';
while Rs.Eof=false do
begin
if i<>0 then
begin
StrDate:=StrDate + #9;
StrValue:=StrValue + #9;
end;
StrDate:=StrDate + vartostr(Rs.Fields['日付'].value);
StrValue:=StrValue + vartostr(Rs.Fields['始値'].value);
Rs.MoveNext;
inc(i);
end;
OleChartSpace:=CreateOleObject('OWC11.ChartSpace'); //ChartSpaceの作成
OleChartSpace.Charts.Add(0); //グラフの追加
OleChartSpace.Charts[0].Type:=chChartTypeLineMarkers; //グラフの選択
OleChartSpace.Charts[0].SeriesCollection.Add(0); //シリーズの追加
{以下のtab区切りの文字列からのデータ設定では、グラフがうまく表示される
OleChartSpace.Charts[0].SeriesCollection[0].SetData(chDimCategories,chDataLiteral,StrDate);
OleChartSpace.Charts[0].SeriesCollection[0].SetData(chDimValues,chDataLiteral,StrValue);
}
//{以下の
OleChartSpace.DataSource:=Rs;
OleChartSpace.Charts[0].SeriesCollection[0].SetData(chDimCategories,chDataBound,'
日付');
OleChartSpace.Charts[0].SeriesCollection[0].SetData(chDimValues,chDataBound,'
始値');
//}
//表示用画像データの作成・表示
OleChartSpace.ExportPicture('Test.jpg','jpg',600,400);
JPG := TJpegImage.Create;
try
JPG.LoadFromFile('Test.jpg');
Image1.Picture.Bitmap.Assign(JPG);
finally
JPG.Free;
end;
finally
//OleValiantの解放
OleChartSpace:= unassigned;
Rs.Close;
Cn.Close;
Rs:=unassigned;
Cn:=unassigned;
end;
end;
****************************************************************
--------------------------------------
[10th Anniversary] Check Out the Special Final Sale
http://pr.mail.yahoo.co.jp/10thann/
マイナーな事を質問したせいか、質問の仕方も悪かったのかresponseがありませんでした
が、ChartSpace自体をdelphi上で表示・操作する方は、OleContainerで下記のようにする
ことでできました。
ただ、作られたOleVariantをどのタイミングで開放するべきかよく理解しておりませんが
、FormDestroy時に処理使用と思っています。
最初の質問のグラフのデータ設定に関しては、plotする数が高々知れているので、tab区切
りのデータで設定するのでもいいかとも思いますが、せっかくADOのRecordSetに対応して
いるようなので、後学のために、どなたかアドバイスをいただければ幸いです。
よろしくお願いします。
下記にTOleContainerを用いたコードを書いておきます。
****************************************************************
usesに,JPEG,ComObjを追加して、
OleContainer1.CreateObject('OWC11.ChartSpace',false); //ChartSpaceの作成
OleChartSpace:=OleContainer1.OleObject;
OleChartSpace.Charts.Add(0); //グラフの追加
OleChartSpace.Charts[0].Type:=chChartTypeLineMarkers; //グラフの選択
OleChartSpace.Charts[0].SeriesCollection.Add(0); //シリーズの追加
{以下のtab区切りの文字列からのデータ設定では、グラフがうまく表示される
OleChartSpace.Charts[0].SeriesCollection[0].SetData(chDimCategories,chDataLiteral,StrDate);
OleChartSpace.Charts[0].SeriesCollection[0].SetData(chDimValues,chDataLiteral,StrValue);
}
//{以下のRecordSetを指定して、フィールド名(カラム名)またはフィールド番号(カラ
ム番号)を指定する方法では不可
OleChartSpace.DataSource:=Rs;
OleChartSpace.Charts[0].SeriesCollection[0].SetData(chDimCategories,chDataBound,'
日付');
OleChartSpace.Charts[0].SeriesCollection[0].SetData(chDimValues,chDataBound,'
始値');
//}
end;
finally
//OleValiantの解放
OleChartSpace:= unassigned;
//if Assigned(OleContainer1) then OleContainer1.DestroyObject; //FormDestroy
時に処理