home *** CD-ROM | disk | FTP | other *** search
/ Chip 2003 January / Chip_2003-01_cd1.bin / zkuste / delphi / kolekce / d567 / FLEXCEL.ZIP / Demo / FlDemo / UFlDemoData.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  2002-10-09  |  18.5 KB  |  628 lines

  1. unit UFlDemoData;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  7.   UFlexcelReport, TemplateStore, UFlexCelImport, OLEAdapter, UExcelAdapter,
  8.   XLSAdapter, ImgList, Db, DBTables, Grids, UFlxMessages, ShellApi,
  9.   UFlxMemTable, ExtDlgs, UCustomFlexCelReport, XlsBaseTemplateStore,
  10.   {$IFDEF Excel97}Excel97,{$ELSE}Excel2000,{$ENDIF}
  11.   {$IFDEF ConditionalExpressions}{$if CompilerVersion >= 14} variants,{$IFEND}{$ENDIF} //Delphi 6 or above
  12.  
  13.   JPEG, UFlexcelReportNoDB;
  14.  
  15. type
  16.   TDemoData = class(TDataModule)
  17.     ImageList1: TImageList;
  18.     ImageList2: TImageList;
  19.     ImageList3: TImageList;
  20.     XlsSaveDialog: TSaveDialog;
  21.     XLSAdapter: TXLSAdapter;
  22.     OLEAdapter: TOLEAdapter;
  23.     FlexCelImport: TFlexCelImport;
  24.     XlsTemplateStore: TXlsTemplateStore;
  25.     RepSimpleDemo: TFlexCelReport;
  26.     Total: TQuery;
  27.     TotalSaleDate: TDateTimeField;
  28.     TotalCustNo: TFloatField;
  29.     TotalCompany: TStringField;
  30.     TotalAddr1: TStringField;
  31.     TotalAddr2: TStringField;
  32.     TotalCity: TStringField;
  33.     TotalState: TStringField;
  34.     TotalZip: TStringField;
  35.     TotalCountry: TStringField;
  36.     TotalPhone: TStringField;
  37.     TotalFAX: TStringField;
  38.     TotalTaxRate: TFloatField;
  39.     TotalContact: TStringField;
  40.     TotalLastInvoiceDate: TDateTimeField;
  41.     TotalOrderNo: TFloatField;
  42.     TotalCustNo_1: TFloatField;
  43.     TotalShipDate: TDateTimeField;
  44.     TotalEmpNo: TIntegerField;
  45.     TotalShipToContact: TStringField;
  46.     TotalShipToAddr1: TStringField;
  47.     TotalShipToAddr2: TStringField;
  48.     TotalShipToCity: TStringField;
  49.     TotalShipToState: TStringField;
  50.     TotalShipToZip: TStringField;
  51.     TotalShipToCountry: TStringField;
  52.     TotalShipToPhone: TStringField;
  53.     TotalShipVIA: TStringField;
  54.     TotalPO: TStringField;
  55.     TotalTerms: TStringField;
  56.     TotalPaymentMethod: TStringField;
  57.     TotalItemsTotal: TCurrencyField;
  58.     TotalTaxRate_1: TFloatField;
  59.     TotalFreight: TCurrencyField;
  60.     TotalAmountPaid: TCurrencyField;
  61.     TotalOrderNo_1: TFloatField;
  62.     TotalItemNo: TFloatField;
  63.     TotalPartNo: TFloatField;
  64.     TotalQty: TIntegerField;
  65.     TotalDiscount: TFloatField;
  66.     TotalPartNo_1: TFloatField;
  67.     TotalVendorNo: TFloatField;
  68.     TotalDescription: TStringField;
  69.     TotalOnHand: TFloatField;
  70.     TotalOnOrder: TFloatField;
  71.     TotalCost: TCurrencyField;
  72.     TotalListPrice: TCurrencyField;
  73.     Orders: TTable;
  74.     OrdersOrderNo: TFloatField;
  75.     OrdersCustNo: TFloatField;
  76.     OrdersSaleDate: TDateTimeField;
  77.     OrdersShipDate: TDateTimeField;
  78.     OrdersItemsTotal: TCurrencyField;
  79.     OrdersTaxRate: TFloatField;
  80.     OrdersFreight: TCurrencyField;
  81.     OrdersAmountPaid: TCurrencyField;
  82.     OrdersAmountDue: TCurrencyField;
  83.     OrdersEmpNo: TIntegerField;
  84.     OrdersShipToContact: TStringField;
  85.     OrdersShipToAddr1: TStringField;
  86.     OrdersShipToAddr2: TStringField;
  87.     OrdersShipToCity: TStringField;
  88.     OrdersShipToState: TStringField;
  89.     OrdersShipToZip: TStringField;
  90.     OrdersShipToCountry: TStringField;
  91.     OrdersShipToPhone: TStringField;
  92.     OrdersSalesPerson: TStringField;
  93.     OrdersShipVIA: TStringField;
  94.     OrdersPO: TStringField;
  95.     OrdersTerms: TStringField;
  96.     OrdersPaymentMethod: TStringField;
  97.     Items: TTable;
  98.     ItemsItemNo: TFloatField;
  99.     ItemsOrderNo: TFloatField;
  100.     ItemsPartNo: TFloatField;
  101.     ItemsDescription: TStringField;
  102.     ItemsSellPrice: TCurrencyField;
  103.     ItemsQty: TIntegerField;
  104.     ItemsDiscount: TFloatField;
  105.     ItemsExtPrice: TCurrencyField;
  106.     ItemsDiscountPc: TFloatField;
  107.     Parts: TTable;
  108.     PartsPartNo: TFloatField;
  109.     PartsDescription: TStringField;
  110.     PartsVendorNo: TFloatField;
  111.     PartsOnHand: TFloatField;
  112.     PartsOnOrder: TFloatField;
  113.     PartsBackOrd: TBooleanField;
  114.     PartsCost: TCurrencyField;
  115.     PartsListPrice: TCurrencyField;
  116.     Emps: TTable;
  117.     EmpsEmpNo: TIntegerField;
  118.     EmpsFullName: TStringField;
  119.     EmpsLastName: TStringField;
  120.     EmpsFirstName: TStringField;
  121.     EmpsPhoneExt: TStringField;
  122.     EmpsHireDate: TDateTimeField;
  123.     EmpsSalary: TFloatField;
  124.     Cust: TTable;
  125.     CustCustNo: TFloatField;
  126.     CustCompany: TStringField;
  127.     CustPhone: TStringField;
  128.     CustLastInvoiceDate: TDateTimeField;
  129.     CustAddr1: TStringField;
  130.     CustAddr2: TStringField;
  131.     CustCity: TStringField;
  132.     CustState: TStringField;
  133.     CustZip: TStringField;
  134.     CustCountry: TStringField;
  135.     CustFAX: TStringField;
  136.     CustTaxRate: TFloatField;
  137.     CustContact: TStringField;
  138.     CustTotAddr1: TStringField;
  139.     CustTotAddr2: TStringField;
  140.     Fish: TTable;
  141.     FishSpeciesNo: TFloatField;
  142.     FishCommon_Name: TStringField;
  143.     FishCategory: TStringField;
  144.     FishSpeciesName: TStringField;
  145.     FishLengthcm: TFloatField;
  146.     FishLength_In: TFloatField;
  147.     FishNotes: TMemoField;
  148.     FishGraphic: TGraphicField;
  149.     HTMLSaveDialog: TSaveDialog;
  150.     RepVarArray: TFlexCelReport;
  151.     DsCust: TDataSource;
  152.     RepDbDemo: TFlexCelReport;
  153.     DsOrders: TDataSource;
  154.     RepMultMast: TFlexCelReport;
  155.     RepSheets: TFlexCelReport;
  156.     RepFishFacts: TFlexCelReport;
  157.     RepPivot: TFlexCelReport;
  158.     RepEvents: TFlexCelReport;
  159.     Events: TTable;
  160.     EventsEventNo: TAutoIncField;
  161.     EventsVenueNo: TIntegerField;
  162.     EventsEvent_Name: TStringField;
  163.     EventsEvent_Date: TDateField;
  164.     EventsEvent_Time: TTimeField;
  165.     EventsEvent_Description: TMemoField;
  166.     EventsTicket_price: TCurrencyField;
  167.     EventsEvent_Photo: TGraphicField;
  168.     RepCustom: TFlexCelReport;
  169.     Ds: TQuery;
  170.     RepCharts: TFlexCelReport;
  171.     SortedItems: TQuery;
  172.     OpenDialog: TOpenDialog;
  173.     OpenPictureDialog: TOpenPictureDialog;
  174.     RepImgDemo: TFlexCelReport;
  175.     SortedItemsPartNo: TFloatField;
  176.     SortedItemsqty: TFloatField;
  177.     SortedItemsDescription: TStringField;
  178.     SortedItemsTotalCost: TCurrencyField;
  179.     RepSideBySide: TFlexCelReport;
  180.     Vendors: TTable;
  181.     VendorsVendorNo: TFloatField;
  182.     VendorsVendorName: TStringField;
  183.     VendorsAddress1: TStringField;
  184.     VendorsAddress2: TStringField;
  185.     VendorsCity: TStringField;
  186.     VendorsState: TStringField;
  187.     VendorsZip: TStringField;
  188.     VendorsCountry: TStringField;
  189.     VendorsPhone: TStringField;
  190.     VendorsFAX: TStringField;
  191.     VendorsPreferred: TBooleanField;
  192.     Birthday: TFlxMemTable;
  193.     RepMemory: TFlexCelReportNoDB;
  194.     BirthSex: TFlxMemTable;
  195.     VBirthday: TFlxMemTable;
  196.     procedure ItemsCalcFields(DataSet: TDataSet);
  197.     procedure EmpsCalcFields(DataSet: TDataSet);
  198.     procedure CustCalcFields(DataSet: TDataSet);
  199.     procedure RepFishFactsGetCellValue(Sender: TObject;
  200.       const FieldName: WideString; var FieldValue: Variant);
  201.     procedure RepEventsGetCellValue(Sender: TObject;
  202.       const FieldName: WideString; var FieldValue: Variant);
  203.     procedure RepMemoryAfterGenerateWorkbook(Sender: TObject;
  204.       const ExcelApp: TExcelFile);
  205.     procedure RepChartsAfterGenerateWorkbook(Sender: TObject;
  206.       const ExcelApp: TExcelFile);
  207.     procedure VBirthdayGetData(Sender: TObject; const FieldName: String;
  208.       const RecordPos: Integer; var Value: Variant);
  209.     procedure VBirthdayVirtualRecordCount(Sender: TObject;
  210.       var RecordCount: Integer);
  211.   private
  212.     FVarArrayDemo: variant;
  213.     FProtect: boolean;
  214.     FAutoPrint: boolean;
  215.  
  216.     GridMem: TStringGrid;
  217.  
  218.     function GetCurrent_Date: variant;
  219.     function GetAvailability: variant;
  220.     function GetCurrentDate: variant;
  221.     function GetCurrentSQL: variant;
  222.     function GetDsName: variant;
  223.     function GetMyImage: variant;
  224.     { Private declarations }
  225.   public
  226.     MyImageFilename: string;
  227.  
  228.     procedure SetAdapter (const Adapter: TExcelAdapter);
  229.     procedure SetFileName (const FName: string);
  230.     procedure ChangeFastCount(const Value: boolean);
  231.  
  232.     procedure FillArrayDemo(const aStg: array of TStringGrid);
  233.     procedure FillMemTable(const aStg: TStringGrid);
  234.     function GetReport(const Tag: integer): TCustomFlexCelReport;
  235.  
  236.     property Protect: boolean read FProtect write FProtect;
  237.     property AutoPrint: boolean read FAutoPrint write FAutoPrint;
  238.  
  239.     { Public declarations }
  240.   published
  241.     property Current_Date: variant read GetCurrent_Date;
  242.     property VarArrayDemo: variant read FVarArrayDemo;
  243.     property Availability: variant read GetAvailability;
  244.  
  245.     property DsName: variant read GetDsName;
  246.     property CurrentDate: variant read GetCurrentDate;
  247.     property CurrentSQL: variant read GetCurrentSQL;
  248.  
  249.     property MyImage: variant read GetMyImage;
  250.   end;
  251.  
  252. var
  253.   DemoData: TDemoData;
  254.  
  255.  
  256. implementation
  257.  
  258. {$R *.DFM}
  259.  
  260. { TDemoData }
  261.  
  262. procedure TDemoData.SetAdapter(const Adapter: TExcelAdapter);
  263. var
  264.   i: integer;
  265. begin
  266.   for i:=0 to ComponentCount-1 do
  267.   begin
  268.     if (Components[i] is TCustomFlexCelReport) then (Components[i] as TCustomFlexCelReport).Adapter:= Adapter;
  269.     if (Components[i] is TFlexCelImport) then (Components[i] as TFlexCelImport).Adapter:= Adapter;
  270.   end;
  271. end;
  272.  
  273. function TDemoData.GetCurrent_Date: variant;
  274. begin
  275.   Result:=now;
  276. end;
  277.  
  278. procedure TDemoData.SetFileName(const FName: string);
  279. var
  280.   i: integer;
  281. begin
  282.   for i:=0 to ComponentCount-1 do
  283.   begin
  284.     if (Components[i] is TCustomFlexCelReport) then (Components[i] as TCustomFlexCelReport).FileName:= FName;
  285.   end;
  286. end;
  287.  
  288.  
  289.  
  290. procedure TDemoData.FillArrayDemo(const aStg: array of TStringGrid);
  291. var
  292.   i,j, k: integer;
  293.   e: extended;
  294. begin
  295.   FVarArrayDemo:=VarArrayCreate([Low(aStg), High(aStg), 0,aStg[Low(aStg)].RowCount-2,0,aStg[Low(aStg)].ColCount-2], VarVariant);
  296.   for k:= Low(aStg) to High(aStg) do
  297.     for i:=0 to aStg[k].RowCount-2 do
  298.       for j:=0 to aStg[k].ColCount-2 do
  299.         //try to convert to number
  300.         if TextToFloat(PChar(aStg[k].Cells[j+1,i+1]), e, fvExtended) then  //Dont use val because it doesnt handle locales
  301.           FVarArrayDemo[k,i,j]:=e else
  302.           FVarArrayDemo[k,i,j]:=aStg[k].Cells[j+1,i+1];
  303.  
  304. end;
  305.  
  306. function TDemoData.GetReport(const Tag: integer): TCustomFlexCelReport;
  307. begin
  308.   case Tag of
  309.     1:  Result:= RepSimpleDemo;
  310.     2:  Result:= RepVarArray;
  311.     3:  Result:= RepImgDemo;
  312.     4:  Result:= RepDbDemo;
  313.     5:  Result:= RepMultMast;
  314.     6:  Result:= RepSheets;
  315.     7:  Result:= RepPivot;
  316.     8:  Result:= RepCharts;
  317.     9:  Result:= RepFishFacts;
  318.    10:  Result:= RepEvents;
  319.    11:  Result:= RepCustom;
  320.    12:  Result:= RepSideBySide;
  321.    13:  Result:= RepMemory;
  322.     else Raise Exception.Create('Invalid tag');
  323.   end; //Case
  324. end;
  325.  
  326. procedure TDemoData.ItemsCalcFields(DataSet: TDataSet);
  327. begin
  328.   ItemsExtPrice.Value := ItemsQty.Value *
  329.     ItemsSellPrice.Value * (100 - ItemsDiscount.Value) / 100;
  330.   ItemsDiscountPc.Value:=ItemsDiscount.Value / 100;
  331. end;
  332.  
  333. procedure TDemoData.EmpsCalcFields(DataSet: TDataSet);
  334. begin
  335.   EmpsFullName.Value := Format('%s, %s', [EmpsLastName.Value, EmpsFirstName.Value]);
  336. end;
  337.  
  338. procedure TDemoData.CustCalcFields(DataSet: TDataSet);
  339. begin
  340.   CustTotAddr1.Value:= CustAddr1.Value+' '+ CustAddr2.Value;
  341.   CustTotAddr2.Value:= CustCity.Value+' '+ CustState.Value + ' '+ CustZip.Value;
  342. end;
  343.  
  344.  
  345. { Paradox graphic BLOB header }
  346. type
  347.   TGraphicHeader = record
  348.     Count: Word;                { Fixed at 1 }
  349.     HType: Word;                { Fixed at $0100 }
  350.     Size: Longint;              { Size not including header }
  351.   end;
  352.  
  353. procedure TDemoData.RepFishFactsGetCellValue(Sender: TObject;
  354.   const FieldName: WideString; var FieldValue: Variant);
  355.  
  356. var
  357.   Jp: TJPEGImage;
  358.   Bmp: Graphics.TBitmap;
  359.   Ms: TMemoryStream;
  360.   s:string;
  361. begin
  362.   if FieldName='##FISH##Graphic##JPEG' then
  363.   begin
  364.     Jp:= TJPEGImage.Create;
  365.     try
  366.       Bmp:= TBitmap.Create;
  367.       try
  368.         Ms:= TMemoryStream.Create;
  369.         try
  370.           s:=FieldValue;
  371.           Ms.Write(s[1+SizeOf(TGraphicHeader)], Length(s)-SizeOf(TGraphicHeader));
  372.           Ms.Position:=0;
  373.           Bmp.LoadFromStream(Ms);
  374.           Jp.Assign(Bmp);
  375.           Ms.Clear;
  376.           Jp.SaveToStream(Ms);
  377.           Ms.Position:=0;
  378.           setLength(s, Ms.Size);
  379.           Ms.Read(s[1],Ms.Size);
  380.           FieldValue:=s;
  381.         finally
  382.           FreeAndNil(Ms);
  383.         end; //finally
  384.       finally
  385.         FreeAndNil(Bmp);
  386.       end; //finally
  387.     finally
  388.       FreeAndNil(Jp);
  389.     end; //finally
  390.   end;
  391. end;
  392.  
  393. procedure TDemoData.RepEventsGetCellValue(Sender: TObject;
  394.   const FieldName: WideString; var FieldValue: Variant);
  395. var
  396.   Jp: TJPEGImage;
  397.   Bmp: Graphics.TBitmap;
  398.   Ms: TMemoryStream;
  399.   s:string;
  400. begin
  401.   if FieldName='##Events##Event_Photo##JPEG' then
  402.   begin
  403.     Jp:= TJPEGImage.Create;
  404.     try
  405.       Bmp:= TBitmap.Create;
  406.       try
  407.         Ms:= TMemoryStream.Create;
  408.         try
  409.           s:=FieldValue;
  410.           Ms.Write(s[1+SizeOf(TGraphicHeader)], Length(s)-SizeOf(TGraphicHeader));
  411.           Ms.Position:=0;
  412.           Bmp.LoadFromStream(Ms);
  413.           Jp.Assign(Bmp);
  414.           Ms.Clear;
  415.           Jp.SaveToStream(Ms);
  416.           Ms.Position:=0;
  417.           setLength(s, Ms.Size);
  418.           Ms.Read(s[1],Ms.Size);
  419.           FieldValue:=s;
  420.         finally
  421.           FreeAndNil(Ms);
  422.         end; //finally
  423.       finally
  424.         FreeAndNil(Bmp);
  425.       end; //finally
  426.     finally
  427.       FreeAndNil(Jp);
  428.     end; //finally
  429.   end;
  430. end;
  431.  
  432. function TDemoData.GetAvailability: variant;
  433. var
  434.   w:Widestring;
  435.   wc: word;
  436. begin
  437.   if (EventsEventNo.Value=2) or (EventsEventNo.Value=4) then
  438.     begin
  439.       //There should be a better way to create a widestring... but this works
  440.       setLength(w,6);
  441.       wc:=$FB46;move(wc,w[1],2);
  442.       wc:=64335; move(wc,w[2],2);
  443.       wc:=65209; move(wc,w[3],2);
  444.       wc:=65272; move(wc,w[4],2);
  445.       wc:=65153; move(wc,w[5],2);
  446.       wc:=65179; move(wc,w[6],2);
  447.       w:='This is some no-no-sense unicode: '+w;
  448.     end else w:='';
  449.   result:=w;
  450. end;
  451.  
  452. function TDemoData.GetCurrentDate: variant;
  453. begin
  454.   Result:= double(Now); //Dates should be passed as numbers, and the corresponding cell in excel have Date format.
  455. end;
  456.  
  457. function TDemoData.GetCurrentSQL: variant;
  458. begin
  459.   Result:=''; //Not implemented here, see DbDump.exe for an implementation
  460. end;
  461.  
  462. function TDemoData.GetDsName: variant;
  463. begin
  464.   Result:='DBDEMOS';
  465. end;
  466.  
  467. procedure TDemoData.RepMemoryAfterGenerateWorkbook(Sender: TObject;
  468.   const ExcelApp: TExcelFile);
  469. var
  470.   Wb: TExcelWorkbook;
  471.   i: integer; v:variant ;
  472. begin
  473.   if Protect and ((Sender as TCustomFlexCelReport).Adapter is TOLEAdapter) then
  474.   begin
  475.     Wb:=(ExcelApp as TOleFile ).ExcelWorkbook;
  476.     Wb.Protect('pass',EmptyParam, EmptyParam);
  477.     for i:=1 to Wb.Sheets.Count do
  478.     begin
  479.       //we could use (Wb.Sheets[i] as WorkSheet).Protect('pass', EmptyParam, EmptyParam, EmptyParam, EmptyParam, (ExcelApp as TOleFile ).LCID);
  480.       //if there were no charts
  481.       v:=Wb.Sheets[i];v.Protect('pass');
  482.     end;
  483.   end;
  484.   if AutoPrint then
  485.     if ((Sender as TCustomFlexCelReport).Adapter is TOLEAdapter) then
  486.     begin
  487.       Wb:=(ExcelApp as TOleFile ).ExcelWorkbook;
  488.       Wb.PrintOut;
  489.     end else
  490.     begin
  491.       ShellExecute( 0,'print', PCHAR((Sender as TCustomFlexCelReport).FileName), NIL,NIL, SW_SHOW);
  492.     end;
  493.  
  494. end;
  495.  
  496. function TDemoData.GetMyImage: variant;
  497. var
  498.   Fs: TFileStream;
  499.   Pic: TPicture;
  500.   Jp: TJPEGImage;
  501.   Ms: TMemoryStream;
  502.   s: string;
  503. begin
  504.   if Uppercase(ExtractFileExt(MyImageFilename))<>'.JPG' then
  505.   begin //We have to convert it to a JPEG
  506.     Pic:=TPicture.Create;
  507.     try
  508.       Jp:= TJPEGImage.Create;
  509.       try
  510.         Pic.LoadFromFile(MyImageFilename);
  511.         Jp.Assign(Pic.Graphic);
  512.         Ms:= TMemoryStream.Create;
  513.         try
  514.           Jp.SaveToStream(Ms);
  515.           Ms.Position:=0;
  516.           setLength(s, Ms.Size);
  517.           Ms.Read(s[1],Ms.Size);
  518.           Result:=s;
  519.         finally
  520.           FreeAndNil(Ms);
  521.         end; //finally
  522.       finally
  523.         FreeAndNil(Jp);
  524.       end; //finally
  525.     finally
  526.       FreeAndNil(Pic);
  527.     end; //finally
  528.   end else //File is already JPEG, we dont need to convert it
  529.   begin
  530.     Fs:= TFileStream.Create(MyImageFilename, fmOpenRead);
  531.     try
  532.       SetLength(s, Fs.Size);
  533.       Fs.Read(s[1], Length(s));
  534.       Result:=s;
  535.     finally
  536.       FreeAndNil(Fs);
  537.     end; //finally
  538.   end;
  539. end;
  540.  
  541. procedure TDemoData.RepChartsAfterGenerateWorkbook(Sender: TObject;
  542.   const ExcelApp: TExcelFile);
  543. var
  544.   Wb: TExcelWorkbook;
  545.   Ws: variant;
  546.   v,v2:variant ;
  547.   i:integer;
  548.   LCID: integer;
  549. begin
  550.   if ((Sender as TCustomFlexCelReport).Adapter is TOLEAdapter) then
  551.   begin
  552.     Wb:=(ExcelApp as TOleFile ).ExcelWorkbook;
  553.       LCID:=(ExcelApp as TOleFile ).LCID;
  554.       Wb.Charts.Add(EmptyParam, EmptyParam, EmptyParam, EmptyParam, LCID);
  555.  
  556.       wb.ActiveChart.ChartType := xl3DColumnStacked100;
  557.       v:=Wb.Sheets['Hoja1'];
  558.       v:=v.Range['ChartData'];
  559.       v2:=wb.ActiveChart;
  560.       v2.SetSourceData(v, xlRows);
  561.       wb.ActiveChart.Location(xlLocationAsObject,'Hoja1');
  562.       v:=wb.ActiveChart;
  563.       v.HasTitle := False;
  564.       v.Axes(xlCategory).HasTitle := False;
  565.       v.Axes(xlSeries).HasTitle := False;
  566.       v.Axes(xlValue).HasTitle := False;
  567.       Ws:=(ExcelApp as TOleFile ).ExcelApplication.ActiveSheet ;
  568.       i:=Ws.ChartObjects.Count;
  569.       Ws.ChartObjects(i).Left:=400;
  570.       Ws.ChartObjects(i).Top:=200;
  571.    end;
  572. end;
  573.  
  574. procedure TDemoData.FillMemTable(const aStg: TStringGrid);
  575. var
  576.   R:ArrayOfVariant;
  577.   i: integer;
  578. begin
  579.   Birthday.Clear;
  580.   SetLength(R,4);
  581.   for i:=1 to aStg.RowCount-1 do
  582.     if aStg.Cells[1,i]<>'' then
  583.     begin
  584.       R[0]:=StrtoInt(aStg.Cells[0,i]);
  585.       R[1]:=aStg.Cells[1,i];
  586.       R[2]:=StrToDate(aStg.Cells[2,i]);
  587.       R[3]:=aStg.Cells[3,i];
  588.       Birthday.AddRecord(R);
  589.     end;
  590.   BirthSex.Clear;
  591.   BirthSex.AddRecord(['M']);
  592.   BirthSex.AddRecord(['F']);
  593.  
  594.   //Setup for virtual table
  595.   GridMem:=aStg;
  596.  
  597. end;
  598.  
  599. procedure TDemoData.VBirthdayGetData(Sender: TObject;
  600.   const FieldName: String; const RecordPos: Integer; var Value: Variant);
  601. begin
  602.   if FieldName='Number' then Value:=StrToInt(GridMem.Cells[0,RecordPos+1]) else
  603.   if FieldName='Name' then Value:=GridMem.Cells[1,RecordPos+1] else
  604.   if FieldName='Birthday Date' then Value:=StrToDate(GridMem.Cells[2,RecordPos+1]) else
  605.   if FieldName='Sex' then Value:=GridMem.Cells[3,RecordPos+1];
  606.  
  607. end;
  608.  
  609. procedure TDemoData.VBirthdayVirtualRecordCount(Sender: TObject;
  610.   var RecordCount: Integer);
  611. begin
  612.   RecordCount:=GridMem.RowCount-1;
  613. end;
  614.  
  615. procedure TDemoData.ChangeFastCount(const Value: boolean);
  616. var
  617.   i: integer;
  618. begin
  619.   for i:=0 to ComponentCount-1 do
  620.   begin
  621.     if (Components[i] is TFlexCelReport) then
  622.       if Value then (Components[i] as TFlexCelReport).CalcRecordCount:=cr_None else
  623.         (Components[i] as TFlexCelReport).CalcRecordCount:=cr_SlowCount; 
  624.   end;
  625. end;
  626.  
  627. end.
  628.