📄 printadounit.pas
字号:
unit PrintAdoUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, DB, ADODB, LbSpeedButton, StdCtrls, StrUtils,
Mask, DBCtrls, OleCtnrs, DBCtrlsEh, Gauges, IniFiles, Printers;
procedure PrintPage2;
procedure PrintPage2_15;
procedure printpage3;
procedure printpage3_14;
procedure printpage4;
procedure PrintPage4_13;
procedure printpage5;
procedure printpage5_12;
procedure PrintPage6;
procedure PrintPage6_11;
procedure PrintPage7;
procedure PrintPage7_10;
procedure PrintPage8;
procedure PrintPage8_9;
procedure Printpage9;
procedure PrintPage10;
procedure PrintPage11;
procedure PrintPage12;
procedure PrintPage15;
procedure printpage14;
procedure printpage13;
procedure PrintpageF3;
procedure Printpage0_F3;
function PrinterPos(iMM: double; XorY: string): integer;
function GetPX(X: Double): Integer;
function GetPY(Y: Double): Integer;
procedure splitPrint(s: string; len, len2, x, y, x2: Integer);
procedure SetDefPrinter(lPrinterIndex: Integer);
function GetDefPrinter: string;
implementation
uses UnitPreview,UNIT3, dm;
function GetDefPrinter: string;
var
pDevice, pDriver, pPort: pChar;
hDMode: THandle;
begin
GetMem(pDevice, cchDeviceName);
GetMem(pDriver, MAX_PATH);
GetMem(pPort, MAX_PATH);
Printer.GetPrinter(pDevice, pDriver, pPort, hDMode);
if lStrLen(pDriver) = 0 then begin
GetProfileString('Devices', pDevice, '', pDriver, MAX_PATH);
pDriver[pos(',', pDriver) - 1] := #0;
end;
if lStrLen(pPort) = 0 then begin
GetProfileString('Devices', pDevice, '', pPort, MAX_PATH);
lStrCpy(pPort, @pPort[lStrLen(pPort) + 2]);
end;
result := string(pdevice);
FreeMem(pDevice, cchDeviceName);
FreeMem(pDriver, MAX_PATH);
FreeMem(pPort, MAX_PATH);
end;
procedure SetDefPrinter(lPrinterIndex: Integer);
var
MyHandle: THandle;
MyDevice,
MyDriver,
MyPort: array[0..255] of Char;
begin
{ set printer to the selected according to the
combobox itemendex }
Printer.PrinterIndex := lPrinterIndex;
{ get our printer properties }
Printer.GetPrinter(MyDevice,
MyDriver,
MyPort,
MyHandle);
{ create string of exactly what WriteProfileString()
wants to see by concat each of the above received
character arrays }
StrCat(MyDevice, ',');
StrCat(MyDevice, MyDriver);
StrCat(MyDevice, ',');
StrCat(MyDevice, MyPort);
{ copy our new default printer into our windows ini file
to the [WINDOWS] section under DEVICE= }
WriteProfileString('WINDOWS',
'DEVICE',
MyDevice);
{ tell all applications that the windows ini file has
changed, this will cause them all to recheck default
printer }
SendMessage(HWND_BROADCAST,
WM_WININICHANGE, 0, LongInt(pChar('windows')));
end;
procedure splitPrint(s: string; len, len2, x, y, x2: Integer);
var
str: string;
slen, slen2, slen3, i, rows, vlen, vx: integer;
begin
str := s;
slen := length(str);
slen2 := length(LeftStr(str, len)); //第一行长度;
slen3 := Length(LeftStr(str, len2)); //第二行长度
if slen > slen2 then begin
rows := (slen - slen2) div slen3 + 1;
if (slen - slen2) mod slen3 > 0 then
rows := rows + 1;
with Printer.Canvas do begin
for i := 0 to rows - 1 do begin
if i = 0 then begin
vx := x; vlen := len;
end
else begin
vx := x2; vlen := len2;
end;
if i=0 then begin
TextOut(GetPX(vx), GetPy(y) + TextHeight(str) * i , LeftStr(str, vlen));
end else begin
TextOut(GetPX(vx), GetPy(y + 10) + TextHeight(str) * i , LeftStr(str, vlen));
end ;
str := AnsiReplaceStr(str, LeftStr(Str, vlen), '');
end;
end;
end
else
Printer.Canvas.TextOut(GetPX(x), GetPy(y), str);
end;
function GetPX(X: Double): Integer;
begin
RESULT := PrinterPos(X, 'X');
end;
function GetPY(Y: Double): Integer;
begin
RESULT := PrinterPos(Y, 'Y');
end;
function PrinterPos(iMM: double; XorY: string): integer;
var
OffestX, OffestY: Double;
PointX, POINTY: Integer;
begin
PointX := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
PointY := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
//得到左端不可打印区域
OffestX := GetDeviceCaps(printer.Handle, PHYSICALOFFSETX) / PointX * 25.4;
//得到上端不可打印区域
OffestY := GetDeviceCaps(printer.Handle, PHYSICALOFFSETY) / PointY * 25.4;
//将打印的位置转换为以像数为单位的宽度,可考虑将Round函数去除
if XorY = 'X' then
Result := round((iMM - OffestX) / 25.4 * PointX); //X
//将打印的位置转换为以像数为单位的高度
if XorY = 'Y' then
Result := round((iMM - OffestY) / 25.4 * PointY); //Y
end;
/////////////////////
procedure PrintpageF3;
var
INI: TINIFILE;
OFX, OFY: Integer;
begin
INI := TIniFile.Create(dm.Currdir + '\OFFSEX.INI');
OFX := INI.ReadInteger('F3', 'OFX', 0);
OFY := INI.ReadInteger('F3', 'OFY', 0);
INI.Free;
with Printer.Canvas, previewform.adoquery17 do begin
splitPrint(fieldbyname('外墙').asstring, 30, 30, 55 + OFX, 40 + OFY, 55 + OFX);
splitPrint(fieldbyname('内墙').asstring, 30, 30, 55 + OFX, 58 + OFY, 55 + OFX);
splitPrint(fieldbyname('顶棚').asstring, 30, 30, 55 + OFX, 74 + OFY, 55 + OFX);
splitPrint(fieldbyname('地面').asstring, 30, 30, 55 + OFX, 92 + OFY, 55 + OFX);
splitPrint(fieldbyname('门窗').asstring, 30, 30, 55 + OFX, 110 + OFY, 55 + OFX);
splitPrint(fieldbyname('厨房').asstring, 30, 30, 55 + OFX, 125 + OFY, 55 + OFX);
splitPrint(fieldbyname('卫生间').asstring, 30, 30, 60 + OFX, 142 + OFY, 60 + OFX);
splitPrint(fieldbyname('阳台').asstring, 30, 30, 55 + OFX, 160 + OFY, 55 + OFX);
splitPrint(fieldbyname('电梯').asstring, 30, 30, 55 + OFX, 175 + OFY, 55 + OFX);
splitPrint(fieldbyname('其他').asstring, 30, 30, 55 + OFX, 193 + OFY, 55 + OFX);
end;
end;
procedure Printpage0_F3;
var
INI: TINIFILE;
OFX, OFY: Integer;
begin
INI := TIniFile.Create(dm.Currdir + '\OFFSEX.INI');
OFX := INI.ReadInteger('F3', 'OFX', 0);
OFY := INI.ReadInteger('F3', 'OFY', 0);
INI.Free;
with Printer.Canvas, form3.adoquery17 do begin
splitPrint(fieldbyname('外墙').asstring, 30, 30, 55 + OFX, 40 + OFY, 55 + OFX);
splitPrint(fieldbyname('内墙').asstring, 30, 30, 55 + OFX, 58 + OFY, 55 + OFX);
splitPrint(fieldbyname('顶棚').asstring, 30, 30, 55 + OFX, 74 + OFY, 55 + OFX);
splitPrint(fieldbyname('地面').asstring, 30, 30, 55 + OFX, 92 + OFY, 55 + OFX);
splitPrint(fieldbyname('门窗').asstring, 30, 30, 55 + OFX, 110 + OFY, 55 + OFX);
splitPrint(fieldbyname('厨房').asstring, 30, 30, 55 + OFX, 125 + OFY, 55 + OFX);
splitPrint(fieldbyname('卫生间').asstring, 30, 30, 60 + OFX, 142 + OFY, 60 + OFX);
splitPrint(fieldbyname('阳台').asstring, 30, 30, 55 + OFX, 160 + OFY, 55 + OFX);
splitPrint(fieldbyname('电梯').asstring, 30, 30, 55 + OFX, 175 + OFY, 55 + OFX);
splitPrint(fieldbyname('其他').asstring, 30, 30, 55 + OFX, 193 + OFY, 55 + OFX);
end;
end;
procedure printpage5;
var
y: integer;
INI: TINIFILE;
OFX, OFY: Integer;
begin
INI := TIniFile.Create(dm.Currdir + '\OFFSEX.INI');
OFX := INI.ReadInteger('P5', 'OFX', 0);
OFY := INI.ReadInteger('P5', 'OFY', 0);
INI.Free;
with Printer.Canvas, previewform.adoquery5 do begin
y := 32;
TextOut(GETPX(30 + OFX), GETPY(y + OFY), fieldbyname('1单价').asstring);
TextOut(GETPX(80 + OFX), GETPY(y + OFY), fieldbyname('1总价币种').asstring);
TextOut(GETPX(110 + OFX), GETPY(y + OFY), fieldbyname('1千万').asstring);
TextOut(GETPX(128 + OFX), GETPY(y + OFY), fieldbyname('1百万').asstring);
TextOut(GETPX(143 + OFX), GETPY(y + OFY), fieldbyname('1十万').asstring);
TextOut(GETPX(160 + OFX), GETPY(y + OFY), fieldbyname('1万').asstring);
y := 40;
TextOut(GETPX(33 + OFX), GETPY(y + OFY), fieldbyname('1千').asstring);
TextOut(GETPX(48 + OFX), GETPY(y + OFY), fieldbyname('1百').asstring);
TextOut(GETPX(63 + OFX), GETPY(y + OFY), fieldbyname('1十').asstring);
TextOut(GETPX(78 + OFX), GETPY(y + OFY), fieldbyname('1元').asstring);
TextOut(GETPX(139 + OFX), GETPY(50 + OFY), fieldbyname('2单价币种').asstring);
y := 58;
TextOut(GETPX(43 + OFX), GETPY(y + OFY), fieldbyname('2单价').asstring);
TextOut(GETPX(90 + OFX), GETPY(y + OFY), fieldbyname('2总价币种').asstring);
TextOut(GETPX(120 + OFX), GETPY(y + OFY), fieldbyname('2千万').asstring);
TextOut(GETPX(137 + OFX), GETPY(y + OFY), fieldbyname('2百万').asstring);
TextOut(GETPX(153 + OFX), GETPY(y + OFY), fieldbyname('2十万').asstring);
y := 67;
TextOut(GETPX(25 + OFX), GETPY(y + OFY), fieldbyname('2万').asstring);
TextOut(GETPX(43 + OFX), GETPY(y + OFY), fieldbyname('2千').asstring);
TextOut(GETPX(58 + OFX), GETPY(y + OFY), fieldbyname('2百').asstring);
TextOut(GETPX(73 + OFX), GETPY(y + OFY), fieldbyname('2十').asstring);
TextOut(GETPX(88 + OFX), GETPY(y + OFY), fieldbyname('2元').asstring);
TextOut(GETPX(145 + OFX), GETPY(75 + OFY), fieldbyname('3总价币种').asstring);
y := 85;
TextOut(GETPX(25 + OFX), GETPY(y + OFY), fieldbyname('3千万').asstring);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -