📄 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 printpage3;
procedure printpage4;
procedure printpage5;
procedure PrintPage6;
procedure PrintPage7;
procedure PrintPage8;
procedure Printpage9;
procedure PrintPage10;
procedure PrintPage11;
procedure PrintPage12;
procedure PrintPage15;
procedure printpage14;
procedure printpage13;
procedure PrintpageF3;
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 ;
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;
TextOut(GetPX(vx),GetPy(y)+TextHeight(str)*i+1,LeftStr(str,vlen));
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;
begin
with Printer.Canvas,previewform.adoquery17 do BEGIN
splitPrint(fieldbyname('外墙').asstring,30,30,55,40,55);
splitPrint(fieldbyname('内墙').asstring,30,30,55,58,55);
splitPrint(fieldbyname('顶棚').asstring,30,30,55,74,55);
splitPrint(fieldbyname('地面').asstring,30,30,55,90,55);
splitPrint(fieldbyname('门窗').asstring,30,30,55,108,55);
splitPrint(fieldbyname('厨房').asstring,30,30,55,125,55);
splitPrint(fieldbyname('卫生间').asstring,30,30,60,142,60);
splitPrint(fieldbyname('阳台').asstring,30,30,55,160,55);
splitPrint(fieldbyname('电梯').asstring,30,30,55,175,55);
splitPrint(fieldbyname('其他').asstring,30,30,55,193,55);
end;
END;
procedure printpage5;
var
y:integer;
begin
with Printer.Canvas,previewform.adoquery5 do BEGIN
y:=32;
TextOut(GETPX(30),GETPY(y),fieldbyname('1单价').asstring );
TextOut(GETPX(80),GETPY(y),fieldbyname('1总价币种').asstring );
TextOut(GETPX(110),GETPY(y),fieldbyname('1千万').asstring );
TextOut(GETPX(128),GETPY(y),fieldbyname('1百万').asstring );
TextOut(GETPX(143),GETPY(y),fieldbyname('1十万').asstring );
TextOut(GETPX(160),GETPY(y),fieldbyname('1万').asstring );
y:=40;
TextOut(GETPX(33),GETPY(y),fieldbyname('1千').asstring );
TextOut(GETPX(48),GETPY(y),fieldbyname('1百').asstring );
TextOut(GETPX(63),GETPY(y),fieldbyname('1十').asstring );
TextOut(GETPX(78),GETPY(y),fieldbyname('1元').asstring );
TextOut(GETPX(139),GETPY(50),fieldbyname('2单价币种').asstring );
y:=58;
TextOut(GETPX(43),GETPY(y),fieldbyname('2单价').asstring );
TextOut(GETPX(90),GETPY(y),fieldbyname('2总价币种').asstring );
TextOut(GETPX(120),GETPY(y),fieldbyname('2千万').asstring );
TextOut(GETPX(137),GETPY(y),fieldbyname('2百万').asstring );
TextOut(GETPX(153),GETPY(y),fieldbyname('2十万').asstring );
y:=67;
TextOut(GETPX(25),GETPY(y),fieldbyname('2万').asstring );
TextOut(GETPX(43),GETPY(y),fieldbyname('2千').asstring );
TextOut(GETPX(58),GETPY(y),fieldbyname('2百').asstring );
TextOut(GETPX(73),GETPY(y),fieldbyname('2十').asstring );
TextOut(GETPX(88),GETPY(y),fieldbyname('2元').asstring );
TextOut(GETPX(145),GETPY(75),fieldbyname('3总价币种').asstring );
y:=85;
TextOut(GETPX(25),GETPY(y),fieldbyname('3千万').asstring );
TextOut(GETPX(43),GETPY(y),fieldbyname('3百万').asstring );
TextOut(GETPX(58),GETPY(y),fieldbyname('3十万').asstring );
TextOut(GETPX(73),GETPY(y),fieldbyname('3万').asstring );
TextOut(GETPX(88),GETPY(y),fieldbyname('3千').asstring );
TextOut(GETPX(104),GETPY(y),fieldbyname('3百').asstring );
TextOut(GETPX(118),GETPY(y),fieldbyname('3十').asstring );
TextOut(GETPX(133),GETPY(y),fieldbyname('3元').asstring );
splitPrint(fieldbyname('备注').asstring,30,34,50,94,25);
end;
with Printer.Canvas,previewform.adoquery6 do BEGIN
TextOut(GETPX(54),GETPY(190),fieldbyname('处理方式').asstring );
splitPrint(fieldbyname('1双方自行约定').asstring,30,34,50,207,25);
splitPrint(fieldbyname('2双方自行约定').asstring,30,34,50,225,25);
end;
end;
procedure PrintPage6;
begin
with Printer.Canvas,previewform.adoquery6 do BEGIN
splitPrint(fieldbyname('3双方自行约定').asstring,30,34,50,40,25);
splitPrint(fieldbyname('4双方自行约定').asstring,30,34,50,58,25);
TextOut(GETPX(100),GETPY(120),fieldbyname('利息利率').asstring );
end;
with Printer.Canvas,previewform.adoquery7 do BEGIN
TextOut(GETPX(73),GETPY(225),fieldbyname('付款方式种类').asstring );
end;
end;
procedure PrintPage12;
begin
with Printer.Canvas,previewform.adoquery12 do BEGIN
splitPrint(fieldbyname('133处理方式').asstring,30,34,45,41,25);
end;
with Printer.Canvas,previewform.adoquery13 do BEGIN
splitPrint(fieldbyname('1使用条件').asstring,32,32,45,93,45);
splitPrint(fieldbyname('2使用条件').asstring,32,32,45,102,45);
splitPrint(fieldbyname('3使用条件').asstring,32,32,45,110,45);
splitPrint(fieldbyname('4使用条件').asstring,32,32,45,119,45);
splitPrint(fieldbyname('5使用条件').asstring,32,32,45,127,45);
splitPrint(fieldbyname('1处理方式').asstring,32,32,45,155,45);
splitPrint(fieldbyname('2处理方式').asstring,32,32,45,165,45);
splitPrint(fieldbyname('3处理方式').asstring,32,32,45,173,45);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -