Question
“How can I launch the Report wizard directly in code?”
Solution
a. Simplest solution is to use the Designer
uses
ppWizard;
begin
// note: this example works with RB 10 and later
myDesigner.Form.LayoutManager.DocumentController.New(ppDefaultReportWizard);
end;
b. It is also possible to launch the report wizard without the Designer
Start by manually creating a TppReportWizard object and implementing the necessary events.
– OnCreateReport: Create a report object and assign a datapipeline.
– OnGetDataNames: Assign the field names from the pipeline to the DataNameList.
– OnGetFields: Add the datapipeline fields to the field list.
– OnValidateName: Set the aNameValid parameter to True.
Next execute the report wizard to show the dialog.
Download: LaunchReportWizardInCode.zip
Sample Delphi code:
uses
ppRptWiz;
procedure TForm1.btnLaunchWizardClick(Sender: TObject);
var
lWizard: TppReportWizard;
begin
lWizard := TppReportWizard.Create(Self);
lWizard.OnCreateReport := CreateReportEvent;
lWizard.OnGetDataNames := GetDataNamesEvent;
lWizard.OnGetFields := GetFieldsEvent;
lWizard.OnValidateName := ValidateNameEvent;
FReport := nil;
if (lWizard.Execute) then
FReport.Print;
lWizard.Free;
FReport.Free;
end;
procedure TForm1.CreateReportEvent(Sender: TObject; const aDataName: String; var aReport: TObject);
begin
FReport := TppReport.Create(Self);
FReport.DataPipeline := DataPipelineForName(aDataName);
aReport := FReport;
end;
procedure TForm1.GetDataNamesEvent(Sender: TObject; aDataNameList: TStrings);
begin
aDataNameList.Assign(FDataPipelines);
end;
procedure TForm1.GetFieldsEvent(Sender: TObject; const aDataName: String; aFieldList: TStrings);
var
lDataPipeline: TppDataPipeline;
liIndex: Integer;
begin
lDataPipeline := DataPipelineForName(aDataName);
if (lDataPipeline <> nil) then
for liIndex := 0 to lDataPipeline.FieldCount - 1 do
aFieldList.AddObject(lDataPipeline.Fields[liIndex].FieldAlias, lDataPipeline.Fields[liIndex]);
end;
procedure TForm1.ValidateNameEvent(Sender: TObject; const aName: String; var aNameValid: Boolean);
begin
aNameValid := True;
end;
function TForm1.DataPipelineForName(const aDataName: String): TppDataPipeline;
var
liIndex: Integer;
begin
liIndex := FDataPipelines.IndexOf(aDataName);
if (liIndex <> -1) then
Result := TppDataPipeline(FDataPipelines.Objects[liIndex])
else
Result := nil;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FDataPipelines := TStringList.Create;
FDataPipelines.AddObject('Customers', plCustomer);
FDataPipelines.AddObject('Orders', plOrder);
FDataPipelines.AddObject('Sea Fish', plSeaFish);
end;