用Delphi编写CGI程序返回图象
珠海西门子表计公司
汪永荣
---- Delphi 4.0对Internet编程提供了强大的支持,Delphi 4.0编写CGI非常容易, Delphi 4.0本身提供了例程。但是笔者在实践中遇到需要CGI程序根据数据库动态 返回图象的情况,很多文章推进使用Cgi-Expert或有关的OCX控件,使用控件不仅 带来额外的开销,且缺乏灵活性,那么能否不使用这些控件自己编写代码实现,现 推荐一种方法,代码如下:
unit ChartMod; interface uses Windows, Messages, SysUtils, Classes, HTTPApp, Db, DBTables, DbChart, Series, Jpeg, ExtCtrls; type TWebModule1 = class(TWebModule) Table1: TTable; procedure WebModule1ActionAreaAction (Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); procedure WebModule1ActionPopulationAction (Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); procedure WebModule1Create(Sender: TObject); procedure WebModule1Destroy(Sender: TObject); procedure WebModule1AfterDispatch(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); private Chart: TDBChart; Series: TPieSeries; Image: TImage; public { Public declarations } end; var WebModule1: TWebModule1; implementation {$R *.DFM} procedure TWebModule1.WebModule1ActionAreaAction( Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin // set specific values Chart.Title.Text.Clear; Chart.Title.Text.Add ('Area of Countries'); Chart.LeftAxis.Title.Caption := 'Area'; Series.Title := 'Area'; Series.PieValues.ValueSource := 'Area'; end; procedure TWebModule1.WebModule1ActionPopulationAction( Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin // set specific values Chart.Title.Text.Clear; Chart.Title.Text.Add ('Population of Countries'); Chart.LeftAxis.Title.Caption := 'Population'; Series.Title := 'Population'; Series.PieValues.ValueSource := 'Population'; end; procedure TWebModule1.WebModule1Create(Sender: TObject); begin // open the database table Table1.Open; // create the chart Chart := TDBChart.Create (nil); Chart.Width := 600; Chart.Height := 400; Chart.AxisVisible := False; Chart.Legend.Visible := False; Chart.BottomAxis.Title.Caption := 'Name'; // create the pie series Series := TPieSeries.Create (Chart); Series.ParentChart := Chart; Series.DataSource := Table1; Series.XLabelsSource := 'Name'; Series.OtherSlice.Style := poBelowPercent; Series.OtherSlice.Text := 'Others'; Series.OtherSlice.Value := 2; Chart.AddSeries (Series); // create the memory bitmap Image := TImage.Create (nil); Image.Width := Chart.Width; Image.Height := Chart.Height; end; procedure TWebModule1.WebModule1Destroy( Sender: TObject); begin Chart.Free; Series.Free; Image.Free; end; procedure TWebModule1.WebModule1AfterDispatch( Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var Jpeg: TJpegImage; MemStr: TMemoryStream; begin // paint the chart on the memory bitmap Chart.Draw (Image.Canvas, Image.BoundsRect); // create the jpeg and copy the iamge to it Jpeg := TJpegImage.Create; try Jpeg.Assign (Image.Picture.Bitmap); MemStr := TMemoryStream.Create; try // save to a stream and return it Jpeg.SaveToStream (MemStr); MemStr.Position := 0; Response.ContentType := 'image/jpeg'; Response.ContentStream := MemStr; Response.SendResponse; finally MemStr.Free; end; finally Jpeg.Free; end; end; end.