unit MAIN; interface uses Windows, SysUtils, Classes, Graphics, Forms, Controls, Menus, StdCtrls, Dialogs, Buttons, Messages, ExtCtrls, ComCtrls, StdActns, ActnList, ToolWin, ImgList, frxClass, frxDesgn, frxExportODF, frxExportTXT, frxExportMail, frxExportCSV, frxExportText, frxExportImage, frxExportRTF, frxExportXML, frxExportXLS, frxExportHTML, frxExportPDF, frxSDACComponents, frxODACComponents, frxIBDACComponents, frxDACComponents, frxMYDACComponents, frxVCLZip, frxFunction, frxAdvPicture, frxChart, frxCrypt, frxGZip, frxDCtrl, frxDMPExport, frxGradient, frxChBox, frxCross, frxRich, frxOLE, frxBarcode; type TfrxReportList = class(TObject) private FReportList: TList; function GetReport(Index: Integer): TfrxReport; function GetCount: Integer; public constructor Create; destructor Destroy; override; procedure ClearList; procedure Delete(Index: Integer); function CreateNewReport: TfrxReport; function IndexOf(Report: TfrxReport): Integer; property Report [Index: Integer]: TfrxReport read GetReport; property Count: Integer read GetCount; end; TMainForm = class(TForm) StatusBar: TStatusBar; ActionList1: TActionList; FileNew1: TAction; FileSave1: TAction; FileExit1: TAction; WindowCascade1: TWindowCascade; WindowTileHorizontal1: TWindowTileHorizontal; WindowArrangeAll1: TWindowArrange; WindowMinimizeAll1: TWindowMinimizeAll; WindowTileVertical1: TWindowTileVertical; ToolBar2: TToolBar; ToolButton2: TToolButton; ToolButton3: TToolButton; ToolButton9: TToolButton; ToolButton8: TToolButton; ToolButton10: TToolButton; ToolButton11: TToolButton; ImageList1: TImageList; ToolButton1: TToolButton; ToolButton5: TToolButton; PreviewReport: TAction; MainMenu1: TMainMenu; frxBarCodeObject1: TfrxBarCodeObject; frxOLEObject1: TfrxOLEObject; frxRichObject1: TfrxRichObject; frxCrossObject1: TfrxCrossObject; frxCheckBoxObject1: TfrxCheckBoxObject; frxGradientObject1: TfrxGradientObject; frxDotMatrixExport1: TfrxDotMatrixExport; frxDialogControls1: TfrxDialogControls; frxGZipCompressor1: TfrxGZipCompressor; frxCrypt1: TfrxCrypt; frxChartObject1: TfrxChartObject; frxAdvPictureObject1: TfrxAdvPictureObject; frxAddFunctionLibrary1: TfrxAddFunctionLibrary; frxVCLZipCompressor1: TfrxVCLZipCompressor; frxMYDACComponents1: TfrxMYDACComponents; frxIBDACComponents1: TfrxIBDACComponents; frxODACComponents1: TfrxODACComponents; frxSDACComponents1: TfrxSDACComponents; frxPDFExport1: TfrxPDFExport; frxHTMLExport1: TfrxHTMLExport; frxXLSExport1: TfrxXLSExport; frxXMLExport1: TfrxXMLExport; frxRTFExport1: TfrxRTFExport; frxBMPExport1: TfrxBMPExport; frxJPEGExport1: TfrxJPEGExport; frxTIFFExport1: TfrxTIFFExport; frxGIFExport1: TfrxGIFExport; frxSimpleTextExport1: TfrxSimpleTextExport; frxCSVExport1: TfrxCSVExport; frxMailExport1: TfrxMailExport; frxTXTExport1: TfrxTXTExport; frxODSExport1: TfrxODSExport; frxODTExport1: TfrxODTExport; procedure FileNew1Execute(Sender: TObject); procedure FileExit1Execute(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure DestroyDesigner(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FileSave1Execute(Sender: TObject); procedure PreviewReportExecute(Sender: TObject); private { Private declarations } FReportList: TfrxReportList; public { Public declarations } end; var MainForm: TMainForm; implementation {$R *.dfm} { TfrxReportList } procedure TfrxReportList.ClearList; begin while FReportList.Count > 0 do begin TfrxReport(FReportList[0]).Free; FReportList.Delete(0); end; end; constructor TfrxReportList.Create; begin inherited; FReportList := TList.Create; end; function TfrxReportList.CreateNewReport: TfrxReport; begin Result := TfrxReport.Create(nil); Result.CreateUniqueName; Result.PreviewOptions.MDIChild := True; Result.PreviewOptions.Modal := False; Result.EngineOptions.DestroyForms := False; FReportList.Add(Result); end; procedure TfrxReportList.Delete(Index: Integer); begin if (Index < 0) or (Index >= FReportList.Count) then exit; TfrxReport(FReportList[Index]).Free; FReportList.Delete(Index); end; destructor TfrxReportList.Destroy; begin ClearList; FReportList.Free; inherited; end; function TfrxReportList.GetCount: Integer; begin Result := FReportList.Count; end; function TfrxReportList.GetReport(Index: Integer): TfrxReport; begin if (Index < 0) or (Index >= FReportList.Count) then Result := nil else Result := TfrxReport(FReportList[Index]); end; function TfrxReportList.IndexOf(Report: TfrxReport): Integer; begin Result := FReportList.IndexOf(Report); end; {Main Form} procedure TMainForm.FileNew1Execute(Sender: TObject); begin with FReportList.CreateNewReport do begin DesignReport(False, True); TfrxDesignerForm(Designer).OnDestroy := DestroyDesigner; TfrxDesignerForm(Designer).Caption := 'Designer-' + IntToStr(FReportList.Count); end; end; procedure TMainForm.FileExit1Execute(Sender: TObject); begin Close; end; procedure TMainForm.FormCreate(Sender: TObject); begin FReportList := TfrxReportList.Create; end; procedure TMainForm.FormDestroy(Sender: TObject); begin FReportList.Free; end; procedure TMainForm.DestroyDesigner(Sender: TObject); var idx: Integer; begin idx := FReportList.IndexOf(TfrxDesignerForm(Sender).Report); if FReportList.Report[idx].PreviewForm <> nil then FReportList.Report[idx].PreviewForm.Close; FReportList.Delete(idx); end; procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction); var idx: Integer; begin for idx := 0 to FReportList.Count - 1 do TfrxDesignerForm(FReportList.Report[idx].Designer).Close; Action := caFree; end; procedure TMainForm.FileSave1Execute(Sender: TObject); var idx: Integer; begin for idx := 0 to FReportList.Count - 1 do TfrxDesignerForm(FReportList.Report[idx].Designer).SaveCmd.Execute; end; procedure TMainForm.PreviewReportExecute(Sender: TObject); var idx: Integer; begin for idx := 0 to FReportList.Count - 1 do FReportList.Report[idx].ShowReport; end; end.