如何打印memo中的内容(50分)

  • 主题发起人 主题发起人 任远
  • 开始时间 开始时间

任远

Unregistered / Unconfirmed
GUEST, unregistred user!
1、如何直接打印memo中的内容,为什么我用printer.canvas.textout(editor.text);显示[Error] pyjj.pas(350): Incompatible types: 'Integer' and 'TCaption'这样的错误信息?
2、如何将memo的内容直接传递给Fastreport中的memo?
 
1、看看帮助就知道了
procedure TextOut(X, Y: Integer;
const Text: string);
2、没用过fp
 
你得TextOut函数中没有坐标(X和Y)当然报错了,应该是
Printer.Canvas.TextOut( 0 , 0 Editor.Text );
这样应该没问题了,没有打印机,没法试。估计是这里的错误。
 
哦,我是看到DFW上有一贴是跟我这样写的,居然得分了!结果就套用了,没想。。。。
 
我也没用过FP,但是应该不难,我觉得最笨的方法就是将Memo.Lines循环负值不就可以了。
 
Printer.Canvas.TextOut( 0 , 0,Editor.Text );这样程序运行时显示:Printer is not currently Printing.
还有,Fastreport我不知道如何获取一个memo的内容,在语句里这样写:
frrepotr1.memo.text:=form1.memo1.text;应该不行吧?我只会简单地套数据源
 
1、
procedure printmemo(lst:TStrings);
var
i,line:integer;
begin
line:=0;
printer.begin
doc;
for i:=0 to lst.count-1do
begin
printer.canvas.textout(0,line,lst);
line:=line+abs(printer.canvas.font.height);
if (line>=printer.pageheight) then
printer.newpage;
end;
printer.enddoc;
end;
2、
frReport1.FindObject('Memo1').Memo.Text:=Memo1.Text;
 
1.memo的Text属性是Tcaption,不是string.常用的属性是lines,是Tstrings类型的
将你的的一个问题的代码贴全
2.FrReport1.FindObject('Memo19').Memo.Text:=Memo1.Lines.CommaText;
找到对应的memo后赋值.
 
同意vickymade.我想還有就是memo中的內容,該以lines.text,editor.text中的內容改為editor.lines.text
 
第一个问题:
procedure TForm1.Button1Click(Sender: TObject);
var
r: TRect;
i: Integer;
begin
with Printerdo
begin
r := Rect(200,200,(Pagewidth - 200),(PageHeight - 200));
begin
Doc;
Canvas.Brush.Style := bsClear;
for i := 0 to Memo1.Lines.Countdo
Canvas.TextOut(200,200 + (i *
Canvas.TextHeight(Memo1.Lines.Strings)),
Memo1.Lines.Strings);
Canvas.Brush.Color := clBlack;
Canvas.FrameRect(r);
EndDoc;
end;
end;
 
1、 文 本 的 打 印 功 能。DELPHI 中 文 本 的 打 印 功 能 就 如 同 在DOS 中 实 现 文 本 的 打 印 功 能 一 样 容 易, 需 要 做 的 一 切 只 是 取 得 打 印 参 数, 打 开 打 印 机, 然 后 发 送 文 本 的 每 一 行 内 容。 在DELPHI 中 提 供 了 一 个PRINTERS 程 序 单 元, 它 说 明 了 一 个TPRINTER 对 象, 封 装 了WINDOWS 打 印 工 作 和 输 出 打 印 机 之 间 的 接 口, 并 提 供 常 用 的 属 性 和 方 法, 其 中 画 布CANVAS 是 一 个 非 常 有 用 的 属 性, 它 代 表 了 当 前 打 印 文 件 的 表 面, 是 以 图 形 方 式 来 工 作 的, 整 个 的 打 印 输 出 工 作 仅 仅 是 将 你 打 印 的 内 容 输 出 到TPRINTER 的 属 性CANVAS 上, 当 全 部 的 输 出 工 作 完 成 以 后, 打 印 对 象(TPRINTER) 把CANVAS 的 属 性 值 送 到 打 印 机 上 去。
下 面 举 例 来 说 明 如 何 通 过DELPHI 实 现 文 本 内 容 的 打 印。 在DELPHI 中 提 供 了PRINTDIALOG、PRINTERSETUPDIALOG 两 个 控 件 允 许 我 们 进 行 打 印 机 以 及 其 他 影 响 打 印 输 出 的 选 择, 此 外 最 重 要 的 一 点 是 要 想 实 现 打 印 功 能 必 须 在 编 译 程 序 以 前 将PRINTERS 加 入 到INTERFACE 或 者IMPLEMENTATION 的UESE 语 句 当 中, 因 为PRINTER 单 元 包 括ASSIGNPRN 和 其 他 控 制 打 印 机 的 过 程。
首 先 在FORM 当 中 加 入MEMO、PRINTDIALOG、PRINTERSETUPDIALOG 和 两 个BUTTON 控 件, 两 个 BUTTON 的CAPTION 分 别 为“ 打 印 设 置” 和“ 打 印”。 然 后 编 写BUTTON 的 事 件 驱 动 程 序( 代 码 在 下 面), 这 个 简 单 的 例 子 中 只 要 单 击“ 打 印” 按 钮 时 便 可 以 在 打 印 机 上 输 出 文 件0S2.TXT, 打 印 事 件 的 清 单 如 下:
implementation
uses printers;
{$R *.DFM}

procedure TForm1.BitBtn1Click(Sender: TObject);
begin

printersetupdialog1.execute;
//选择输出的打印机以及其他打印控制选项
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
var
lines:integer;
prntext:system.text;

//将PRNTEXT声名为一个在SYSTEM程序单元当中定义的文本文件
begin

if printdialog1.execute then

assignprn(prntext);
//将PRNTEST分配给打印机
rewrite(prntext);
//调用REWRITE函数,为输出打开已分配的文件
printer.canvas.font:=memo1.font;

//把当前MEMO1的字体指定给打印对象的CANVAS的字体属性
for lines:=0 to memo1.lines.count-1do

writeln(prntext,memo1.lines[lines]);
//把MEMO的内容写到打印机对象
system.close(prntext);
//关闭打印文件
end;


procedure TForm1.FormCreate(Sender: TObject);
begin

memo1.lines.loadfromfile('c:/dos/os2.txt');
//在FORM建立时读入C:/DOS/OS2.TXT文件
end;

end.
2、 图 形 的 打 印 功 能, 简 单 的 图 形 打 印 功 能 也 如 打 印 文 本 一 样 的 容 易, 只 是 告 诉 打 印 机 对 象(TPRINTER) 开 始 打 印, 把 图 形 简 单 的 复 制 到 打 印 机 上 去, 最 后 告 诉 打 印 机 结 束 打 印 工 作。
举 例 说 明: 将 上 面 的 例 子 的MEMO 控 件 换 成IMAGE 控 件, 再 经 过 一 些 简 单 的 修 改, 图 形 打 印 的 代 码 如 下:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin

if printdialog1.execute then
begin

printer.begin
doc;
printer.canvas.draw(0,0,image1.picture.graphic);
printer.enddoc;
end;

end;
在 这 种 情 况 下, 使 用 的 是 打 印 机 的 分 辨 率, 图 形 在 页 面 的 左 上 角 开 始 打 印 输 出, 打 出 的 图 形 很 小, 在 很 多 的 情 况 下 不 能 符 合 要 求, 但 是 打 印 机 画 布CANVAS 的STRETHDRAW 的 方 法, 可 以 让 我 们 对 图 形 进 行 灵 活 的 处 理, 画 布(CANVAS) 的STRETCHDRAW 方 法 声 名 为:
procedure StretchDraw(const Rect: TRect;
Graphic: TGraphic);
其中的RECT参数代表图形输出区域的大小,TRECT的类型声名为:
TRect = record
case Integer of
0: (Left, Top, Right, Bottom: Integer);
1: (TopLeft, BottomRight: TPoint);
end;
因 此 我 们 只 要 调 整RECT 的 大 小 及 其 在 打 印 页 面 上 的 位 置, 进 而 达 到 自 己 满 意 的 效 果, 下 面 的 代 码 是 不 断 的 放 大 图 形, 充 满 我 们 定 义 的 矩 形 区 域, 并 将 其 定 位 在 打 印 机 画 布(CANVAS) 的 中 央 进 行 输 出。 代 码 如 下:
procedure TForm1.Button1Click(Sender: TObject);
VAR
strect:Trect;
//定义打印输出矩形框的大小
temhi,temwd:integer;
begin

if printdialog1.execute then

begin

temhi:=image1.picture.height;
temwd:=image1.picture.width;
while (temhi printer.pageheight div 2)and
//将图形放大到打印页面的1/2大小
(temwd printer.pagewidth div 2) do

begin

temhi:=temhi+temhi;
temwd:=temwd+temwd;
end;

with strectdo
//定义图形在页面上的中心位置输出
begin

left:=(printer.pagewidth -temwd) div 2;
top:=(printer.pageheight-temhi) div 2;
right:=left+temwd;
bottom:=top+temhi;
end;

with printerdo

begin

begin
doc;
canvas.stretchdraw(strect,image1.picture.graphic);

//将放大的图形向打印机输出
enddoc;
end;
end;

end;

 
谢谢大家,我刚才试了App2001的方法,能打印出来!别的还未试,试过给分!
可能是自己没把问题描述清楚,是因为我的memo中使用字体设定,而用memo.lines.savetofile保存到文件后,用记事本打开显示与memo中显示的不一样,主要是行间对不齐,所以我想将memo中照原样打印出来!刚才试了app2001的方法,行间仍有对不齐的情况。
注:字体设定
var h:HFont;
begin
memo1.Lines.LoadFromFile(opendialog1.filename);
h := CreateFont(16,8,0,0,0,0,0,0,0,0,0,0,0,'宋体');
if( h = 0 ) then
RaiseLastWin32Error();
memo1.Font.Handle := h;
end;

实际情况如下,以下在memo里显示是对齐的:
ér shè jì de ɡōnɡ jù
而 设 计 的 工 具 !
 
你可以到DELPHI灌水論壇里搜尋一下,有好多這方面的貼子
 
考!楼上的几位说的实在有够详细
偶实在是不知道再说些什么了,呵呵
 
多人接受答案了。
 
后退
顶部