对面的富翁看过来!急征雷锋! (200分)

  • 主题发起人 cynthia.o
  • 开始时间
C

cynthia.o

Unregistered / Unconfirmed
GUEST, unregistred user!
现有PC一台,系统2000,数据库SQL,另针打一台。
现在要求此机器可以打印N种报表,其中有一种报表,为清单。使用纸张为特定,约十五厘米宽的连续纸。
此报表长度不能确定,为动态生成,可能有一米长,可能只有几行,只是打到哪里就要停到哪里,不要走纸。
需要做到的打印功能就是,不用额外设置打印机设置,直接就可打印这些报表。
初学,希望得到详细解答!稍显复杂,我就会看不懂的。}:>
实在扛不住,哪位愿意帮帮忙。这是我QQ:128353
 
Windows的GDI(图形设备接口)是一个允许应用程序以一种近乎设备独立的方式与图形
输出设备交流的界面。GDI提供给应用程序一个指向显示上下文(display context或缩
定DC)或信息上下文(information context缩写IC)的句柄。
DC句柄允许用户使用GDI调用以有给定设备环境(矩形、图形、文本等)绘图。而IC句柄
使用应用程序获得一个给定设备的有关信息(每一个in的象素点,页尺寸等等)
Delphi通过TPrinter对象的属性和方法封装了许多绘图和信息调用,由TPrinter对象来
调用Windows的GDI。
HorizontalInch := GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSX);
VerticalInch := GetDeviceCaps(Printer.Canvas.Handle,LOGPIXELSY);
var PointsX:do
uble;
var PointsY:do
uble;
PointsX := GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSX) / 72;
PointsY := GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSY) / 72;
下面例子是画一个2in宽,3in高矩形,其放置在离页左上角1in的位置(没有考虑打印页边)
with Printer.Canvasdo

Rectangle(Round(PointesX * 72),
Round(PointsY * 72),
Round(PointsX * 216),
Round(PointsY * 288));

彩色转黑白
Red := Round(0.3 * red) + (0.59 * green) + (0.11 * blue);
Green := Red;
Blue := Red;
FDevice : PChar;
FDriver : PChar;
FPort : PChar;
DeviceMode : THandle;
DevMode : PDeviceMode;
constructor TPrinterSettings.Create;
begin
inherited Create;
GetMem(FDevice, 128);
GetMem(FDriver, 128);
GetMem(FPort, 128);
FPaperSize := A4;
FPrinter := nil;
end;

function TPrinterSettings.Supported(Setting : integer) : boolean;
begin
if assigned(FPrinter) then
Supported := (DevMode^.dmFields and Setting) = Setting
else
Supported := false;
end;

procedure TPrinterSettings.SetField(aField : integer);
begin
DevMode^.dmFields := DevMode^.dmFields or aField;
end;

procedure TPrinterSettings.ApplySettings;
begin
FPrinter.GetPrinter(FDevice, FDriver, FPort, DeviceMode);
DevMode := GlobalLock(DeviceMode);
if PaperSize = Custom then
begin
SetField(dm_paperlength);
DevMode^.dmPaperLength := PaperLength;
SetField(dm_paperwidth);
DevMode^.dmPaperWidth := PaperWidth;
{$ifdef FANG}
if Supported(dm_formname) then
begin
SetField(dm_formname);
StrPCopy(DevMode^.dmFormName, PaperFormName);
end;
//fang 900327 end
{$endif}
end;

if FDuplex then
begin
SetField(dm_duplex);
DevMode^.dmDuplex := dmdup_horizontal;
end;

if Supported(dm_PaperSize) and (PaperSize <> Default) then
begin
SetField(dm_papersize);
{$ifdef FANG}
if GetVersion() < $80000000 then
begin
if GetPrnPaperSize(FDevice, PaperFormName, iPaperSize) then
DevMode^.dmPaperSize := iPaperSize
else
DevMode^.dmPaperSize := cQRPaperTranslate[PaperSize];
end
else
{$endif}
DevMode^.dmPaperSize := cQRPaperTranslate[PaperSize];
end;

SetField(dm_copies);
DevMode^.dmCopies := FCopies;
SetField(dm_defaultsource);
DevMode^.dmDefaultSource := (DevMode^.dmDefaultSource and 256) or cQRBinTranslate[OutputBin];
SetField(dm_orientation);
if Orientation=poPortrait then
DevMode^.dmOrientation := dmorient_portrait
else
DevMode^.dmOrientation := dmorient_landscape;
FPrinter.SetPrinter(FDevice, FDriver, FPort, DeviceMode);
GlobalUnlock(DeviceMode);
end;
 
这个这个。。。。
我不知道是不是这么复杂。我想解决的步聚是不是先列,然后再个个击破?
先确定数据量,计算出长度?
然后得出纸张大小,将此纸张设置给打印机?
然后再做具体打印格式的问题?
楼上很感谢你啊,可是看不明白啊!5555。。。。。
 
哪有那么麻烦,直接打就可以了。
设定特定纸张,用qreport就行。
我做过,打印提货单,套打。
 
我是想用程序直接设置纸张了,因为我这样打别的报表就不必手动去设什么东西了,再说,
想让他们自己去设,他们也不会。55555。。。。
DELPHI打印方面的东西都是使用控件解决问题的?我是希望最好不要使用第三方控件。
 
quickreport在设计阶段设置纸张就行了。
不过quickreport也是第三方的。
 
我其它的报表都是用VB生成的。:(
你说设计阶段就设置好,是什么意思?
我这清单没法定长度啊。
 
顶部