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

📄 custace.pas

📁 suite component ace report
💻 PAS
字号:
unit CustAce;

interface

{$ifdef WIN32}
  uses windows, sysutils, classes, aceout;
{$else}
  uses wintypes, winprocs, sysutils, classes, aceout;
{$endif}


procedure AceCustomTextOut(AceCanvas: TAceCanvas; Rect: TRect; x,y: Integer; Text: String);

implementation

uses acefile, aceutil;

const
  Ace_CustomTextOut = 10200;


procedure AceCustomTextOut(AceCanvas: TAceCanvas; Rect: TRect; x,y: Integer; Text: String);
begin
  AceCanvas.AceOutput.AceFile.WriteType(Ace_CustomTextOut);
  AceCanvas.AceOutput.AceFile.WriteRect(Rect);
  AceCanvas.AceOutput.AceFile.WriteSmallInt(x);
  AceCanvas.AceOutput.AceFile.WriteSmallInt(y);
  AceCanvas.AceOutput.AceFile.WriteString(Text);
end;

{ Get output resolution }
function GetOutputRes(Handle: THandle; AceFile: TAceAceFile): TPoint;
begin
  Result := AceGetResolution(Handle);

  { Scale output resolution if needed }
  if AceFile.HorzScale <> 100 then Result.x := MulDiv(Result.x, AceFile.HorzScale, 100);
  if AceFile.VertScale <> 100 then Result.y := MulDiv(Result.y, AceFile.VertScale, 100);
end;
{ Get resolution Acefile was generated at }
function GetInputRes(AceFile: TAceAceFile): TPoint;
begin
  Result := Point(AceFile.PixelsPerInchX, AceFile.PixelsPerInchY);
end;

{ Generic scaling functions }
function NumScale(Value: LongInt; InPPI,OutPPI: Integer): LongInt;
begin
  Result := MulDiv(Value, OutPPI, InPPI);
end;
function RectScale(Rect: TRect; InRes, OutRes: TPoint): TRect;
begin
  Result.Top := NumScale(Rect.Top, InRes.y, OutRes.y);
  Result.Left := NumScale(Rect.Left, InRes.x, OutRes.x);
  Result.Bottom := Result.Top + NumScale(Rect.Bottom-Rect.Top, InRes.y, OutRes.y);
  Result.Right := Result.Left + NumScale(Rect.Right-Rect.Left, InRes.x, OutRes.x);
end;

procedure AcePrintCustomTextOut(Handle: THandle; AceFile: TAceAceFile);
var
  r: TRect;
  x, y: SmallInt;
  Text: String;
  InRes, OutRes: TPoint;

begin
  { Read the rectangle to print in }
  AceFile.ReadRect(R);
  AceFile.ReadSmallInt(x);
  AceFile.ReadSmallInt(y);
  AceFile.ReadString(Text);

{ New steps starting with Ace version 1.1 that are needed }
  { Get input and output resolutions }
  OutRes := GetOutputRes(Handle, AceFile);
  InRes := GetInputRes(AceFile);

  { You need to scale to output resolution }
  R := RectScale(R, InRes, OutRes);
  x := NumScale(x, InRes.x, OutRes.y);
  y := NumScale(y, InRes.y, OutRes.y);
{ End new steps }

  { You may want to save and restore the Handle from here
    so what you use to print doesn't mess with any of
    my current settings }
  TextOut(Handle, x, y, @Text[1], Length(Text));
end;

initialization
  AceAddRecordType(Ace_CustomTextOut, AcePrintCustomTextOut);

end.

⌨️ 快捷键说明

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