📄 ptrvdata.pas
字号:
DefCharExtra := GetTextCharacterExtra(Canvas.Handle);
tmpbmp := TBitmap.Create;
{$IFDEF RVDEBUGTABLE}
if Self is TRectPtblRVData then begin
Canvas.Pen.Color := clRed;
Canvas.Pen.Width := 0;
Canvas.Rectangle(GetPrintableAreaLeft,GetPrintableAreaTop,
GetPrintableAreaLeft+ TRectPtblRVData(Self).Width,
GetPrintableAreaTop+TRectPtblRVData(Self).Height);
end
else begin
{
if PgNo=1 then
with Self as TCustomMainPtblRVData do begin
Canvas.Pen.Color := clRed;
Canvas.Pen.Width := 0;
Canvas.Pen.Style := psDot;
Canvas.MoveTo(LeftOffs-300, TmpTM+TmpTMPix+TPrintableRV(FRichView).FRVPrint.StartAt);
Canvas.LineTo(300+GetWidth+LeftOffs-GetDevX(GetRightMargin), TmpTM+TmpTMPix+TPrintableRV(FRichView).FRVPrint.StartAt);
Canvas.Pen.Style := psSolid;
end;
if PgNo=(Self as TCustomMainPtblRVData).PagesColl.Count then
with Self as TCustomMainPtblRVData do begin
Canvas.Pen.Color := clRed;
Canvas.Pen.Width := 0;
Canvas.Pen.Style := psDot;
Canvas.MoveTo(LeftOffs-300, TmpTM+TmpTMPix+TPrintableRV(FRichView).FRVPrint.EndAt);
Canvas.LineTo(300+GetWidth+LeftOffs-GetDevX(GetRightMargin), TmpTM+TmpTMPix+TPrintableRV(FRichView).FRVPrint.EndAt);
Canvas.Pen.Style := psSolid;
end
}
end;
{$ENDIF}
if Preview and (GetRVLogPalette<>nil) then
tmpbmp.Palette := CreatePalette(GetRVLogPalette^);
XPos := 0;
try
for i:=first to last do begin
dli := DrawItems[i];
li := GetItem(dli.ItemNo);
BiDiMode := GetParaBiDiMode(li.ParaNo);
if (i=last) and (i<>first) and (dli is TRVMultiDrawItemInfo) and
(TRVMultiDrawItemInfo(dli).PartsList.Count>0) then
part := 0;
if not Correction or dli.FromNewLine or (dli.Left>XPos) or (BiDiMode=rvbdRightToLeft) then
XPos := dli.Left;
if ((i=first) or
((dli.ItemNo<>DrawItems[i-1].ItemNo) and
li.CanBeBorderStart)) and
(li.StyleNo<>rvsBreak) then
DrawParagraph(i);
no := li.StyleNo;
if no>=0 then begin{ text }
RVStyle.ApplyStyleColor(Canvas, no, []);
RVStyle.ApplyStyle(Canvas, no, BiDiMode);
TextStyle := RVStyle.TextStyles[no];
if TextStyle.BiDiMode=rvbdUnspecified then
BidiMode2 := BiDiMode
else
BidiMode2 := TextStyle.BiDiMode;
if BidiMode2<>rvbdRightToLeft then begin
if TextStyle.CharSpacing<>0 then
SetTextCharacterExtra(Canvas.Handle, GetDevX(TextStyle.CharSpacing));
if Correction and (dli.Length>1) and (BiDiMode<>rvbdRightToLeft) then begin
CharExtra := dli.Width{$IFNDEF DONOTUSEJUSTIFY}-dli.SpaceBefore{$ENDIF}
- RVU_TextWidth({$IFNDEF RVDONOTUSEALLCAPS}
RV_ReturnCapitalized(DrawItems.GetString(i,Items), RVStyle.TextStyles[No]),
{$ELSE}
DrawItems.GetString(i,Items),
{$ENDIF}
Canvas, li.ItemOptions);
CharExtra := GetDevX(TextStyle.CharSpacing)+(DefCharExtra*(dli.Length-1)+CharExtra) div (dli.Length-1);
SetTextCharacterExtra(Canvas.Handle,CharExtra);
end;
end;
if Assigned(RVStyle.OnDrawTextBack) then begin
Dummy := True;
RVStyle.OnDrawTextBack(RVStyle, Canvas, no, XPos+LeftOffs, dli.Top-zerocoord, dli.Width, dli.Height, [], Dummy);
end;
RVStyle.DrawStyleText(DrawItems.GetString(i,Items), Canvas, dli.ItemNo, 1, no, Self,
{$IFNDEF DONOTUSEJUSTIFY}dli.SpaceBefore,{$ELSE}0,{$ENDIF}
XPos+LeftOffs, dli.Top-zerocoord, dli.Width, dli.Height, [], True);
SetTextCharacterExtra(Canvas.Handle,DefCharExtra);
if Correction then begin
LineWidth := RVU_TextWidth(DrawItems.GetString(i,Items), Canvas, li.ItemOptions)
{$IFNDEF DONOTUSEJUSTIFY}+dli.SpaceBefore{$ENDIF};
if LineWidth>dli.Width then
inc(XPos, LineWidth)
else
inc(XPos, dli.Width);
end;
end
else begin // nontext
if li.GetBoolValueEx(rvbpPrintToBMP, RVStyle) then begin
if (Part>0) or ((Part=0)and(i=first)) then
ItemTop := -zerocoord
else
ItemTop := dli.Top-zerocoord;
if (Part>=0) then
h := MulDiv(TRVMultiDrawItemPart(TRVMultiDrawItemInfo(dli).PartsList[Part]).Height,
sad.ppiyScreen, sad.ppiyDevice)
else
h := li.GetImageHeight(RVStyle);
if li.GetBoolValue(rvbpFullWidth) then
w := MulDiv(GetWidth-GetDevX(GetRightMargin)-dli.Left,
sad.ppixScreen, sad.ppixDevice)
else
w := li.GetImageWidth(RVStyle);
tmpbmp.Width := w;
tmpbmp.Height := h;
DrawBackToTmpBmp(ItemTop);
if li.PrintToBitmap(tmpbmp, Preview, FRichView, dli, Part) then
RV_PictureToDevice(Canvas,
XPos+LeftOffs+ GetDevX(li.GetBorderWidth),
ItemTop + GetDevY(li.GetBorderWidth),
w, h,
sad, tmpbmp, Preview);
end
else begin
if (Part>0) or ((Part=0)and(i=first)) then
ItemTop := -zerocoord
else
ItemTop := dli.Top-zerocoord;
if li.GetBoolValue(rvbpFullWidth) then
li.Print(Canvas, XPos+LeftOffs, ItemTop,
GetWidth+LeftOffs-GetDevX(GetRightMargin),
Preview, Correction, sad, FRichView, dli, part)
else
li.Print(Canvas, XPos+LeftOffs, ItemTop,0,
Preview, Correction, sad, FRichView, dli, part);
end;
inc(XPos,dli.Width);
if part<>-1 then begin
if i=first then
zerocoord := GetTopCoord2(PgNo);
part := -1;
end;
end;
end;
DoPagePostpaint(Canvas, pgNo, Preview);
finally
backgroundbmp.Free;
tmpbmp.Free;
end;
end;
{============================ TCustomMainPtblRVData ===========================}
constructor TCustomMainPtblRVData.Create(RichView: TRVScroller);
begin
inherited;
PagesColl := TCollection.Create(TRVPageInfo);
end;
{------------------------------------------------------------------------------}
destructor TCustomMainPtblRVData.Destroy;
begin
PagesColl.Free;
inherited;
end;
{------------------------------------------------------------------------------}
function TCustomMainPtblRVData.GetColor: TColor;
begin
if Transparent then
Result := clNone
else
Result := inherited GetColor;
end;
{------------------------------------------------------------------------------}
function TCustomMainPtblRVData.GetPageHeight: Integer;
begin
Result := 0;
end;
{------------------------------------------------------------------------------}
function TCustomMainPtblRVData.GetPageWidth: Integer;
begin
Result := 0;
end;
{------------------------------------------------------------------------------}
procedure TCustomMainPtblRVData.GetDrawItemsRange(PageNo: Integer; var StartNo, EndNo, Part: Integer);
begin
StartNo := TRVPageInfo(PagesColl.Items[PageNo-1]).StartDrawItemNo;
Part := TRVPageInfo(PagesColl.Items[PageNo-1]).StartPart-1;
//FirstOffs := TRVPageInfo(PagesColl.Items[PageNo-1]).FirstItemOff;
if PageNo=PagesColl.Count then
EndNo := DrawItems.Count-1
else begin
EndNo := TRVPageInfo(PagesColl.Items[PageNo]).StartDrawItemNo-1;
if TRVPageInfo(PagesColl.Items[PageNo]).StartPart>1 then
inc(EndNo);
end;
end;
{------------------------------------------------------------------------------}
procedure TCustomMainPtblRVData.FormatNextPage(var i, StartAt, StartY, Y: Integer;
var Splitting: Boolean;
MaxHeight: Integer);
var j: Integer;
dli, dli2, dli3 :TRVDrawLineInfo;
nextnewline, tmp : Integer;
rvpi : TRVPageInfo;
nPages: Integer;
MustBreak: Boolean;
pi: TParaInfo;
{................................................}
function GetDevY(Y: Integer): Integer;
begin
Result := MulDiv(Y, PrnSaD.ppiyDevice, PrnSaD.ppiyScreen);
end;
{................................................}
begin
if PagesColl.Count=0 then begin
rvpi := TRVPageInfo(PagesColl.Add);
rvpi.StartY := 0;
rvpi.StartDrawItemNo := 0;
StartY := 0;
i := 0;
StartAt := TPrintableRV(FRichView).RVPrint.StartAt;
Splitting := False;
end;
nPages := PagesColl.Count;
if Splitting then begin
dli := DrawItems[i];
pi := GetRVStyle.ParaStyles[TCustomRVItemInfo(Items.Objects[dli.ItemNo]).ParaNo];
while dli.SplitAt(y) do begin
rvpi := TRVPageInfo(PagesColl.Add);
rvpi.StartDrawItemNo := i;
dli := DrawItems[i];
rvpi.StartY := -GetDevY(pi.SpaceBefore);
rvpi.StartPart := TRVMultiDrawItemInfo(dli).PartsList.Count;
if TRVPageInfo(PagesColl.Items[nPages-1]).StartDrawItemNo=i then
TRVPageInfo(PagesColl.Items[nPages-1]).StartY2 :=
dli.Top+dli.Height-
TRVMultiDrawItemPart(TRVMultiDrawItemInfo(dli).PartsList[TRVMultiDrawItemInfo(dli).PartsList.Count-2]).Height-
GetDevY(pi.SpaceBefore);
DoFormatting(nPages, rvpsProceeding);
StartAt := 0;
StartY := 0;
y := StartY+MaxHeight-StartAt+rvpi.StartY;
dec(y, GetDevY(pi.SpaceAfter));
exit;
end;
if TRVPageInfo(PagesColl.Items[nPages-1]).StartDrawItemNo=i then begin
StartY := dli.Top+dli.Height-
TRVMultiDrawItemPart(TRVMultiDrawItemInfo(dli).PartsList[TRVMultiDrawItemInfo(dli).PartsList.Count-1]).Height-
GetDevY(pi.SpaceBefore);
TRVPageInfo(PagesColl.Items[nPages-1]).StartY2 := StartY;
end;
inc(i);
Splitting := False;
end;
while i<DrawItems.Count do begin
dli := DrawItems[i];
pi := GetRVStyle.ParaStyles[TCustomRVItemInfo(Items.Objects[dli.ItemNo]).ParaNo];
MustBreak := ((i>0) and (dli.ItemNo<>DrawItems[i-1].ItemNo) and
TCustomRVItemInfo(Items.Objects[dli.ItemNo]).PageBreakBefore and
(TRVPageInfo(PagesColl.Items[nPages-1]).StartDrawItemNo<>i));
if (dli is TRVMultiDrawItemInfo) and dli.InitSplit then begin
if TRVPageInfo(PagesColl.Items[nPages-1]).StartDrawItemNo=i then begin
TRVPageInfo(PagesColl.Items[nPages-1]).StartPart := 1;
TRVPageInfo(PagesColl.Items[nPages-1]).StartY := -GetDevY(pi.SpaceBefore);
end;
y := StartY+MaxHeight-StartAt-dli.Top;
dec(y, GetDevY(pi.SpaceAfter));
if MustBreak or
((TRVPageInfo(PagesColl.Items[nPages-1]).StartDrawItemNo<>i) and
not dli.CanSplitFirst(y)) then begin
rvpi := TRVPageInfo(PagesColl.Add);
rvpi.StartDrawItemNo := i;
rvpi.StartY := -GetDevY(pi.SpaceBefore);
rvpi.StartPart := 1;
DoFormatting(nPages, rvpsProceeding);
StartY := 0;
StartAt := 0;
y := StartY+MaxHeight-StartAt+rvpi.StartY;
dec(y, GetDevY(pi.SpaceAfter));
Splitting := True;
exit;
end;
Splitting := True;
FormatNextPage(i, StartAt, StartY, Y, Splitting, MaxHeight);
exit;
end;
y := dli.Top+dli.Height;
inc(y, GetDevY(pi.SpaceAfter));
if (y>StartY+MaxHeight-StartAt) or MustBreak then begin // i-th item does not fit in page }
{ searching item will be first in new page } // or mandatory break
nextnewline := i;
for j:=i downto 0 do
if DrawItems[j].FromNewLine then begin
nextnewline := j;
break;
end;
{ page must contain one line at least}
if (StartAt<=0) and
(nextnewline = TRVPageInfo(PagesColl.Items[nPages-1]).StartDrawItemNo) then begin
tmp := nextnewline;
nextnewline := DrawItems.Count;
for j := tmp+1 to DrawItems.Count-1 do begin
if DrawItems[j].FromNewLine then begin
nextnewline := j;
break;
end;
end;
end;
if nextnewline<>DrawItems.Count then begin
{ searching min y of first line in new page }
dli2 := DrawItems[nextnewline];
StartY := dli2.Top;
for j := nextnewline+1 to DrawItems.Count-1 do begin
dli3 := DrawItems[j];
if dli3.FromNewLine then
break;
if dli3.Top<StartY then
StartY := dli3.Top;
end;
rvpi := TRVPageInfo(PagesColl.Add);
rvpi.StartDrawItemNo := nextnewline;
dli := DrawItems[nextnewline];
pi := GetRVStyle.ParaStyles[TCustomRVItemInfo(Items.Objects[dli.ItemNo]).ParaNo];
dec(StartY, GetDevY(pi.SpaceBefore));
rvpi.StartY := StartY;
DoFormatting(nPages, rvpsProceeding);
StartAt := 0;
end;
i := nextnewline;
exit;
end
else
inc(i);
end;
j := DrawItems.Count-1;
dli := DrawItems[j];
pi := GetRVStyle.ParaStyles[TCustomRVItemInfo(Items.Objects[dli.ItemNo]).ParaNo];
StartAt := dli.Top+dli.Height;
for j := DrawItems.Count-1 downto 0 do begin
if DrawItems[j].Top+DrawItems[j].Height>StartAt then
StartAt := DrawItems[j].Top+DrawItems[j].Height;
if DrawItems[j].FromNewLine then
break;
end;
inc(StartAt, GetDevY(pi.SpaceAfter));
rvpi := TRVPageInfo(PagesColl.Items[nPages-1]);
if rvpi.StartPart=0 then
TPrintableRV(FRichView).RVPrint.EndAt := StartAt-rvpi.StartY
else
TPrintableRV(FRichView).RVPrint.EndAt := StartAt-rvpi.StartY2;
if nPages=1 then
inc(TPrintableRV(FRichView).RVPrint.EndAt, TPrintableRV(FRichView).RVPrint.StartAt);
DoFormatting(nPages,rvpsProceeding);
end;
{------------------------------------------------------------------------------}
function TCustomMainPtblRVData.FormatPages: Integer;
var i, StartAt, StartY,y: Integer;
Splitting: Boolean;
MaxHeight: Integer;
begin
DoFormatting(0, rvpsStarting);
PrinterCanvas := InitPrinterCanvas;
Prepare;
TCustomRichView(FRichView).MaxTextWidth := MulDiv(FRichView.Width,
PrnSaD.ppixScreen, PrnSaD.ppixDevice);
Format_(False, True, False, 0, PrinterCanvas, False, False);
DonePrinterCanvas(PrinterCanvas);
PrinterCanvas := nil;
PagesColl.Clear;
Result := 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -