⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 acefile.pas

📁 suite component ace report
💻 PAS
📖 第 1 页 / 共 5 页
字号:
      pp := TAcePagePosition.Create;
      LoadStream.Read(pos, SizeOf(pos));
      pp.Pos := pos;
      Pages.Add(pp);
    end;

    for spot := 0 to AceFileInfo.objects - 1 do
    begin
      LoadStream.Read(rc, SizeOf(rc));
      obj := TAceAceFileObject.Create;
      case rc of
        AceRT_Font:
        begin
          obj.ObjectType := aotFont;
          LoadStream.Read(obj.LogFont, SizeOf(TAceLogFont));
        end;
        AceRT_Pen:
        begin
          obj.ObjectType := aotPen;
          LoadStream.Read(obj.LogPen, SizeOf(TAceLogPen));
        end;
        AceRT_Brush:
        begin
          obj.ObjectType := aotBrush;
          LoadStream.Read(obj.LogBrush, SizeOf(TAceLogBrush));
        end;
      end;
      objects.Add(obj);
    end;

    Stream.CopyFrom(LoadStream, LoadStream.Size - LoadStream.Position);
    PercentDone := 100;
  end;
end;

procedure TAceAceFile.PlayPage(DC: THandle; page: LongInt);
var
  pp: TAcePagePosition;
  RecType: Word;
  SavePos: LongInt;
  hnd: THandle;
  pos: Integer;
  sSize: LongInt;
begin
  if (Pages.Count > 0) And (Not Running Or
      ((Pages.Count > 1) And (page > 0) And (page < Pages.Count))) then
  begin
    SavePos := Stream.Position;

{    if Page < 1 then Page := 1;
    if Running And (Page > (Pages.Count - 1)) then Page := Pages.Count - 1;
    if Page > Pages.Count then Page := Pages.Count;
    if Page < 1 then Page := 1;
 }
    pp := pages.items(page - 1);
    Stream.Position := pp.Pos;


    sSize := Stream.Size;
    ReadType(RecType);
    while (RecType <> AceRT_EndPage) And (Stream.Position < sSize) do
    begin
      PlayRecord(RecType, DC);
      ReadType(RecType);
    end;
    if AceIsDemo then PrintDemoBanner(DC, AcePrinterSetup.Width / 2, AcePrinterSetup.Length / 2,
                                          HorzScale, VertScale);

    { Select StockObjects }
  {$IFDEF WIN32}
    hnd := windows.GetStockObject(SYSTEM_FONT);
    windows.SelectObject(DC, hnd);
    hnd := windows.GetStockObject(HOLLOW_BRUSH);
    windows.SelectObject(DC, hnd);
    hnd := windows.GetStockObject(BLACK_PEN);
    windows.SelectObject(DC, hnd);
  {$ELSE}
    hnd := winprocs.GetStockObject(SYSTEM_FONT);
    winprocs.SelectObject(DC, hnd);
    hnd := winprocs.GetStockObject(HOLLOW_BRUSH);
    winprocs.SelectObject(DC, hnd);
    hnd := winprocs.GetStockObject(BLACK_PEN);
    winprocs.SelectObject(DC, hnd);
  {$ENDIF}

    for pos := 0 to Objects.count - 1 do
    begin
      TAceAceFileObject(Objects.items[pos]).DeleteObject;
    end;

    Stream.Position := SavePos;
  end;
end;
{
procedure TAceAceFile.Scale(DC: THandle);
var
  w,h: LongInt;
begin
  if (HorzScale <> 100) Or (VertScale <> 100) then
  begin
    w := Round(AcePrinterSetup.Width  * GetDeviceCaps(DC, LOGPIXELSX));
    h := Round(AcePrinterSetup.Length * GetDeviceCaps(DC, LOGPIXELSY));
    AceScale(DC,PageWidth, PageHeight, w, h, HorzScale, VertScale);
    if SetOrigin then AceSetOrigin(DC, PixelsPerInchX, PixelsPerInchY, OrgX, OrgY);
  end else
  begin
    AceScale(DC,PageWidth, PageHeight, PageWidth, PageHeight, HorzScale, VertScale);
    if SetOrigin then AceSetOrigin(DC, PixelsPerInchX, PixelsPerInchY, OrgX, OrgY);
  end;
end;
}

function TAceAceFile.GetPageWidth: Integer;
begin
  result := Round(AcePrinterSetup.Width * PixelsPerInchX);
end;
function TAceAceFile.GetPageHeight: Integer;
begin
  result := Round(AcePrinterSetup.Length * PixelsPerInchY);
end;
function TAceAceFile.GetPixelsPerInchX: Integer;
begin
  result := AceFileInfo.PixelsPerInchX;
end;
procedure TAceAceFile.SetPixelsPerInchX( ppi: Integer );
begin
  AceFileInfo.PixelsPerInchX := ppi;
end;
function TAceAceFile.GetPixelsPerInchY: Integer;
begin
  Result := AceFileInfo.PixelsPerInchY;
end;
procedure TAceAceFile.SetPixelsPerInchY( ppi: Integer );
begin
  AceFileInfo.PixelsPerInchY := ppi;
end;



procedure TAceAceFile.PlayRecord(RecType: Integer; DC: THandle);
type
  TPoints = array[0..0] of TPoint;
var
  spot: SmallInt;
  obj: TAceAceFileObject;
  x,y: SmallInt;
  x1,x2,x3,x4,y1,y2,y3,y4: SmallInt;
  gtype: SmallInt;
  Text: String;
  PText: PChar;
  count :LongInt;
  W: Word;
  Rect ,Rect2: TRect;
  Str: TMemoryStream;
  Graphic: TGraphic;
  PrintEvent: TACERecordPrintEvent;
  art: TAceRecType;
  Val: Boolean;
  ValLong: LongInt;
  LI1,LI2: LongInt;
  PX, PY: Integer;
  TempPen: THandle;
  Color: TColor;
  CheckStyle: TAceCheckStyle;
  DrawType: TAceDrawType;
  PolyType: TAcePolyType;
  Retval: Integer;

  PPoints: ^TPoints;


  function SI_XScale(Value: SmallInt): SmallInt;
  begin
    Result := MulDiv(Value, PX, PixelsPerInchX);
  end;
  function SI_YScale(Value: SmallInt): SmallInt;
  begin
    Result := MulDiv(Value, PY, PixelsPerInchY);
  end;
  function LI_XScale(Value: LongInt): LongInt;
  begin
    Result := MulDiv(Value, PX, PixelsPerInchX);
  end;
  function LI_YScale(Value: LongInt): LongInt;
  begin
    Result := MulDiv(Value, PY, PixelsPerInchY);
  end;
  function RectScale(Rect: TRect): TRect;
  var
    h,w: LongInt;
  begin
    Result.Top := SI_YScale(Rect.Top);
    Result.Left := SI_XScale(Rect.Left);
    h := Rect.Bottom - Rect.Top;
    w := Rect.Right - Rect.Left;
    h := SI_YScale(h);
    w := SI_XScale(w);
    Result.Bottom := Result.Top + h;
    Result.Right := Result.Left + w;
{    Result.Bottom := SI_YScale(Rect.Bottom);
    Result.Right := SI_XScale(Rect.Right);}
  end;
  function SReadRect: TRect;
  begin
    ReadRect(Result);
    Result := RectScale(Result);
  end;
  function SReadSmallIntX: SmallInt;
  begin
    ReadSmallInt(Result);
    Result := SI_XScale(Result);
  end;
  function SReadSmallIntY: SmallInt;
  begin
    ReadSmallInt(Result);
    Result := SI_YScale(Result);
  end;
  function SReadLongIntX: LongInt;
  begin
    ReadLongInt(Result);
    Result := LI_XScale(Result);
  end;
  function SReadLongIntY: LongInt;
  begin
    ReadLongInt(Result);
    Result := LI_YScale(Result);
  end;

  procedure PushTempPen;
  var
    MyObj: TAceAceFileObject;
    lp: TLogPen;
  begin
    if LastPen <> -1 then
    begin
      MyObj := TAceAceFileObject(objects.items[LastPen]);
      Retval := GetObject(MyObj.SelectPen, SizeOf(TLogPen), Addr(lp));
      lp.lopnWidth.x := SI_XScale(lp.lopnWidth.x);
      TempPen := CreatePenIndirect(lp);
      SelectObject(DC, TempPen);
    end;
  end;
  procedure PopTempPen;
  var
    MyObj: TAceAceFileObject;
  begin
    if LastPen <> -1 then
    begin
      MyObj := TAceAceFileObject(objects.items[LastPen]);
      SelectObject(DC, MyObj.SelectPen);
      DeleteObject(TempPen);
    end;
  end;

begin
  PX := GetDeviceCaps(DC, LOGPIXELSX);
  if HorzScale <> 100 then PX := MulDiv(PX, HorzScale, 100);
  PY := GetDeviceCaps(DC, LOGPIXELSY);
  if VertScale <> 100 then PY := MulDiv(PY, VertScale, 100);
  case RecType of
    AceRT_SelectObject:
    begin
      ReadSmallInt(Spot);
      obj := TAceAceFileObject(objects.items[spot]);
      obj.CreateObject(PY);
      case obj.objecttype of
        aotFont:
        begin
          SelectObject(DC, obj.SelectFont);
          SetTextColor(DC, ColorToRGB(obj.Font.Color));
        end;
        aotBrush:
        begin
          SelectObject(DC, obj.SelectBrush);
  {$IFDEF WIN32}
          windows.SetBkColor(DC, ColorToRGB(obj.LogBrush.Color));
  {$ELSE}
          winprocs.SetBkColor(DC, ColorToRGB(obj.LogBrush.Color));
  {$ENDIF}
          if obj.LogBrush.Style = bsSolid then SetBkMode(DC, OPAQUE)
          else SetBkMode(DC, TRANSPARENT);
        end;
        aotPen:
        begin
          SelectObject(DC, obj.SelectPen);
        end;
      end;
      case obj.objecttype of
        aotFont: LastFont := Spot;
        aotBrush: LastBrush := Spot;
        aotPen: LastPen := Spot;
      end;

    end;
    AceRT_StartPage:
    begin
    end;
    AceRT_EndPage:
    begin
    end;
    AceRT_SetTextAlign:
    begin
      ReadWord(W);
  {$IFDEF WIN32}
      windows.SetTextAlign(DC, W);
  {$ELSE}
      winprocs.SetTextAlign(DC, W);
  {$ENDIF}
    end;
    AceRT_TextOut:
    begin
      x := SReadSmallIntX;
      y := SReadSmallIntY;
      ReadString(Text);
  {$IFDEF WIN32}
      windows.TextOut(DC, x, y, @Text[1], Length(Text));
  {$ELSE}
      winprocs.TextOut(DC, x, y, @Text[1], Length(Text));
  {$ENDIF}
    end;
    AceRT_MoveTo:
    begin
      x := SReadSmallIntX;
      y := SReadSmallIntY;
{$IFDEF WIN32}
      windows.MoveToEx(DC, x, y, nil);
{$ELSE}
      winprocs.MoveTo(DC, x, y);
{$ENDIF}
    end;
    AceRT_LineTo:
    begin
      x := SReadSmallIntX;
      y := SReadSmallIntY;
  {$IFDEF WIN32}
      windows.LineTo(DC,x,y);
  {$ELSE}
      winprocs.LineTo(DC,x,y);
  {$ENDIF}
    end;
    AceRT_PTextOut:
    begin
      x := SReadSmallIntX;
      y := SReadSmallIntY;
      ReadLongInt(Count);
      PText := StrAlloc(count + 1);
      try
        ReadPChar(PText, Count);
  {$IFDEF WIN32}
        windows.TextOut(DC, x, y, PText, count);
  {$ELSE}
        winprocs.TextOut(DC, x, y, PText, count);
  {$ENDIF}
      finally
        StrDispose(PText);
      end;
    end;
    AceRT_ExtTextOut:
    begin
      x := SReadSmallIntX;
      y := SReadSmallIntY;

      W := SReadSmallIntX;

      Rect := SReadRect;

      ReadLongInt(Count);
      PText := StrAlloc(count + 1);
      try
        ReadPChar(PText, Count);
  {$IFDEF WIN32}
        windows.ExtTextOut(DC, x, y, W, @Rect, PText, count, nil);
  {$ELSE}
        winprocs.ExtTextOut(DC, x, y, W, @Rect, PText, count, nil);
  {$ENDIF}
      finally
        StrDispose(PText);
      end;
    end;
    AceRT_TextRect:
    begin
      Rect := SReadRect;
      x := SReadSmallIntX;
      y := SReadSmallIntY;
      ReadString(Text);
      W := ETO_CLIPPED;
      if LastBrush <> -1 then
      begin
        obj := TAceAceFileObject(objects.items[LastBrush]);
        obj.CreateObject(PY);
        if obj.LogBrush.Style <> bsClear then Inc(W, ETO_OPAQUE);
      end;

  {$IFDEF WIN32}
      windows.ExtTextOut(DC, x, y, W, @Rect, @Text[1], Length(Text), nil);
  {$ELSE}
      WinProcs.ExtTextOut(DC, x, y, W, @Rect, @Text[1], Length(Text), nil);
  {$ENDIF}
    end;
    AceRT_FillRect:
    begin
      Rect := SReadRect;
      if AceIsScreen(DC) then
      begin
        if Rect.Right <= Rect.Left then Rect.Right := Rect.Left + 1;
        if Rect.Bottom <= Rect.Top then Rect.Bottom := Rect.Top + 1;
      end;
      if LastBrush <> -1 then
      begin
        obj := TAceAceFileObject(objects.items[LastBrush]);
        obj.CreateObject(PY);
  {$IFDEF WIN32}
        windows.FillRect(DC, Rect, obj.SelectBrush);
  {$ELSE}
        WinProcs.FillRect(DC, Rect, obj.SelectBrush);
  {$ENDIF}
      end;


    end;
    AceRT_Rectangle:
    begin
      x1 := SReadSmallIntX;
      y1 := SReadSmallIntY;
      x2 := SReadSmallIntX;
      y2 := SReadSmallIntY;
      PushTempPen;
  {$IFDEF WIN32}
      windows.Rectangle(DC, X1, Y1, X2, Y2);
  {$ELSE}
      WinProcs.Rectangle(DC, X1, Y1, X2, Y2);
  {$ENDIF}
      PopTempPen;
    end;
    AceRT_RoundRect:
    begin
      x1 := SReadSmallIntX;
      y1 := SReadSmallIntY;
      x2 := SReadSmallIntX;
      y2 := SReadSmallIntY;
      x3 := SReadSmallIntX;
      y3 := SReadSmallIntY;

      PushTempPen;
  {$IFDEF WIN32}
      windows.RoundRect(DC, X1, Y1, X2, Y2, x3, y3);
  {$ELSE}
      WinProcs.RoundRect(DC, X1, Y1, X2, Y2, x3, y3);
  {$ENDIF}
      PopTempPen;
    end;
    AceRT_Ellipse:
    begin
      x1 := SReadSmallIntX;
      y1 := SReadSmallIntY;
      x2 := SReadSmallIntX;
      y2 := SReadSmallIntY;
      PushTempPen;
  {$IFDEF WIN32}
      windows.Ellipse(DC, X1, Y1, X2, Y2);
  {$ELSE}
      WinProcs.Ellipse(DC, X1, Y1, X2, Y2);
  {$ENDIF}
      PopTempPen;
    end;
    AceRT_Draw:
    begin
      x := SReadSmallIntX;
      y := SReadSmallIntY;
      ReadSmallInt(gtype);
      Str := TMemoryStream.Create;
      Graphic := nil;
      try
        ReadStream(Str);
        Str.Position := 0;
        Graphic := AceGetGraphic(Str);
        if Graphic <> nil then
        begin
          {// Always stretch draw}
          Rect := Bounds(x,y,SI_XScale(Graphic.Width), SI_YScale(Graphic.Height));
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -