[Bug] TfrxEngineOptions
Hi,
we have found a strange behaviour regarding the handling of the TfrxEngineOptions PrintIfEmpty property.
If you change the setting for this property with checking or unchecking the checkbox in the Report->Options Dailog then
changed setting is saved correct in the report file. But if you reload this file and go back to the setting dialog the checkbox is allways
checked no matter what was chosen before.
After searching within the source code we think it is caused by the handling in the procedure TfrxReport.LoadFromStream(Stream: TStream).
So after adding a new local field called SavePrintIfEmpty and do the same for it as for SaveDoublePass the problem seems to be gone.
So it would be nice if you could remove this uggly bug.
greetings.
madas
new version of LoadFromStream:
we have found a strange behaviour regarding the handling of the TfrxEngineOptions PrintIfEmpty property.
If you change the setting for this property with checking or unchecking the checkbox in the Report->Options Dailog then
changed setting is saved correct in the report file. But if you reload this file and go back to the setting dialog the checkbox is allways
checked no matter what was chosen before.
After searching within the source code we think it is caused by the handling in the procedure TfrxReport.LoadFromStream(Stream: TStream).
So after adding a new local field called SavePrintIfEmpty and do the same for it as for SaveDoublePass the problem seems to be gone.
So it would be nice if you could remove this uggly bug.
greetings.
madas
new version of LoadFromStream:
procedure TfrxReport.LoadFromStream(Stream: TStream);
var
Compressor: TfrxCustomCompressor;
Crypter: TfrxCustomCrypter;
SaveEngineOptions: TfrxEngineOptions;
SavePreviewOptions: TfrxPreviewOptions;
SaveConvertNulls: Boolean;
SaveIgnoreDevByZero: Boolean;
SaveDoublePass[b], SavePrintIfEmpty[/b]: Boolean;
SaveOutlineVisible, SaveOutlineExpand: Boolean;
SaveOutlineWidth, SavePagesInCache: Integer;
SaveIni: String;
SavePreview: TfrxCustomPreview;
SaveOldStyleProgress, SaveShowProgress, SaveStoreInDFM: Boolean;
Crypted, SaveThumbnailVisible: Boolean;
function DecodePwd(const s: String): String;
var
i: Integer;
begin
Result := '';
for i := 1 to Length(s) do
Result := Result + Chr(Ord(s[i]) + 10);
end;
begin
FErrors.Clear;
Compressor := nil;
if frxCompressorClass <> nil then
begin
Compressor := TfrxCustomCompressor(frxCompressorClass.NewInstance);
Compressor.Create(nil);
Compressor.Report := Self;
Compressor.IsFR3File := True;
try
Compressor.CreateStream;
if Compressor.Decompress(Stream) then
Stream := Compressor.Stream;
except
Compressor.Free;
FErrors.Add(frxResources.Get('clDecompressError'));
frxCommonErrorHandler(Self, frxResources.Get('clErrors') + #13#10 + FErrors.Text);
Exit;
end;
end;
ReportOptions.Password := ReportOptions.HiddenPassword;
Crypter := nil;
Crypted := False;
if frxCrypterClass <> nil then
begin
Crypter := TfrxCustomCrypter(frxCrypterClass.NewInstance);
Crypter.Create(nil);
try
Crypter.CreateStream;
{$IFDEF Delphi12}
Crypted := Crypter.Decrypt(Stream, AnsiString(ReportOptions.Password));
{$ELSE}
Crypted := Crypter.Decrypt(Stream, ReportOptions.Password);
{$ENDIF}
if Crypted then
Stream := Crypter.Stream;
except
Crypter.Free;
FErrors.Add(frxResources.Get('clDecryptError'));
frxCommonErrorHandler(Self, frxResources.Get('clErrors') + #13#10 + FErrors.Text);
Exit;
end;
end;
SaveEngineOptions := TfrxEngineOptions.Create;
SaveEngineOptions.Assign(FEngineOptions);
SavePreviewOptions := TfrxPreviewOptions.Create;
SavePreviewOptions.Assign(FPreviewOptions);
SaveIni := FIniFile;
SavePreview := FPreview;
SaveOldStyleProgress := FOldStyleProgress;
SaveShowProgress := FShowProgress;
SaveStoreInDFM := FStoreInDFM;
FStreamLoaded := True;
try
FLoadStream := Stream;
// if FEngineOptions.ReportThread <> nil then
// THackThread(FEngineOptions.ReportThread).Synchronize(DoLoadFromStream) else
try
DoLoadFromStream;
except
on E: Exception do
begin
FStreamLoaded := False;
if (E is TfrxInvalidXMLException) and Crypted then
FErrors.Add('Invalid password')
else
FErrors.Add(E.Message)
end;
end;
finally
if Compressor <> nil then
Compressor.Free;
if Crypter <> nil then
Crypter.Free;
CheckDataPage;
SaveConvertNulls := FEngineOptions.ConvertNulls;
SaveIgnoreDevByZero := FEngineOptions.IgnoreDevByZero;
SaveDoublePass := FEngineOptions.DoublePass;
[b]SavePrintIfEmpty := FEngineOptions.PrintIfEmpty;[/b]
FEngineOptions.Assign(SaveEngineOptions);
FEngineOptions.ConvertNulls := SaveConvertNulls;
FEngineOptions.IgnoreDevByZero := SaveIgnoreDevByZero;
FEngineOptions.DoublePass := SaveDoublePass;
[b]FEngineOptions.PrintIfEmpty := SavePrintIfEmpty;[/b]
SaveEngineOptions.Free;
SaveOutlineVisible := FPreviewOptions.OutlineVisible;
SaveOutlineWidth := FPreviewOptions.OutlineWidth;
SaveOutlineExpand := FPreviewOptions.OutlineExpand;
SavePagesInCache := FPreviewOptions.PagesInCache;
SaveThumbnailVisible := FPreviewOptions.ThumbnailVisible;
FPreviewOptions.Assign(SavePreviewOptions);
FPreviewOptions.OutlineVisible := SaveOutlineVisible;
FPreviewOptions.OutlineWidth := SaveOutlineWidth;
FPreviewOptions.OutlineExpand := SaveOutlineExpand;
FPreviewOptions.PagesInCache := SavePagesInCache;
FPreviewOptions.ThumbnailVisible := SaveThumbnailVisible;
SavePreviewOptions.Free;
FIniFile := SaveIni;
FPreview := SavePreview;
FOldStyleProgress := SaveOldStyleProgress;
FShowProgress := SaveShowProgress;
FStoreInDFM := SaveStoreInDFM;
if not Crypted then
ReportOptions.Password := DecodePwd(ReportOptions.Password);
if ReportOptions.Info or ((not FReloading) and
(not FEngineOptions.EnableThreadSafe) and
(not Crypted and not FReportOptions.CheckPassword)) then
Clear
else if (FErrors.Count > 0) then
frxCommonErrorHandler(Self, frxResources.Get('clErrors') + #13#10 + FErrors.Text);
end;
end;