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

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

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

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

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

1.如何控制纸张的大小?
2.如何控制打印内容在纸张的具体位置?(是否通过控制左边距和高度实现?如何实现)
3.打印机的打印质量的控制.字体的控制.
...全文
193 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)
内容概要:本文研究了基于Q-Learning自适应强化学习的PID控制器在自主水下航行器(AUV)运动控制中的应用,旨在提升其在复杂海洋环境下的控制性能。通过建立AUV的动力学模型,将Q-Learning算法与传统PID控制相结合,实现控制器参数的在线自适应优化,有效增强了系统的响应速度、稳定性和抗干扰能力。研究采用Matlab进行仿真验证,结果表明该方法在轨迹跟踪与姿态控制方面具有优越表现,为水下机器人智能控制提供了可行的技术路径与理论支持。; 适合人群:具备自动控制理论、强化学习或水下机器人建模背景,从事相关科研工作的研究人员、高校研究生及工程技术开发者。; 使用场景及目标:①应用于高精度、强鲁棒性的水下机器人运动控制系统设计;②开展智能PID控制器在非线性、时变系统中的参数自整定研究;③作为强化学习在复杂工业控制场景中落地的典型案例参考,推动算法与工程实践融合。; 阅读建议:建议结合提供的Matlab代码进行仿真实验,重点剖析Q-Learning与PID融合的架构设计、奖励函数设定及参数收敛过程,可进一步拓展至与其他智能优化算法(如DQN、Actor-Critic)的对比研究,深化对自适应控制机制的理解。

5,943

社区成员

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

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