home *** CD-ROM | disk | FTP | other *** search
/ PC Format Collection 48 / SENT14D.ISO / tech / delphi / disk15 / stocks.pak / INDCHART.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1995-08-24  |  5.5 KB  |  225 lines

  1. unit Indchart;
  2.  
  3. interface
  4.  
  5. uses WinTypes, WinProcs, Classes, Graphics, Forms, Controls, Buttons,
  6.   StdCtrls, VBXCtrl, Chart2fx, ExtCtrls, DB, DBTables, Messages;
  7.  
  8. type
  9.   TfmIndustChart = class(TForm)
  10.     Panel1: TPanel;
  11.     Chart: TChartFX;
  12.     BtnDiv: TSpeedButton;
  13.     BtnBest: TSpeedButton;
  14.     BtnWorst: TSpeedButton;
  15.     BtnPrint: TSpeedButton;
  16.     QIndustry: TQuery;
  17.     QMaster: TQuery;
  18.     DataSource: TDataSource;
  19.     PanelHint: TPanel;
  20.     Table: TTable;
  21.     procedure BtnBestClick(Sender: TObject);
  22.     procedure BtnDivClick(Sender: TObject);
  23.     procedure BtnWorstClick(Sender: TObject);
  24.     procedure FormCreate(Sender: TObject);
  25.     procedure FormDestroy(Sender: TObject);
  26.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  27.     procedure DisplayHint(Sender: TObject);
  28.     procedure FormActivate(Sender: TObject);
  29.     procedure BtnPrintClick(Sender: TObject);
  30.   private
  31.     DivCalced: Boolean;
  32.     MouseOverForm: Boolean;
  33.     IndustList: TStringList;
  34.     procedure SetChartToDiv;
  35.     procedure SetCharttoBW(Best: Boolean);
  36.     procedure GetDivValues;
  37.     procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
  38.     procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
  39.   public
  40.     procedure ShowCharts;
  41.   end;
  42.  
  43. var
  44.   fmIndustChart: TfmIndustChart;
  45.  
  46. implementation
  47.  
  48. {$R *.DFM}
  49.  
  50. uses Dialogs, SysUtils, ChartFX;
  51.  
  52. const
  53.   Separator = #255;
  54.  
  55.   BestWorstQualifiers = 4;
  56.  
  57. procedure TfmIndustChart.GetDivValues;
  58. begin
  59.   try
  60.     IndustList.Clear;
  61.     QIndustry.Open;
  62.     QMaster.Open;
  63.     while not QIndustry.Eof do
  64.     begin
  65.       DivCalced := true;
  66.       { add a "Description #255 Value" string to list }
  67.       if Qmaster.Fields[0].AsString = '' then
  68.         IndustList.Add(QIndustry.Fields[2].AsString+Separator+'0')
  69.       else
  70.         IndustList.Add(QIndustry.Fields[2].AsString+Separator+Qmaster.Fields[0].AsString);
  71.       QIndustry.Next;
  72.     end;
  73.     QIndustry.Close;
  74.     Qmaster.Close;
  75.   except
  76.     MessageDlg('Unable to ascertain industry diversity',mtError,[mbOK],0);
  77.   end;
  78. end;
  79.  
  80. procedure TfmIndustChart.SetChartToDiv;
  81. var
  82.   I: Integer;
  83.   P: Byte;
  84. begin
  85.   Screen.Cursor := CrHourGlass;
  86.   if not DivCalced then
  87.     GetDivValues;
  88.   with Chart do
  89.   begin
  90.     Visible := false;
  91.     Chart3D := true;
  92.     ChartType := 5; { pie }
  93.     { COD_VALUES defined in ChartFX }
  94.     OpenData[COD_VALUES] := MakeLong(1,IndustList.Count);
  95.     ThisSerie := 0;    { about to define series 0 values }
  96.     for I := 0 to pred(IndustList.Count) do
  97.     begin
  98.       Application.ProcessMessages;
  99.       P := pos(Separator, IndustList[I]);
  100.       try
  101.         Value[I] := strtoint(copy(IndustList[I], succ(P), 255))
  102.       except
  103.         Value[I] := 0;
  104.       end;
  105.       Legend[I] := copy(IndustList[I], 1, pred(P));
  106.     end;
  107.     CloseData[COD_VALUES] := 0;
  108.     LegendWidth := 150;
  109.     Title[CHART_TOPFT] := 'Holdings by Industry';
  110.     Visible := true;
  111.   end;
  112.   Screen.Cursor := CrDefault;
  113. end;
  114.  
  115. procedure TfmIndustChart.SetCharttoBW(Best: Boolean);
  116. var I: integer;
  117. begin
  118.   Screen.Cursor := CrHourGlass;
  119.   with Chart do
  120.   begin
  121.     Chart3D := False;
  122.     ChartType := 2; { bar }
  123.     try
  124.       OpenData[COD_VALUES] := MakeLong(1, BestWorstQualifiers);
  125.       ThisSerie := 0;    { about to define series 0 values }
  126.       Table.Close;
  127.       if Best then
  128.         Table.IndexName := 'GrowthDesc'
  129.       else
  130.         Table.IndexName := 'GrowthAsc';
  131.       Table.Open;
  132.       for I := 0 to pred(BestWorstQualifiers) do
  133.       begin
  134.         try
  135.           Value[I] := Table.FieldbyName('PROJ_GRTH').AsInteger;
  136.           Legend[I] := Table.FieldbyName('CO_NAME').AsString;
  137.         except
  138.           Value[I] := 0;
  139.         end;
  140.         Table.Next;
  141.       end;
  142.       Table.Close;
  143.     except
  144.       MessageDlg('Unable to get chart data', mtError, [mbOK], 0);
  145.     end;
  146.     CloseData[COD_VALUES] := 0;
  147.     LegendWidth := 150;
  148.   end;
  149.   Screen.Cursor := CrDefault;
  150. end;
  151.  
  152. procedure TfmIndustChart.ShowCharts;
  153. begin
  154.   if not Visible then
  155.   begin
  156.     BtnDiv.Down := True;
  157.     SetChartToDiv;
  158.   end;
  159.   Show;
  160. end;
  161.  
  162. procedure TfmIndustChart.BtnBestClick(Sender: TObject);
  163. begin
  164.   SetCharttoBW(true);
  165.   Chart.Title[CHART_TOPFT] := 'High Growth Stocks';
  166. end;
  167.  
  168. procedure TfmIndustChart.BtnDivClick(Sender: TObject);
  169. begin
  170.   SetChartToDiv;
  171. end;
  172.  
  173. procedure TfmIndustChart.BtnWorstClick(Sender: TObject);
  174. begin
  175.   SetCharttoBW(false);
  176.   Chart.Title[CHART_TOPFT] := 'Least Growth Stocks';
  177. end;
  178.  
  179. procedure TfmIndustChart.DisplayHint(Sender: TObject);
  180. begin
  181.   if MouseOverForm and Active then   { don't show other form's hints }
  182.     PanelHint.Caption := Application.Hint;
  183. end;
  184.  
  185. procedure TfmIndustChart.FormCreate(Sender: TObject);
  186. begin
  187.   DivCalced := False;
  188.   IndustList := tStringList.Create;
  189. end;
  190.  
  191. procedure TfmIndustChart.FormDestroy(Sender: TObject);
  192. begin
  193.   IndustList.Free;
  194. end;
  195.  
  196. procedure TfmIndustChart.FormClose(Sender: TObject;
  197.   var Action: TCloseAction);
  198. begin
  199.   DivCalced := False;  { recalc each time the dialog is opened }
  200. end;
  201.  
  202. procedure TfmIndustChart.CMMouseEnter(var Message: TMessage);
  203. begin
  204.    MouseOverForm := true;
  205. end;
  206.  
  207. procedure TfmIndustChart.CMMouseLeave(var Message: TMessage);
  208. begin
  209.    MouseOverForm := false;
  210. end;
  211.  
  212. procedure TfmIndustChart.FormActivate(Sender: TObject);
  213. begin
  214.   Application.OnHint := DisplayHint;
  215. end;
  216.  
  217. procedure TfmIndustChart.BtnPrintClick(Sender: TObject);
  218. begin
  219.   if MessageDlg('   Print this chart?', mtConfirmation, [mbYes, mbNo], 0)
  220.     = mrYes then
  221.     Chart.PrintIt := 0;
  222. end;
  223.  
  224. end.
  225.