高分 500 -- 连续打印(急)--谢绝灌水(300分)

  • 主题发起人 主题发起人 R_Baggio
  • 开始时间 开始时间
R

R_Baggio

Unregistered / Unconfirmed
GUEST, unregistred user!
本人使用的是ESPON支持连续打印的打印机
现在想实时输出数据(类似心电图),也是就图象输出要连续!
我使用的是 printer.canvas.....方法。
请问有什么办法!
 
说清楚一点你是怎样不行的嘛,我们怎么知道你已经做到哪一步了?
 
就是我现在会自动分页!(printer.enddoc)
打印出来的心电图不连续!
 
我想打印连续的图,就是有数据就输出打印,打印的图要连续!
 
把打印机的送纸方式设为自动送纸或用送纸即可,打印程序可以不用修改,
只要在begin
doc 和enddoc 之间有足够的数据。
 
以上都不行,必须直接操作端口,我有在WIN9X下可以实现的DEMO,要吗?
 
自己定义纸张的大小。
procedure Tdm1.UpdatePrint(Awidth, Aheight: integer;
isrect: boolean);

function Win95SetForm(PDevMode: PDeviceMode): Boolean;
begin
Printer.PrinterIndex := Printer.PrinterIndex;
PDevMode.dmFields := PDevMode.dmFields or DM_PAPERSIZE;
PDevMode.dmPaperSize := 256;
PDevMode.dmFields := PDevMode.dmFields or DM_PAPERWIDTH;
PDevMode.dmPaperWidth := AWidth;
PDevMode.dmFields := PDevMode.dmFields or DM_PAPERLENGTH;
PDevMode.dmPaperLength := AHeight;
PDevMode.dmFields := PDevMode.dmFields or DMBIN_MANUAL;
// PDevMode.dmDefaultSource := DMBIN_MANUAL;
Printer.PrinterIndex := Printer.PrinterIndex;
Result := True;
end;

function WinNTSetForm(PDevMode: PDeviceMode;
Device: PChar;
Port: PChar): Boolean;
var
hPrinter: THandle;
pForm: Pointer;
cbNeeded: DWORD;
cReturned: DWORD;
FormInfo1: TFormInfo1;
begin
Result := False;
if OpenPrinter(Device, hPrinter, nil) then
begin
pForm := nil;
EnumForms(hPrinter, 1, pForm, 0, cbNeeded, cReturned);
GetMem(pForm, cbNeeded);
//取pForm的大小并分配内存
try
if EnumForms(hPrinter, 1, pForm, cbNeeded, cbNeeded, cReturned) then
begin
if DeleteForm(hPrinter, PChar(CustomFormName)) then
Dec(cReturned);
//删除旧的Form
with FormInfo1do
begin
Flags := 0;
pName := PChar(CustomFormName);
Size.cx := AWidth * 100;
Size.cy := AHeight * 100;
with ImageAbleAreado
begin
Left := 0;
Top := 0;
Right := Size.cx;
Bottom := Size.cy;
end;
end;

if AddForm(hPrinter, 1, @FormInfo1) then
begin

Printer.PrinterIndex := Printer.PrinterIndex;
PDevMode.dmFields := PDevMode.dmFields or DM_PAPERSIZE;
// PDevMode.dmFields := PDevMode.dmFields or DMBIN_MANUAL;
PDevMode.dmPaperSize :=cReturned + 1;
PDevMode.dmFormName:=CustomFormName;
Printer.PrinterIndex := Printer.PrinterIndex;
Result := True;
end;
end;
finally
FreeMem(pForm);
end;
end;
end;
var
Device, Driver, Port: array[0..127] of char;
hDevMode: THandle;
PDevMode: PDeviceMode;
begin
Printer.PrinterIndex := Printer.PrinterIndex;
Printer.GetPrinter(Device, Driver, Port, hDevMode);
if hDevMode <> 0 then
begin
PDevMode := GlobalLock(hDevMode);
try
if isrect then
PDevMode^.dmorientation := dmorient_landscape
else
PDevMode^.dmorientation := dmorient_portrait;
if (Win32Platform = VER_PLATFORM_WIN32s) or
(Win32Platform = VER_PLATFORM_WIN32_WINDOWS) then
Win95SetForm(PDevMode)
else
if Win32Platform = VER_PLATFORM_WIN32_NT then
WinNTSetForm(PDevMode, Device, Port);
Printer.SetPrinter(Device, Driver, Port,hDevMode);
finally
GlobalUnlock(hDevMode);
end;
end ;

end;
 
对于这个问题应该采用比较低级的编程接口,因为在Windows中打印都是以页为单位的,虽然你可以自己设置纸张的大小,但在打印进行中是不能改变页面设置的。如果你用过Dos编程的话,问题就很好解决了。
 
如果只是打印心电图类似的曲线,问题就很好解决,比如epson系列的打印机可以使用他的
esc/pk命令集,其实也很简单。
给分!!!!
 
我的DEMO发不出去了。
 
TO lxggc, 我没有找到命令函数,我的是TM88.
TO duancy, 发到我的信箱啊!r9_baggio@163.net
问题解决了我当然给分啊!
 
TO lxggc,给个DEMO啊!
 
我现在是这样做的!
for i := 0 to 100do
begin
printer.begin
doc;
....... printer.canvas.moveto(....)
........画表格,打印数据
printer.enddoc;//问题在这里,会自动分页,造成心电图不连续!
end;
 
改成这样
printer.begin
doc;
for i := 0 to 100do
begin

....... printer.canvas.moveto(....)
........画表格,打印数据
//问题在这里,会自动分页,造成心电图不连续!
end;

printer.enddoc;
 
楼上的大哥还没明白我的意思!
我现在的心电图是要实时输出的。
而 enddoc 是一次性输出,就是哪怕我在 begin
doc 和 enddoc 之间写再多东西,
也是要等到 enddoc 才开始打印。这样不算实时输出打印啊!
现在问题是 enddoc 就马上分页。我要做到分页了,但图也要连续的。
也就是有数据,就画图打印,没数据就等待,再有数据就再输出。。。。
但图一定要连续。
 
把數據直接送到打印端口,用匯編一定行。
 
能否给例子!不要给建议啊!
要实际可行的!最好是用API函数或其他函数实现!
300分啊!
可用马上给分!
 
将页距设为0,如何
 
TO duancy
也请发一份给我吧,谢谢
chenyl@hanssun.com
 
后退
顶部