终于可以散200分了!!庆祝一下.顺便提问---------关于打印的问题[参与的都有分]

Mrkang 2005-07-14 03:45:45
长期以来本人一直致力于回答菜鸟问题,终于有一天我发现原来比菜鸟还菜的我成了4条三角裤了,这是对我的最好的奖赏和鼓励.一定努力,不为别的,为了那颗星.以下请看我的菜鸟级问题,以前好象在哪儿建国这方面的资料,忘记在哪儿了.希望大家给点思路

-----------------------------------------------------------------------------------------------------

我想设计一个能够在任何纸型的任何位置打印的程序.没什么思路----------

假如有一张现成的表格,要求在姓名的格里打印上名字而不是手工填写.大致就是这个意思.不知道大家明白否?现在有几个问题

1.如何控制纸张的大小?
2.如何控制打印内容在纸张的具体位置?(是否通过控制左边距和高度实现?如何实现)
3.打印机的打印质量的控制.字体的控制.
...全文
167 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
hthunter 2005-07-15
  • 打赏
  • 举报
回复
顶一下
Mrkang 2005-07-15
  • 打赏
  • 举报
回复
楼上的好象行,回去试一下先
wtg476 2005-07-15
  • 打赏
  • 举报
回复
学习
delphiseabird 2005-07-15
  • 打赏
  • 举报
回复
路过 呵呵

www.coderpub.com
FlyHope2005 2005-07-15
  • 打赏
  • 举报
回复
呵呵;刚做完一个类试的贴来大家看看:
//打印的结构
type
PrintContent=^TContent; //报表信息结构
TContent=record
Inf : String;
PosX : integer;
PosY : integer;
end;


--------------------------
RepFrm:TQuickRep;
FPrintPageWidth:integer; //报表的宽度
FPrintPageHeight:integer; //报表的高度
PrintList:TList; //报表项
------------------------------
function formCmToPix(len: integer): integer; //把毫米单位换成像素





function TTCommPrint.formCmToPix(len: integer): integer;
var
DC:HDC;
dpiSize:integer;
begin
DC:= GetDC(Self.Handle);
dpiSize := GetDeviceCaps(dc,LOGPIXELSX); //分辨率宽
result:= Round(len*(dpiSize/25.4));
end;

//-------------------------------------------------------------------
procedure TTCommPrint.Print(const PrintInf: WideString);
var
tmQRLabel: TQRLabel;
i,j:integer;
begin
j:=35;

RepFrm:= TQuickRep.CreateParented(Self.Handle);

repFrm.Units:=MM;
repFrm.Font.Name:= '宋体';
repFrm.Font.Size:= 10;
repFrm.Page.Length:=FPrintPageHeight;
repFrm.Page.Width:= FPrintPageWidth;

repFrm.Page.BottomMargin:=0; //左右上下边距的设定
repFrm.Page.LeftMargin:=0;
repFrm.Page.RightMargin:=0;
repFrm.Page.TopMargin:=0;

repFrm.Bands.HasTitle:= true;
repFrm.Bands.TitleBand.Height:= FPrintPageHeight;
repFrm.Bands.TitleBand.Width:= FPrintPageWidth;

for i:=0 to PrintList.Count-1 do
begin
tmQRLabel:=TQRLabel.Create(repFrm);
tmQRLabel.Parent:= repFrm.Bands.TitleBand;
tmQRLabel.Caption:=PrintContent(PrintList.Items[i]).Inf;
tmQRLabel.AutoStretch:= true;
tmQRLabel.WordWrap:= true;
tmQRLabel.Left:= formCmToPix(PrintContent(PrintList.Items[i]).PosX);
tmQRLabel.Top:= formCmToPix(PrintContent(PrintList.Items[i]).PosY);
end;
try
RepFrm.Print;
finally
RepFrm.Free;
end;
end;

zhanjiajun 2005-07-15
  • 打赏
  • 举报
回复
D5开发人员指南
里面有各个函数的用法。你自己参考一下,如果没有,我给你一个地址。
constantine 2005-07-15
  • 打赏
  • 举报
回复
hhzqf1980 2005-07-15
  • 打赏
  • 举报
回复
菜鸟帮你顶
paranoia190 2005-07-15
  • 打赏
  • 举报
回复
偶发过好几遍了!顶
78hgdong 2005-07-15
  • 打赏
  • 举报
回复
有点麻烦的写.
Mrkang 2005-07-15
  • 打赏
  • 举报
回复
好.不过楼上的好象是打印窗体内容.如何控制纸型呢,比如在A4纸的指定位置打印,如何做?
zhanjiajun 2005-07-14
  • 打赏
  • 举报
回复
打印,我好像做过,发一个源码来给人吧:
procedure PrintGrid(sGrid: TStringGrid; sTitle: String);

var

X1, X2 : Integer;

Y1, Y2 : Integer;

TmpI : Integer;

F : Integer;

TR : TRect;

begin

Printer.Title:=sTitle;

Printer.BeginDoc;

Printer.Canvas.Pen.Color:=0;

Printer.Canvas.Font.Name:='Times New Roman';

Printer.Canvas.Font.Size:=12;

Printer.Canvas.Font.Style:=[fsBold, fsUnderline];

Printer.Canvas.TextOut(0, 100, Printer.Title);

For F:=1 to sGrid.ColCount-1 do begin

X1:=0;

For TmpI:=1 to (F-1) do

X1:=X1+5*(sGrid.ColWidths[TmpI]);

Y1:=300;

X2:=0;

For TmpI:=1 to F do

X2:=X2+5*(sGrid.ColWidths[TmpI]);

Y2:=450;

TR:=Rect(X1, Y1, X2-30, Y2);

Printer.Canvas.Font.Style:=[fsBold];

Printer.Canvas.Font.Size:=7;

Printer.Canvas.TextRect(TR, X1+50, 350, sGrid.Cells[F, 0]);

Printer.Canvas.Font.Style:=[];

For TmpI:=1 to sGrid.RowCount-1 do begin

Y1:=150*TmpI+300;

Y2:=150*(TmpI+1)+300;

TR:=Rect(X1, Y1, X2-30, Y2);

Printer.Canvas.TextRect(TR, X1+50, Y1+50, sGrid.Cells[F, TmpI]);

end;

end;

Printer.EndDoc;

end;

 

Author: John C Molyneux
打印机的分辨率和在不同分辨率下打印
uses printers;

Windows下的打印分辨对打印程序有着至关重要的作用,如果你想知道

打印机的分辨率,请在程序中加入一行:ShowMessage('水平分辨率'+inttost

r(GetDeviceCaps(printer.Handle,LOGPIXELSX))+chr(13)+'垂直分辨率:'

+inttostr(GetDeviceCaps(printer.Handle,LOGPIXELSY)));结果就一目了

然了。

如何在不同的打印分辨率下面打印?

下面给出一个函数,在调用这个函数之后,你就可以使用Font.Size来设置字
体的大小而与打印机分辨率无关了。

注意必须在Printer.BeginDoc之后调用这个函数!

{-------------------------------------------------------------

Sets the logical dots per inch for the printer and sets the printer axes to point RIGHT
and DOWN. Thus (0,0) is at the top left corner of the page. Returns the page size in
logical coordinates.

Note: Must be called AFTER Printer.BeginDoc.

--------------------------------------------------------------}

function SetPrinterScale(dpi : integer) : TPoint;

var

DeviceDpiX, DeviceDpiY : integer;

begin

with Printer do begin

SetMapMode(Handle, MM_ISOTROPIC);

SetWindowExt(Handle, dpi, dpi);

DeviceDpiX := GetDeviceCaps(Handle, LOGPIXELSX);

DeviceDpiY := GetDeviceCaps(Handle, LOGPIXELSY);

SetViewPortExt(Handle, DeviceDpiX, DeviceDpiY);

Result := Point(PageWidth, PageHeight);

with Canvas do begin

DPtoLP(Handle, Result, 1); { This API call is required... }

Font.PixelsPerInch := DPI; { ...to make this work. (Who knows why?) }

end;

end;

end;
改变打印机的打印端口

uses Printers;

{$IFNDEF WIN32}

const MAX_PATH = 144;

{$ENDIF}

procedure TForm1.Button1Click(Sender: TObject);

var

pDevice : pChar;

pDriver : pChar;

pPort : pChar;

hDMode : THandle;

PDMode : PDEVMODE;

begin

if PrintDialog1.Execute then begin


GetMem(pDevice, cchDeviceName);

GetMem(pDriver, MAX_PATH);

GetMem(pPort, MAX_PATH);

Printer.GetPrinter(pDevice, pDriver, pPort, hDMode);

Printer.SetPrinter(pDevice, PDriver, 'FILE:', hDMode);

FreeMem(pDevice, cchDeviceName);

FreeMem(pDriver, MAX_PATH);

FreeMem(pPort, MAX_PATH);

Printer.BeginDoc;

Printer.Canvas.TextOut(100, 100, 'Delphi Is RAD!');

Printer.EndDoc;

end;

end;

unit MainFrm;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;

type
TForm1 = class(TForm)
Image1: TImage;
procedure FormCreate(Sender: TObject);
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }

public
{ Public declarations }
end;


var
Form1: TForm1;

implementation

{$R *.dfm}


亮剑_ 2005-07-14
  • 打赏
  • 举报
回复
学习
8215358 2005-07-14
  • 打赏
  • 举报
回复
UP
squaref 2005-07-14
  • 打赏
  • 举报
回复
学习·
Mrkang 2005-07-14
  • 打赏
  • 举报
回复
Mrkang 2005-07-14
  • 打赏
  • 举报
回复
kbfmail@163.com
skyewang 2005-07-14
  • 打赏
  • 举报
回复
QReprot也能实现,不过比较麻烦点。
skyewang 2005-07-14
  • 打赏
  • 举报
回复
那么FastReport3绝对能解决你的问题!
要不你给我email,我发给你。
elite01 2005-07-14
  • 打赏
  • 举报
回复
我还不会用
加载更多回复(7)

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧