[Delphi:89463] Office Web Components(OWC11)での ADO RecordSet の利用について

99 views
Skip to first unread message

DANNY BOY

unread,
Mar 23, 2007, 4:11:53 AM3/23/07
to Del...@ml.users.gr.jp
佐伯と申します。

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/


DANNY BOY

unread,
Mar 25, 2007, 10:51:26 AM3/25/07
to Del...@ml.users.gr.jp
佐伯です。

マイナーな事を質問したせいか、質問の仕方も悪かったのか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
時に処理

Reply all
Reply to author
Forward
0 new messages