📄 frxpreviewpages.pas
字号:
Compressor.IsFR3File := False;
try
Compressor.CreateStream;
if Compressor.Decompress(FTempStream) then
FTempStream := Compressor.Stream;
except
Compressor.Free;
Report.Errors.Add(frxResources.Get('clDecompressError'));
frxCommonErrorHandler(Report, frxResources.Get('clErrors') + #13#10 + Report.Errors.Text);
Exit;
end;
end;
FXMLDoc.LoadFromStream(FTempStream, FAllowPartialLoading);
AfterLoad;
if Compressor <> nil then
Compressor.Free;
end;
procedure TfrxPreviewPages.DoSaveToStream;
var
Compressor: TfrxCustomCompressor;
StreamTo: TStream;
begin
StreamTo := FTempStream;
Compressor := nil;
if Report.ReportOptions.Compressed and (frxCompressorClass <> nil) then
begin
Compressor := TfrxCustomCompressor(frxCompressorClass.NewInstance);
Compressor.Create(nil);
Compressor.Report := Report;
Compressor.IsFR3File := False;
Compressor.CreateStream;
StreamTo := Compressor.Stream;
end;
try
BeforeSave;
FXMLDoc.SaveToStream(StreamTo);
finally
if Compressor <> nil then
begin
try
Compressor.Compress(FTempStream);
finally
Compressor.Free;
end;
end;
end;
end;
procedure TfrxPreviewPages.LoadFromStream(Stream: TStream;
AllowPartialLoading: Boolean = False);
begin
Clear;
FTempStream := Stream;
FAllowPartialLoading := AllowPartialLoading;
// if Report.EngineOptions.ReportThread <> nil then
// THackThread(Report.EngineOptions.ReportThread).Synchronize(DoLoadFromStream)
// else
DoLoadFromStream;
end;
procedure TfrxPreviewPages.SaveToStream(Stream: TStream);
begin
FTempStream := Stream;
// if Report.EngineOptions.ReportThread <> nil then
// THackThread(Report.EngineOptions.ReportThread).Synchronize(DoSaveToStream)
// else
DoSaveToStream;
end;
function TfrxPreviewPages.LoadFromFile(const FileName: String;
ExceptionIfNotFound: Boolean): Boolean;
var
Stream: TFileStream;
begin
Result := FileExists(FileName);
if Result or ExceptionIfNotFound then
begin
Stream := TFileStream.Create(FileName, fmOpenRead + fmShareDenyWrite);
try
LoadFromStream(Stream);
finally
Stream.Free;
end;
{ Clear;
FXMLDoc.LoadFromFile(FileName);
AfterLoad;}
end;
end;
procedure TfrxPreviewPages.SaveToFile(const FileName: String);
var
Stream: TFileStream;
begin
Stream := TFileStream.Create(FileName, fmCreate);
try
SaveToStream(Stream);
finally
Stream.Free;
end;
{ BeforeSave;
FXMLDoc.SaveToFile(FileName);
ClearPageCache;
AfterLoad;}
end;
procedure TfrxPreviewPages.AfterLoad;
var
i: Integer;
xs: TfrxXMLSerializer;
xi: TfrxXMLItem;
p: TfrxReportPage;
{ store source objects' properties in the FBaseName to get it later in the GetPage }
procedure DoProps(p: TfrxReportPage);
var
i: Integer;
l: TList;
c: THackComponent;
begin
l := p.AllObjects;
for i := 0 to l.Count - 1 do
begin
c := l[i];
c.FBaseName := xs.WriteComponentStr(c);
end;
end;
{ fill FDictionary.Objects }
procedure FillDictionary;
var
i: Integer;
Name, PageName, ObjName: String;
PageN: Integer;
begin
xi := FXMLDoc.Root.FindItem('dictionary');
FDictionary.Clear;
for i := 0 to xi.Count - 1 do
begin
Name := Copy(xi[i].Text, 7, Length(xi[i].Text) - 7);
PageName := Copy(Name, 1, Pos('.', Name) - 1);
ObjName := Copy(Name, Pos('.', Name) + 1, 255);
PageN := StrToInt(Copy(PageName, 5, 255));
FDictionary.Add(xi[i].Name, Name,
TfrxReportPage(FSourcePages[PageN]).FindObject(ObjName));
end;
end;
begin
FPagesItem := FXMLDoc.Root.FindItem('previewpages');
xs := TfrxXMLSerializer.Create(nil);
{ load the report settings }
xi := FXMLDoc.Root.FindItem('report');
if xi.Count > 0 then
xs.ReadRootComponent(Report, xi[0]);
{ build sourcepages }
try
xi := FXMLDoc.Root.FindItem('sourcepages');
ClearSourcePages;
for i := 0 to xi.Count - 1 do
begin
{$IFDEF Delphi12}
// if AnsiStrIComp(PAnsiChar(xi[i].Name), PansiChar(AnsiString('TfrxDMPPage'))) = 0 then
if CompareText(xi[i].Name, 'TfrxDMPPage') = 0 then
{$ELSE}
if CompareText(xi[i].Name, 'TfrxDMPPage') = 0 then
{$ENDIF}
p := TfrxDMPPage.Create(nil) else
p := TfrxReportPage.Create(nil);
xs.Owner := p;
xs.ReadRootComponent(p, xi[i]);
DoProps(p);
FSourcePages.Add(p);
end;
xi.Clear;
finally
xs.Free;
end;
{ build the dictionary }
FillDictionary;
{ load the picturecache }
FPictureCache.LoadFromXML(FXMLDoc.Root.FindItem('picturecache'));
end;
procedure TfrxPreviewPages.BeforeSave;
var
i: Integer;
xs: TfrxXMLSerializer;
xi: TfrxXMLItem;
begin
FPagesItem := FXMLDoc.Root.FindItem('previewpages');
xs := TfrxXMLSerializer.Create(nil);
{ upload the report settings }
xi := FXMLDoc.Root.FindItem('report');
xi.Clear;
xi := xi.Add;
xi.Name := Report.ClassName;
xi.Text := 'DotMatrixReport="' + frxValueToXML(Report.DotMatrixReport) +
'" PreviewOptions.OutlineVisible="' + frxValueToXML(Report.PreviewOptions.OutlineVisible) +
'" PreviewOptions.OutlineWidth="' + frxValueToXML(Report.PreviewOptions.OutlineWidth) +
'" ReportOptions.Name="' + frxStrToXML(Report.ReportOptions.Name) + '"';
{ upload the sourcepages }
try
xi := FXMLDoc.Root.FindItem('sourcepages');
xi.Clear;
for i := 0 to FSourcePages.Count - 1 do
xs.WriteRootComponent(FSourcePages[i], True, xi.Add);
finally
xs.Free;
end;
{ upload the dictionary }
xi := FXMLDoc.Root.FindItem('dictionary');
xi.Clear;
for i := 0 to FDictionary.Names.Count - 1 do
with xi.Add do
begin
Name := FDictionary.Names[i];
Text := 'name="' + FDictionary.GetSourceName(Name) + '"';
end;
{ upload the picturecache }
xi := FXMLDoc.Root.FindItem('picturecache');
FPictureCache.SaveToXML(xi);
end;
function TfrxPreviewPages.GetObject(const Name: String): TfrxComponent;
begin
Result := TfrxComponent(FDictionary.GetObject(Name));
end;
function TfrxPreviewPages.GetPage(Index: Integer): TfrxReportPage;
var
xi: TfrxXMLItem;
xs: TfrxXMLSerializer;
i: Integer;
Source: TfrxReportPage;
procedure DoObjects(Item: TfrxXMLItem; Owner: TfrxComponent);
var
i: Integer;
c, c0: TfrxComponent;
begin
for i := 0 to Item.Count - 1 do
begin
c0 := GetObject(Item[i].Name);
{ object not found in the dictionary }
if c0 = nil then
c := xs.ReadComponentStr(Owner, Item[i].Name + ' ' + Item[i].Text, True)
else
begin
c := xs.ReadComponentStr(Owner,
THackComponent(c0).FBaseName + ' ' + Item[i].Text, True);
c.Name := c0.Name;
if (c is TfrxPictureView) and (TfrxPictureView(c).Picture.Graphic = nil) then
FPictureCache.GetPicture(TfrxPictureView(c));
end;
c.Parent := Owner;
DoObjects(Item[i], c);
end;
end;
begin
Result := nil;
if Count = 0 then Exit;
{ check pagecache first }
if not Engine.Running then
begin
i := FPageCache.IndexOf(IntToStr(Index));
if i <> -1 then
begin
Result := TfrxReportPage(FPageCache.Objects[i]);
FPageCache.Exchange(i, 0);
Exit;
end;
end;
xs := TfrxXMLSerializer.Create(nil);
try
{ load the page item }
xi := FPagesItem[Index];
FXMLDoc.LoadItem(xi);
{$IFDEF Delphi12}
// if AnsiStrIComp(PAnsiChar(xi.Name), PAnsiChar(AnsiString('TfrxReportPage'))) = 0 then
if CompareText(xi.Name, 'TfrxReportPage') = 0 then
{$ELSE}
if CompareText(xi.Name, 'TfrxReportPage') = 0 then
{$ENDIF}
begin
{ page item do not refer to the originalpages }
Result := TfrxReportPage.Create(nil);
xs.ReadRootComponent(Result, xi);
end
{$IFDEF Delphi12}
// else if AnsiStrIComp(PAnsiChar(xi.Name), PAnsiChar(AnsiString('TfrxDMPPage'))) = 0 then
else if CompareText(xi.Name, 'TfrxDMPPage') = 0 then
{$ELSE}
else if CompareText(xi.Name, 'TfrxDMPPage') = 0 then
{$ENDIF}
begin
{ page item do not refer to the originalpages }
Result := TfrxDMPPage.Create(nil);
xs.ReadRootComponent(Result, xi);
end
else
begin
Source := FSourcePages[StrToInt(Copy(String(xi.Name), 5, 5))];
{ create reportpage and assign properties from original page }
if Source is TfrxDMPPage then
Result := TfrxDMPPage.Create(nil) else
Result := TfrxReportPage.Create(nil);
Result.Assign(Source);
{ create objects }
DoObjects(xi, Result);
end;
finally
xs.Free;
end;
{ update aligned objects }
Result.AlignChildren;
{ add this page to the pagecache }
FPageCache.InsertObject(0, IntToStr(Index), Result);
i := FPageCache.Count;
{ remove the least used item from the pagecache }
if (i > 1) and (i > Report.PreviewOptions.PagesInCache) then
begin
xi := FPagesItem[StrToInt(FPageCache[i - 1])];
if Report.EngineOptions.UseFileCache and xi.Unloadable then
begin
FXMLDoc.UnloadItem(xi);
xi.Clear;
end;
TfrxReportPage(FPageCache.Objects[i - 1]).Free;
FPageCache.Delete(i - 1);
end;
end;
function TfrxPreviewPages.GetPageSize(Index: Integer): TPoint;
var
xi: TfrxXMLItem;
p: TfrxReportPage;
begin
if (Count = 0) or (Index < 0) or (Index >= Count) then
begin
Result := Point(0, 0);
Exit;
end;
xi := FPagesItem[Index];
{$IFDEF Delphi12}
{ if (AnsiStrIComp(PAnsiChar(xi.Name), PAnsiChar(AnsiString('TfrxReportPage'))) = 0) or
(AnsiStrIComp(PAnsiChar(xi.Name), PAnsiChar(AnsiString('TfrxDMPPage'))) = 0) then}
if (CompareText(xi.Name, 'TfrxReportPage') = 0) or
(CompareText(xi.Name, 'TfrxDMPPage') = 0) then
{$ELSE}
if (CompareText(xi.Name, 'TfrxReportPage') = 0) or
(CompareText(xi.Name, 'TfrxDMPPage') = 0) then
{$ENDIF}
p := GetPage(Index) else
p := FSourcePages[StrToInt(Copy(String(xi.Name), 5, 256))];
Result.X := Round(p.Width);
Result.Y := Round(p.Height);
end;
procedure TfrxPreviewPages.AddEmptyPage(Index: Integer);
var
xi: TfrxXMLItem;
begin
if Count = 0 then Exit;
xi := TfrxXMLItem.Create;
xi.Name := FPagesItem[Index].Name;
FPagesItem.InsertItem(Index, xi);
ClearPageCache;
end;
procedure TfrxPreviewPages.DeletePage(Index: Integer);
begin
if Count < 2 then Exit;
FPagesItem[Index].Free;
ClearPageCache;
end;
procedure TfrxPreviewPages.ModifyPage(Index: Integer; Page: TfrxReportPage);
var
xs: TfrxXMLSerializer;
begin
xs := TfrxXMLSerializer.Create(nil);
try
FPagesItem[Index].Clear;
xs.WriteRootComponent(Page, True, FPagesItem[Index]);
FPagesItem[Index].Unloadable := False;
ClearPageCache;
finally
xs.Free;
end;
end;
procedure TfrxPreviewPages.AddFrom(Report: TfrxReport);
var
i: Integer;
Page: TfrxReportPage;
xi: TfrxXMLItem;
xs: TfrxXMLSerializer;
begin
xs := TfrxXMLSerializer.Create(nil);
for i := 0 to Report.PreviewPages.Count - 1 do
begin
Page := Report.PreviewPages.Page[i];
xi := TfrxXMLItem.Create;
xi.Name := FPagesItem[Count - 1].Name;
xs.WriteRootComponent(Page, True, xi);
xi.Unloadable := False;
FPagesItem.AddItem(xi);
end;
xs.Free;
ClearPageCache;
end;
procedure TfrxPreviewPages.DrawPage(Index: Integer; Canvas: TCanvas;
ScaleX, ScaleY, OffsetX, OffsetY: Extended);
var
i: Integer;
Page: TfrxReportPage;
l: TList;
c: TfrxComponent;
IsPrinting: Boolean;
SaveLeftMargin, SaveRightMargin: Extended;
rgn: HRGN;
function ViewVisible(c: TfrxComponent): Boolean;
var
r: TRect;
begin
with c do
r := Rect(Round(AbsLeft * ScaleX) - 20, Round(AbsTop * ScaleY) - 20,
Round((AbsLeft + Width) * ScaleX + 20),
Round((AbsTop + Height) * ScaleY + 20));
OffsetRect(r, Round(OffsetX), Round(OffsetY));
Result := RectVisible(Canvas.Handle, r) or (Canvas is TMetafileCanvas);
end;
begin
Page := GetPage(Index);
if Page = nil then Exit;
SaveLeftMargin := Page.LeftMargin;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -