A Question About Dynamic Loading SubReports
The demo for this uses the LoadFromFile or LoadFromDatabase,
I chose to do this a little differently for one subreport that I do not
want the user to be able to delete or alter.
the code basically looks like this:
FReport := TppChildReport.Create(Self);
with FReport do begin
...
end;
FDetailBand := FReport.AddBand(btDetail, 0);
with FDetialBand do begin
...
end;
FLabel1 := TppLabel.Create(FDetailBand)
with FLabel do begin
...
Band := FDetailBand;
OnGetText := Label1GetText;
end;
There are more components but that's enough to see what is
going on. Next I load this into the tempplate.
aStream := TMemoryStream.Create;
FReport.Template.SaveToStream(aStream);
Report.Template.LoadFromStream(aStream);
aStream.Free;
All of this works just fine, no problems no errors.
Except for the OnGetText event, it does not fire.
My question -- is there some way to get the events to fire,
or do they not fire by design.
Thanks to anyone who can help.
I chose to do this a little differently for one subreport that I do not
want the user to be able to delete or alter.
the code basically looks like this:
FReport := TppChildReport.Create(Self);
with FReport do begin
...
end;
FDetailBand := FReport.AddBand(btDetail, 0);
with FDetialBand do begin
...
end;
FLabel1 := TppLabel.Create(FDetailBand)
with FLabel do begin
...
Band := FDetailBand;
OnGetText := Label1GetText;
end;
There are more components but that's enough to see what is
going on. Next I load this into the tempplate.
aStream := TMemoryStream.Create;
FReport.Template.SaveToStream(aStream);
Report.Template.LoadFromStream(aStream);
aStream.Free;
All of this works just fine, no problems no errors.
Except for the OnGetText event, it does not fire.
My question -- is there some way to get the events to fire,
or do they not fire by design.
Thanks to anyone who can help.
This discussion has been closed.
Comments
Check out the Code Based thread of the TechTips newsgroup. There you can
find articles with sample code. You are not creating the reports in quite
the correct manner. The Owner of all report elements should be the
form/datamodule. Never call AddBand, instead set the Band property of the
component (i.e. myLabel.Band := myReport.Detail).
As for the event-handler not firing my guess is that when the report
definition is loaded from stream, the event-handler assignment is lost. The
event-handler method needs to be a published method of the form/datamodule
that Owns the report.
--
Nard Moseley
Digital Metaphors Corporation
www.digital-metaphors.com
Best regards,
Nard Moseley
Digital Metaphors
www.digital-metaphors.com
the band.objects and assign the events to the appropriate object after
the report definition is loaded from stream.
Thanks for the additional info on the Bands, that might be
why if I have the SubReport active in the Design tab go to
the Preview tab and then back to the Design tab with the
SubReport still active, I get an endless access violation.
I still have one problem, here is what I do to produce
the problem. I also tried this with the Dynamic Loading
SubReports demo and the problem occurs there as well.
1. Set report bands: Title, Detail, Summary.
2. Add Dynamic Subreport to title band.
3. Click Preview tab
4. Click Design tab
5. Make Dynamic SubReport the active page in the Design tab
6. Click Preview tab
7. Click Design tab
Result is an endless access violation.
This example shows another approach, which is to use reference style
subreports. It is much simpler.
www.digital-metaphors.com/tips/SubReference.zip
--
Nard Moseley
Digital Metaphors Corporation
www.digital-metaphors.com
Best regards,
Nard Moseley
Digital Metaphors
www.digital-metaphors.com
about the problem with the Dynamic Loading SubReports
causing an access violation.
I don't think I mentioned it but I'm using
Delphi 5
Report Builder Professional 7.01
I can recreate that issue here. Therefore you have discovered that the
example has problems. Sorry about that. I traced the RB source code and even
attempted a couple of mods, but have not found any solution yet....
--
Nard Moseley
Digital Metaphors Corporation
www.digital-metaphors.com
Best regards,
Nard Moseley
Digital Metaphors
www.digital-metaphors.com
another band it is basically just a standard SubReport.
Here is a solution that works for me.
TmySubReport = Class(TppSubReport)
private
FSubReportLoaded: Boolean;
procedure LoadTitleSubreport;
public
constructor Create(aOwner: TComponent); override;
destructor Destroy; override;
procedure StartOfMainReport; override;
published
property SubReportLoaded: Boolean read FSubReportLoaded write
FSubReportLoaded default false;
end;
procedure TmySubReport.Create(aOwner: TComponent);
begin
inherited Create(aOwner);
FSubReportLoaded := False;
end;
destructor TmySubReport.Destroy;
begin
inherited Destroy;
end;
procedure TmyDynamicLoadingSubReport.StartOfMainReport;
begin
inherited StartOfMainReport;
if (Band is TppHeaderBand) and Not FSubReportLoaded then
LoadTitleSubreport;
end;
procedure TmySubReport.LoadTitleSubReport;
begin
if FSubReportLoaded then Exit;
// Lines of code to add components
FSubReportLoaded := True;
end;
initialization
ppRegisterComponent(TmySubReport, 'Demo Components', 0, 0, 'Dynamic
Loading SubReport', 0);
finalization
ppUnRegisterComponent(TmySubReport);
end.
Thanks for providing that solution. I tried adding similar code to the
example and it resolved the issue there as well.
--
Nard Moseley
Digital Metaphors Corporation
www.digital-metaphors.com
Best regards,
Nard Moseley
Digital Metaphors
www.digital-metaphors.com