DEFINE CLASS ReportInfo AS Custom FRXName = '' IsPortrait = .T. && to help size the preview window. IsLegal = .F. && same reason. OrderBy = 1 && to aid in Print When's Property1 = ' ' ManyMoreProps ENDDEFINE In your Print() you can populate the properties, or better still, create the object in the specific form's Load() and bind the properties to the appropriate controls using the ControlSource. LOCAL oReportInfo * Create the object and populate the properties. oReportInfo = NEWOBJECT('ReportInfo', 'SomeClassLib.VCX') WITH oReportInfo FRXName = 'ReportA.FRX' OrderBy = 2 && Order by Name, not Number. etc. ENDWITH DO ReportForm WITH m.oReportInfo In the ReportForm you can use the properties by creating a custom property. PROCEDURE Init (ReportInfo) This.ReportInfo = m.ReportInfo ENDPROC * When you are ready to print do this. LOCAL ThisReport ThisReport = This.ReportInfo * You may use ThisReport.OrderBy or ThisReport.Property1 * in your report, it's in scope even though you might think it isn't. REPORT FORM ThisReport.FRXName TO PRINTER &MoreStuff.>I have a generic Form which I call to do all my reports. I would norammly call this from the application forms e.g.