我有一個套入打印程式,現調試好表頭,明細內容卻在表頭上面,它不是接在表頭下面開始列印而是從紙張的第一行開始列印。代碼如下,請幫忙糾正:
procedure TMainForm.PrintLine(Items: TStringList);
var
OutRect: TRect;
Inches: double;
i: integer;
begin
OutRect.Left := 0;
OutRect.Top :=AmountPrinted;
OutRect.Bottom := OutRect.Top + LineHeight;
With Printer.Canvas do
for i := 0 to Items.Count - 1 do
begin
Inches := longint(Items.Objects[i]) * 0.1;
OutRect.Right := OutRect.Left + round(PixelsInInchx*Inches);
if not Printer.Aborted then
TextRect(OutRect, OutRect.Left, OutRect.Top, Items[i]);
OutRect.Left := OutRect.Right;
end;
AmountPrinted := AmountPrinted+ TenthsOfInchPixelsY*2;
end;procedure TMainForm.PrintClick(Sender: TObject);
var
Items: TStringList;
begin
Items := TStringList.Create;
try
PixelsInInchx := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
TenthsOfInchPixelsY := GetDeviceCaps(Printer.Handle,
LOGPIXELSY) div 10;
AmountPrinted := 0;
MainForm.Enabled := false; // Disable the parent form
try
Printer.BeginDoc;
AbortForm.Show;
Application.ProcessMessages;
LineHeight := Printer.Canvas.TextHeight('X')+TenthsOfInchPixelsY;
if edtHeaderFont.Text <> '' then
Printer.Canvas.Font.Name:='宋体';
Printer.Canvas.Font.Size:=12;
Printer.Canvas.TextOut(100,400,edit1.text);
Printer.Canvas.TextOut(100,460,edit2.text);
Printer.Canvas.TextOut(200,520,edit3.text);
Printer.Canvas.TextOut(800,520,edit4.text);
Printer.Canvas.TextOut(1600,520,edit5.text);
PrintColumnNames;
ADOTable1.First;
while (not ADOTable1.Eof) or Printer.Aborted do
begin Application.ProcessMessages;
with Items do
begin
AddObject(ADOTable1.FieldByName('fallorder_code').AsString,
pointer(10));
AddObject(ADOTable1.FieldByName('fallorder_name').AsString,
pointer(10));
AddObject(ADOTable1.FieldByName('fallorder_dec').AsString,
pointer(10));
AddObject(ADOTable1.FieldByName('fallorder_num').AsString,
pointer(10));
AddObject(ADOTable1.FieldByName('fallorder_customer').AsString,
pointer(10));
AddObject(ADOTable1.FieldByName('fallorder_memo').AsString,
pointer(10));
end;
PrintLine(Items);
if AmountPrinted + LineHeight > Printer.PageHeight then
begin
AmountPrinted := 0;
if not Printer.Aborted then
Printer.NewPage;
Printer.Canvas.Font.Name:='宋体';
Printer.Canvas.Font.Size:=12;
Printer.Canvas.TextOut(100,400,edit1.text);
Printer.Canvas.TextOut(100,460,edit2.text);
Printer.Canvas.TextOut(200,520,edit3.text);
Printer.Canvas.TextOut(800,520,edit4.text);
Printer.Canvas.TextOut(1600,520,edit5.text);
PrintColumnNames;
end;
Items.Clear;
ADOTable1.Next;
end;
AbortForm.Hide;
if not Printer.Aborted then
Printer.EndDoc;
finally
MainForm.Enabled := true;
end;
finally
Items.Free;
end;
end;
procedure TMainForm.PrintLine(Items: TStringList);
var
OutRect: TRect;
Inches: double;
i: integer;
begin
OutRect.Left := 0;
OutRect.Top :=AmountPrinted;
OutRect.Bottom := OutRect.Top + LineHeight;
With Printer.Canvas do
for i := 0 to Items.Count - 1 do
begin
Inches := longint(Items.Objects[i]) * 0.1;
OutRect.Right := OutRect.Left + round(PixelsInInchx*Inches);
if not Printer.Aborted then
TextRect(OutRect, OutRect.Left, OutRect.Top, Items[i]);
OutRect.Left := OutRect.Right;
end;
AmountPrinted := AmountPrinted+ TenthsOfInchPixelsY*2;
end;procedure TMainForm.PrintClick(Sender: TObject);
var
Items: TStringList;
begin
Items := TStringList.Create;
try
PixelsInInchx := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
TenthsOfInchPixelsY := GetDeviceCaps(Printer.Handle,
LOGPIXELSY) div 10;
AmountPrinted := 0;
MainForm.Enabled := false; // Disable the parent form
try
Printer.BeginDoc;
AbortForm.Show;
Application.ProcessMessages;
LineHeight := Printer.Canvas.TextHeight('X')+TenthsOfInchPixelsY;
if edtHeaderFont.Text <> '' then
Printer.Canvas.Font.Name:='宋体';
Printer.Canvas.Font.Size:=12;
Printer.Canvas.TextOut(100,400,edit1.text);
Printer.Canvas.TextOut(100,460,edit2.text);
Printer.Canvas.TextOut(200,520,edit3.text);
Printer.Canvas.TextOut(800,520,edit4.text);
Printer.Canvas.TextOut(1600,520,edit5.text);
PrintColumnNames;
ADOTable1.First;
while (not ADOTable1.Eof) or Printer.Aborted do
begin Application.ProcessMessages;
with Items do
begin
AddObject(ADOTable1.FieldByName('fallorder_code').AsString,
pointer(10));
AddObject(ADOTable1.FieldByName('fallorder_name').AsString,
pointer(10));
AddObject(ADOTable1.FieldByName('fallorder_dec').AsString,
pointer(10));
AddObject(ADOTable1.FieldByName('fallorder_num').AsString,
pointer(10));
AddObject(ADOTable1.FieldByName('fallorder_customer').AsString,
pointer(10));
AddObject(ADOTable1.FieldByName('fallorder_memo').AsString,
pointer(10));
end;
PrintLine(Items);
if AmountPrinted + LineHeight > Printer.PageHeight then
begin
AmountPrinted := 0;
if not Printer.Aborted then
Printer.NewPage;
Printer.Canvas.Font.Name:='宋体';
Printer.Canvas.Font.Size:=12;
Printer.Canvas.TextOut(100,400,edit1.text);
Printer.Canvas.TextOut(100,460,edit2.text);
Printer.Canvas.TextOut(200,520,edit3.text);
Printer.Canvas.TextOut(800,520,edit4.text);
Printer.Canvas.TextOut(1600,520,edit5.text);
PrintColumnNames;
end;
Items.Clear;
ADOTable1.Next;
end;
AbortForm.Hide;
if not Printer.Aborted then
Printer.EndDoc;
finally
MainForm.Enabled := true;
end;
finally
Items.Free;
end;
end;
解决方案 »
- 关于键盘hook
- installshield for borland制作中文安装程序探讨
- 數據庫還原怎麼這麼麻煩呀,腦殼都想爛了,還搞不定?!!!!
- FastReport怎么实现大表套小表(一对多的关系),分栏
- 如何做大图标的工具栏?
- 进行Excel操作的时候,如何进行分页?
- 怎样动态创建一个tabsheet,并使其显示一个已存在的form内容?
- 怎样用程序打开带密码的DB数据表?
- 我想在发布时将Bpl安装在指定目录如c:\comm,该如何处理,高手请进
- 哪位高手能告诉我:用主/细表、TABLE的LOOKUP字段、QUERY的查找字段建立的数据库连接在实际应用中有什么区别?
- 关于控件属性的问题
- 求开N次方根函数
这个过程有问题吧。不就是些坐标吗?你自己看清楚不就行了,纵坐标由小到大代表由上到下。
设几个断点,一下就查出来了。
http://www.chinahdc.com/download/software/pjprint.rar
begin
...
OutRect.Top :=AmountPrinted;
...
end;似乎应该写成OutRect.Top:=AmountPrinted+XXXX;
XXXX是一个数字,由于你的表头是在520的高度处画的,要使数据画到表头下面,这个数字要大于520,可以自己调整,也可以用520+Printer.Canvas.TextHeight('xxx')的方式来计算。
....
PrintLine(Items);
if AmountPrinted + LineHeight+1000 > Printer.PageHeight then
begin
AmountPrinted := 0;
if not Printer.Aborted then
Printer.NewPage;
....
怎麼不能自動分頁,我現在的列出來的格式是:
料號 品名規格 數量 單位 交貨日期
0001 ****1 ***AAA 1 PCS ********
0002 ****2 ***BBB 1 PCS ********
我想它顯示成
料號 品名規格 數量 單位 交貨日期
0001 ****1 1PCS ********
***AAA
0002 ****2 1PCS *********
***BBB
也就是品名規格分兩欄,數量與單位合成一列,一頁列印15行後自動分頁。請指教