procedure TForm.LoadReportStreamEvent(Sender: TObject; Stream: TStream); var AuxStream: TMemoryStream; line: string; pos: byte; begin if TestStreamFormat(Stream) <> sofText then Exit;
Stream.Position := 0; auxStream := TMemoryStream.Create; try while not Stream.EOLF do begin line := Stream.NextLine; pos := Pos ('DatabaseName = ', line); if pos > 0 then line := Copy (line, 1, pos+14)+Chr(39)+ "MyDBAlias"+Chr(39); line := line+#13#10; AuxStream.WriteBuffer(line[1], Length (line)); end; AuxStream.Position := 0; Stream.CopyFrom(AuxStream, AuxStream.Size); TMemoryStream (Stream).Setsize(AuxStream.Size); end; finally AuxStream.Free; end; end;
Of course i am working with text format for the templates.
But when i open the designer at runtime a still have to manually assign the database alias in datasettings dialog because it shows empty. I don't know why and the only difference to your implementation has todo with the fact that i am creating all the components at runtime. But i am filling the properties with all the values i suppose to, as i've seen in the dfm files of DBIsam demo.
That is cool. It is also possible to convert a binary template to ascii text first, in order to more easily convert the class names for the objects in the dataview to switch between data base types, such as TdaBDEQueryDataview to TdaADOQueryDataview. Then save the ascii text down to a binary template, all without having to load a report template into a report object. Here is an example of this technique:
Thank you very much for your suggestion. I'm having a problem compiling the code you're suggesting though. In my Delphi (7 Ent), properties and methods of the TStream object (e.g. EOLF, NextLine) don't seem to be legal. I've done thorough searches in all Delphi library source directories, and inspected the TStream and all its descendants using the Browser for these attributes and cannot seem to be able to find them. Are you using a custom descendant of TStream for that?
Also, from your example, it appears you're attempting to change the AliasName itself. In my case, the AliasName remains the same, what changes is the path it points to. Will your code work with that too? And if so, I'd really like to understand why it would.
I am changing object properties of the template while streaming from database and as RB imposes binary format in DB case, i am compressing and decompressing ascii template to get better binary compression and also to do this kind of manipulation without more complications.
Comments
http://www.digital-metaphors.com
info@digital-metaphors.com
http://www.digital-metaphors.com
info@digital-metaphors.com
I have got the same aplication layout as you described and the same problem
also (RB 7.02).
I've solved the dataview db assignment at runtime:
Code:
Report.Template.OnLoadStart := LoadReportStreamEvent;
procedure TForm.LoadReportStreamEvent(Sender: TObject; Stream: TStream);
var
AuxStream: TMemoryStream;
line: string;
pos: byte;
begin
if TestStreamFormat(Stream) <> sofText then Exit;
Stream.Position := 0;
auxStream := TMemoryStream.Create;
try
while not Stream.EOLF do begin
line := Stream.NextLine;
pos := Pos ('DatabaseName = ', line);
if pos > 0 then
line := Copy (line, 1, pos+14)+Chr(39)+ "MyDBAlias"+Chr(39);
line := line+#13#10;
AuxStream.WriteBuffer(line[1], Length (line));
end;
AuxStream.Position := 0;
Stream.CopyFrom(AuxStream, AuxStream.Size);
TMemoryStream (Stream).Setsize(AuxStream.Size);
end;
finally
AuxStream.Free;
end;
end;
Of course i am working with text format for the templates.
But when i open the designer at runtime a still have to manually assign the
database alias in datasettings dialog because it shows empty. I don't know
why and the only difference to your implementation has todo with the fact
that i am creating all the components at runtime. But i am filling the
properties with all the values i suppose to, as i've seen in the dfm files
of DBIsam demo.
MacBar
first, in order to more easily convert the class names for the objects in
the dataview to switch between data base types, such as TdaBDEQueryDataview
to TdaADOQueryDataview. Then save the ascii text down to a binary template,
all without having to load a report template into a report object. Here is
an example of this technique:
http://www.digital-metaphors.com/tips/ConvertBinaryTemplateToASCII.zip
Cheers,
Jim Bennett
Digital Metaphors
http://www.digital-metaphors.com
info@digital-metaphors.com
Thank you very much for your suggestion. I'm having a problem compiling the
code you're suggesting though. In my Delphi (7 Ent), properties and methods
of the TStream object (e.g. EOLF, NextLine) don't seem to be legal. I've
done thorough searches in all Delphi library source directories, and
inspected the TStream and all its descendants using the Browser for these
attributes and cannot seem to be able to find them. Are you using a custom
descendant of TStream for that?
Also, from your example, it appears you're attempting to change the
AliasName itself. In my case, the AliasName remains the same, what changes
is the path it points to. Will your code work with that too? And if so, I'd
really like to understand why it would.
Thanks for your help.
Waguih
text
TdaBDEQueryDataview
template,
I forgot to mention some details.
I am changing object properties of the template while streaming from
database and as RB imposes binary format in DB case, i am compressing and
decompressing ascii template to get better binary compression and also to do
this kind of manipulation without more complications.
Best regards,
MacBar
the
methods
Yes and sorry i forgot to mention it. If you want i can send you the all
class privatly.
I'd
In my case each alias points to a different database so i am managing the
database switch by switching the db alias at runtime.
Best regards,
MacBar
Thank you very much for offering your code. That is very nice of you. I'd
like very much to try it out. My email address is wboctor@hotmail.com.
Thanks again and I'll let you know how it works out for me.
Waguih