关于stringgrid的打印!(10分)

  • 主题发起人 回音壁
  • 开始时间

回音壁

Unregistered / Unconfirmed
GUEST, unregistred user!
我做的一个超市小票打印程序里!
打印小票用的是stringgrid控件写进write打印出来的!可惜每次只能打印第一条
记录。
这个程序我暂时还没有写出来!呵呵![:D][:D]
我想等我想到前有各位兄弟帮帮我!
似乎inc函数不管用!
 
难道你就不会拿For循环试试?StringGrid说白了就是一个数组
 
for循环好象不行啊?
你们看我的一个示例代码!
procedure TForm1.Button3Click(Sender: TObject);
var
y,r:integer;
begin

Printer.BeginDoc;
with Printer.Canvas do
begin

Font.Name := '隶书';
font.Style:=[fsbold];
Font.Size := 16;
TextOut(100,1,' . ');
Font.Size := 10;
TextOut(120,220,'商品编号 商品名称 尺码 颜色 数量 金额');
r:=1;
y:=60;
while bookgrid.Cells[0,r]<>'' do
begin
textout(100,250+y,bookgrid.Cells[1,r]);
textout(340,250+y,bookgrid.Cells[2,r]);
textout(620,250+y,bookgrid.Cells[3,r]);
textout(710,250+y,bookgrid.Cells[4,r]);
inc(y,60);
inc(r);
end;
end;
printer.EndDoc;
end;
这样不行,还是只打印一个表头.
而这样呢?
procedure TForm1.Button3Click(Sender: TObject);
var
y,r:integer;
begin

Printer.BeginDoc;
with Printer.Canvas do
begin

Font.Name := '隶书';
font.Style:=[fsbold];
Font.Size := 16;
TextOut(100,1,' . ');
Font.Size := 10;
TextOut(120,220,'商品编号 商品名称 尺码 颜色 数量 金额');
r:=1;
y:=1;
while bookgrid.Cells[0,r]<>'' do
begin
for y:=1 do bookgrid.row do
for r:=1 do bookgrid.row do
textout(100,250+60*y,bookgrid.Cells[1,r]);
textout(340,250+60*y,bookgrid.Cells[2,r]);
textout(620,250+60*y,bookgrid.Cells[3,r]);
textout(710,250+60*y,bookgrid.Cells[4,r]);
end;
end;
printer.EndDoc;
end;
还是不行?
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1500565
 
用report machine控件吧。第三方的,很好用的。
 
你的循环控制有问题吧?
你把while bookgrid.Cells[0,r]<>'' do这句话换掉,我认为你是循环控制不对
或打印机设置有问题
 
while bookgrid.Cells[0,r]<>'' do //这句话就是只循环第一行的内容呀,
改成
while bookgrid.cells[p,q]<>'' do//要两个呀,一共有p-1行,q-1列呀,
//你的只是循环打印了第一行的东西呀
//还有你的第二中方法的for语句写错了吧,好象不是你直接重原代码中拷的,
//for y:=1 do bookgrid.row do //前一个应该为to吧 不知道应不应该是row-1
// for r:=1 do bookgrid.row do
 
这个代码是我从另一个帖子上抄的!
好象即使改了还是不行,还是只能打印一行?
原代码在这里:
procedure TfrmSale.btnPrnClick(Sender: TObject);
var
y,r : integer;
fpe : Boolean; //发票额是否已记入明细中
begin

fpe := False;
if not InitPrinter then
begin
Application.MessageBox('未安装打印机或打印机驱动程序丢失,请与系统管理员联系!', '出错', mb_IconError + mb_OK);
Exit;
end;
SetPaperSize(1200,1400);
//打印文本
try
Printer.BeginDoc;
with Printer.Canvas do
begin
DM.ADSlsd.First;
Font.Name := '宋体';
Font.Size := 16;
TextOut(TX(100),TY(1),' . ');
TextOut(TX(350),TY(20),lsdname);
Font.Size := 10;
TextOut(TX(140),TY(130),'票号:' + edtxpbh.Text );
TextOut(TX(450),TY(130),formatdatetime('yyyy/mm/dd hh:mm',Now));
TextOut(TX(780),TY(130),'操作员:' + czy);
Printer.BeginDoc;
with Printer.Canvas do
begin
DM.ADSlsd.First;
Font.Name := '宋体';
Font.Size := 16;
TextOut(TX(100),TY(1),' . ');
TextOut(TX(350),TY(20),lsdname);
Font.Size := 10;
TextOut(TX(140),TY(130),'票号:' + edtxpbh.Text );
TextOut(TX(450),TY(130),formatdatetime('yyyy/mm/dd hh:mm',Now));
TextOut(TX(780),TY(130),'操作员:' + czy);
TextOut(TX(100),TY(170),'━━━━━━━━━━━━━━━━━━━━━━━━━━');
TextOut(TX(120),TY(220),'商品编号 商品名称 尺码 颜色 数量 金额');
TextOut(TX(100),TY(260),'--------------------------------------------------');

TextOut(TX(100),TY(170),'━━━━━━━━━━━━━━━━━━━━━━━━━━');
TextOut(TX(120),TY(220),'商品编号 商品名称 尺码 颜色 数量 金额');
TextOut(TX(100),TY(260),'--------------------------------------------------');
r := 1;
y := 60;
while sgsp.Cells[0,r] <> '' do
begin
TextOut(TX(100),TY(250 + y),sgsp.Cells[0,r]);
TextOut(TX(340),TY(250 + y),sgsp.Cells[1,r]);
TextOut(TX(620),TY(250 + y),sgsp.Cells[3,r]);
TextOut(TX(710),TY(250 + y),sgsp.Cells[2,r]);
TextOut(TX(830),TY(250 + y),sgsp.Cells[10,r]);
TextOut(TX(910),TY(250 + y),sgsp.Cells[12,r]);
inc(r);
inc(y,60);
end;
// TextOut(TX(140),TY(220),'');
// TextOut(TX(140),TY(220),'');
// TextOut(TX(140),TY(220),'');
// TextOut(TX(140),TY(220),'');
// TextOut(TX(140),TY(220),'');
TextOut(TX(100),TY(760),'━━━━━━━━━━━━━━━━━━━━━━━━━━');
TextOut(TX(100),TY(800),'应收:' + FormatCurr('0.00',ysk));
TextOut(TX(350),TY(800),'实收:' + FormatCurr('0.00',edtss.Value));
TextOut(TX(580),TY(800),'现金:' + FormatCurr('0.00',edtxj.Value));
TextOut(TX(820),TY(800),'回找:' + FormatCurr('0.00',edtZl.Value));

TextOut(TX(120),TY(900),DM.ADSlsd.Fieldbyname('Fend1').AsString);
TextOut(TX(120),TY(950),DM.ADSlsd.Fieldbyname('Fend2').AsString);

TextOut(TX(100),TY(1000),'━━━━━━━━━━━━━━━━━━━━━━━━━━');
TextOut(TX(120),TY(1030),'让您满意是我们最大的心愿');
end;
Printer.EndDoc;
DM.ADOConnection1.BeginTrans ;

if edtbh.Text <> '' then
begin
with DM.ADShy do
begin
if Locate('Fbh',edtbh.Text,[]) then
begin
Edit;
FieldValues['Fjf'] := FieldValues['Fjf'] + fz;
FieldValues['Fxfje'] := FieldValues['Fxfje'] + edtss.Value;
FieldValues['Flastxfd'] := DM.ADSlsd.Fieldbyname('Fname').AsString;
FieldValues['Flastxfr'] := date;
FieldValues['Flastxfe'] := edtss.Value;
Post;
end;
end;
end;

r := 1;
try
while sgsp.Cells[0,r] <> '' do
begin
with DM.ADSsale do
begin
Append;
FieldByName('Frq').AsDateTime := Date;
FieldByName('Fsj').AsDateTime := Time;
FieldByName('Ffph').AsString := edtxpbh.Text;
FieldByName('Fgroup').AsString := cbgz.Text;
FieldByName('Flsj').AsCurrency := strtocurr(sgsp.Cells[13,r]);
if stxm.Caption <> '' then
FieldByName('Fhybh').AsString := edtbh.Text;
FieldByName('Fspbh').AsString := sgsp.Cells[0,r];
FieldByName('Fsl').AsInteger := strtoint(sgsp.Cells[10,r]);
FieldByName('Fdj').AsCurrency := strtocurr(sgsp.Cells[8,r]);
FieldByName('Fkh').AsString := sgsp.Cells[5,r];
if sgsp.Cells[11,r] <> '' then
FieldByName('Fzk').AsInteger := strtoint(sgsp.Cells[11,r]);
FieldByName('Fje').AsCurrency := strtocurr(sgsp.Cells[12,r]);
if Not fpe then
begin
FieldByName('Ffpe').AsCurrency := edtss.Value;
fpe := True;
end
else begin
FieldByName('Ffpe').AsCurrency := 0;
end;
FieldByName('Fczy').AsString := '';
Post;
end;
inc(r);
end;
DM.ADOConnection1.CommitTrans;
clrall;
except
DM.ADOConnection1.RollbackTrans;
Application.MessageBox('入库错误,请清除后重新打印本销售单。','警告',MB_OK);
raise;
end;
except
Application.MessageBox('打印出错,请清除后重新打印本销售单。','警告',MB_OK);
end;
end;


因为它的结构很浅显易懂,我打算模仿模仿,但是就是不行!
 
Printer.BeginDoc;
with Printer.Canvas do
begin

Font.Name := '隶书';
font.Style:=[fsbold];
Font.Size := 16;
TextOut(100,1,' . ');
Font.Size := 10;
TextOut(120,220,'商品编号 商品名称 尺码 颜色 数量 金额');
r:=1;
y:=1;
begin
for y:=1 to bookgrid.row do
for r:=1 to bookgrid.row do
textout(100,250+60*y,bookgrid.Cells[1,r]);
textout(340,250+60*y,bookgrid.Cells[2,r]);
textout(620,250+60*y,bookgrid.Cells[3,r]);
textout(710,250+60*y,bookgrid.Cells[4,r]);
end;
end;
printer.EndDoc;
似乎这样也不行,出错提示:for循环控制变量必须是简单局部变量!
 
哈哈哈,哈哈哈,
你的循环,你自己看好了,例如当y=1时应该有bookgrid.row次循环打印吧,
可是他们都是打印在100,250+60*y的地方的,此时y是1,也就是说下一次打印的东西把上次的覆盖了呀
要是测试的话干吗不用个memo或者输出到一个文件中呢?
其他的我没有仔细看,我想你最好把他改一下吧
 
对了,还有问题:
begin
for y:=1 to bookgrid.row do
for r:=1 to bookgrid.row do
begin //这是我加的,要不然只循环下面的第一个textout
textout(100,250+60*y,bookgrid.Cells[1,r]);
textout(340,250+60*y,bookgrid.Cells[2,r]);
textout(620,250+60*y,bookgrid.Cells[3,r]);
textout(710,250+60*y,bookgrid.Cells[4,r]);
end;//两个循环结束
end;
 
对了,还有问题:
begin
for y:=1 to bookgrid.row do
for r:=1 to bookgrid.row do
begin //这是我加的,要不然只循环下面的第一个textout
textout(100,250+60*y,bookgrid.Cells[1,r]);
textout(340,250+60*y,bookgrid.Cells[2,r]);
textout(620,250+60*y,bookgrid.Cells[3,r]);
textout(710,250+60*y,bookgrid.Cells[4,r]);
end;//两个循环结束
end;

//////惭愧,搞的我自己都乱了,写错了,不要看,这样不是正确的,
 
你说的都是一些小问题,现在都不能编译过去.
还是上面的那些错误提示!
 
我知道了,
正确的应该这样,
y:=1;
for r:=1 to bookgrid.row do
begin
textout(100,250+60*y,bookgrid.Cells[1,r]);
textout(340,250+60*y,bookgrid.Cells[2,r]);
textout(620,250+60*y,bookgrid.Cells[3,r]);
textout(710,250+60*y,bookgrid.Cells[4,r]);
Inc(y);
end;
如果还错的话拨打我的QQ,22045274
 
顶部