Message-ID: <3E2EF07C.3090700@huckfinn.de> Date: Wed, 22 Jan 2003 20:26:52 +0100 From: Alex Weidauer User-Agent: Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:0.9.8) Gecko/20020204 X-Accept-Language: en-us MIME-Version: 1.0 Newsgroups: borland.public.delphi.graphics Subject: Re: URGENT - TImage -> Printing References: <3e23c769@newsgroups.borland.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit Lines: 355 NNTP-Posting-Host: 80.139.239.35 X-Trace: newsgroups.borland.com 1046001637 80.139.239.35 (23 Feb 2003 04:00:37 -0800) Path: newsgroups.borland.com!not-for-mail Xref: newsgroups.borland.com borland.public.delphi.graphics:56559 Sven van Pletzen wrote: > I seem to have a problem -> I use the Printers unit to print a image to the > canvas of the printer. > > Something like Printer.Canvas.StretchDraw(TRect, Image1.Picture.Graphic); > > On my computer - the developing computer the printer prints the image -> on > another computer without delphi etc. It wont print. > > The image is a .bmp - I also had the same problem with Quick Report. > > I am using Delphi 7 and making my setups wiht Installshield. > > Thanks in advance > Sven van Pletzenb > > > Hi, Here is a code snippet so you list the bcabablities of your print device. I think you have to "resample" the image interms to fit to the printing device cabablities. See expecially for the raster cabablities! procedure TPrinterUtil.WritePrinter(FName:String); Var FS:TFileStream; F:TWriter; Device : array[0..255] of char; Driver : array[0..255] of char; Port : array[0..255] of char; hDMode : THandle; PDMode : PDEVMODE; OldPI : Integer; begin Try OldPi := Printer.PrinterIndex; Except MessageDlg('The Current Printer is not valid ! ', mtError,[mbok],0); Exit; End; Printer.PrinterIndex := Printer.PrinterIndex; Printer.GetPrinter(Device, Driver, Port, hDMode); if lStrLen(Driver) = 0 then begin GetProfileString('Devices', Device, '', Driver, MAX_PATH); Driver[pos(',', Driver) - 1] := #0; end; if lStrLen(Port) = 0 then begin GetProfileString('Devices', Device, '', Port, MAX_PATH); lStrCpy(Port, @Port[lStrLen(Port)+2]); end; if hDMode <> 0 then begin pDMode := GlobalLock(hDMode); if pDMode <> nil then begin If FileExists(FName) Then FS:=TFileStream.Create(FNAME,fmOpenWrite) Else FS:=TFileStream.Create(FNAME,fmCreate); F:=TWriter.Create(FS,10000); F.WriteString(StrPas(Device)); F.WriteString(StrPas(Driver)); F.WriteString(StrPas(Port)); F.WriteInteger(SizeOf(pDMode^)); F.Write(pDMode^, SizeOf(pDMode^)); F.Free; FS.Free; GlobalUnlock(hDMode); end; end; Try Printer.PrinterIndex := Printer.PrinterIndex; Except Printer.PrinterIndex := OldPi; End; end; procedure TPrinterUtil.FormCreate(Sender: TObject); begin BringToFront; RefreshSettingsClick(NIL); end; procedure TPrinterUtil.RefreshSettingsClick(Sender: TObject); Var Sep:String; Procedure MakeInt(S:String;key:Integer); Begin S:=UpperCase(S); DevCtrl.Lines.Add(UpperCase(Format(' %36S = %d ',[s,GetDeviceCaps(Printer.Handle,Key)]))); End; Function StringToBits(S:String):String; Var H:String;i:Integer; Function SubStr(C:Char):String; Begin if c='0' then SubStr:='0000'; if c='1' then SubStr:='0001'; if c='2' then SubStr:='0010'; if c='3' then SubStr:='0011'; if c='4' then SubStr:='0100'; if c='5' then SubStr:='0101'; if c='6' then SubStr:='0110'; if c='7' then SubStr:='0111'; if c='8' then SubStr:='1000'; if c='9' then SubStr:='1001'; if c='A' then SubStr:='1010'; if c='B' then SubStr:='1011'; if c='C' then SubStr:='1100'; if c='D' then SubStr:='1101'; if c='E' then SubStr:='1110'; if c='F' then SubStr:='1111'; End; Begin StringToBits:=''; S:=UpperCase(s); H:=''; if Length(S)=0 then exit; if Length(S)=1 then S:='0000'+S; if Length(S)=2 then S:='000'+S; if Length(S)=3 then S:='00'+S; if Length(S)=4 then S:='0'+S; For i:=1 to Length(s) do H:=H+' '+SubStr(S[i]); StringToBits:=H; End; Procedure MakeHex(S:String;key:Cardinal); Var h:String; Begin S:=UpperCase(S); h:=Format('%X',[GetDeviceCaps(Printer.Handle,Key)]); if Length(H)=0 then exit; if Length(H)=1 then H:='0000'+H; if Length(H)=2 then H:='000'+H; if Length(H)=3 then H:='00'+H; if Length(H)=4 then H:='0'+H; DevCtrl.Lines.Add(''); DevCtrl.Lines.Add(SEP); DevCtrl.Lines.Add(''); DevCtrl.Lines.Add(Format('%37S = Flags(%S) Key(%S)',[s,h, // (( GetDeviceCaps(Printer.Handle,Key), StringToBits(H)] )); End; Procedure MakeFlag(S:String;key,subKey:Cardinal); Var i:Cardinal; Begin S:=UpperCase(S); i:=GetDeviceCaps(Printer.Handle,Key); if i AND SubKey<>0 then DevCtrl.Lines.Add(Format(' %34S = Flag(%4S) Key(%6D,%S)',[s,'ON ' ,SubKey,StringToBits(Format('%x',[SubKey]))])) else DevCtrl.Lines.Add(Format(' %34S = Flag(%4S) Key(%6D,%S)',[s,'OFF' ,SubKey,StringToBits(Format('%x',[SubKey]))])) End; Function TechnoToStr(i:Integer):String; Begin TechnoToStr:='#ERROR# is Unknwon'; Case i Of DT_PLOTTER : TechnoToStr:='Vector Plotter'; DT_RASDISPLAY : TechnoToStr:='Raster Display'; DT_RASPRINTER : TechnoToStr:='Raster Printer'; DT_RASCAMERA : TechnoToStr:='Raster Camera'; DT_CHARSTREAM : TechnoToStr:='Character Stream'; DT_METAFILE : TechnoToStr:='Metafile'; DT_DISPFILE : TechnoToStr:='Display file'; End; End; Begin DevCtrl.SetFocus; DevCtrl.Visible:=False; if Printer.PrinterIndex<0 then Exit; // Device Organisation Try if NOT(GetMapMode(Printer.Handle)=MM_TEXT) then SetMapMode(Printer.Handle,MM_Text); DevCtrl.Clear; Sep:='______________________________________________________________________________________________'; DevCtrl.Lines.Add(sep); DevCtrl.Lines.Add(''); DevCtrl.Lines.Add(' PRINTER : '+Printer.Printers[Printer.PrinterIndex]); DevCtrl.Lines.Add(sep); DevCtrl.Lines.Add(''); DevCtrl.Lines.Add(sep); DevCtrl.Lines.Add(''); DevCtrl.Lines.Add(Format('%36S = %D',['NUMBER Of COPIES',Printer.Copies])); if Printer.Orientation=poLandscape then DevCtrl.Lines.Add(Format('%36S = LANDSCAPE',['ORIENTATION'])); if Printer.Orientation=poPortrait then DevCtrl.Lines.Add(Format('%36S = PORTRAIT',['ORIENTATION'])); DevCtrl.Lines.Add(sep); DevCtrl.Lines.Add(''); MakeInt('DRIVERVERSION', DRIVERVERSION); DevCtrl.Lines.Add(Format(' %36S = %S',['TECHNOLOGY', UpperCase(TechnoToStr(GetDeviceCaps(Printer.Handle,Technology)))])); DevCtrl.Lines.Add(sep); DevCtrl.Lines.Add(''); MakeInt('WIDTH [mm]', HORZSIZE); MakeInt('HEIGHT [mm]', VERTSIZE); MakeInt('WIDTH [pix]', HORZRES); MakeInt('HEIGHT [pix]', VERTRES); DevCtrl.Lines.Add(sep); DevCtrl.Lines.Add(''); MakeInt('Physical Width [pix]', PHYSICALWIDTH); MakeInt('Physical Height[pix]', PHYSICALHEIGHT); MakeInt('Physical Offset X [pix]', PHYSICALOFFSETX); MakeInt('Physical Offset Y [pix]', PHYSICALOFFSETY); MakeInt('SCALING FACTOR X', SCALINGFACTORX); MakeInt('SCALING FACTOR Y', SCALINGFACTORY); DevCtrl.Lines.Add(sep); DevCtrl.Lines.Add(''); MakeInt('horizontal [DPI]', LOGPIXELSX); MakeInt('vertial [DPI]', LOGPIXELSY); MakeInt('BITS PER PIXEL', BITSPIXEL); MakeInt('COLOR PLANES', PLANES); DevCtrl.Lines.Add(sep); DevCtrl.Lines.Add(''); MakeInt('NUMBER OF BRUSHES', NUMBRUSHES); MakeInt('NUMBER OF PENS', NUMPENS); MakeInt('NUMBER OF FONTS', NUMFONTS); MakeInt('NUMBER OF COLORS', NUMCOLORS); DevCtrl.Lines.Add(sep); DevCtrl.Lines.Add(''); MakeInt('ASPECT Ratio X [DPI]', ASPECTX); MakeInt('ASPECT Ratio Y [DPI]', ASPECTY); MakeInt('ASPECT Ratio XY [DPI]',ASPECTXY); DevCtrl.Lines.Add(sep); DevCtrl.Lines.Add(''); MakeInt('SIZE OF PALETTE', SIZEPALETTE); MakeInt('RESERVED TO SYSTEM PALETTE **',NUMRESERVED); MakeInt('ACTUAL RASTER RESOLUTION **',COLORRES); DevCtrl.Lines.Add(''); DevCtrl.Lines.Add(' **...only true if KEY RASTERCAPS (RC_PALETTE)= ON'); MakeFlag('... KEY RASTERCAPS (RC_PALETTE)', RasterCaps,RC_PALETTE); DevCtrl.Lines.Add(''); MakeHex('Clipping Capablities ',ClipCaps); DevCtrl.Lines.Add(sep); DevCtrl.Lines.Add(''); MakeFlag('No Support ',ClipCaps,CP_NONE); MakeFlag('Support Rectangles',ClipCaps,CP_RECTANGLE); MakeFlag('Support PolyRegion 32 Bit',ClipCaps,CP_REGION); MakeHex('Raster Printing Flags ',RasterCaps); DevCtrl.Lines.Add(sep); DevCtrl.Lines.Add(''); MakeFlag('Support Bitmap Transfer', RasterCaps,RC_BITBLT); MakeFlag('Support Banding', RasterCaps,RC_BANDING); MakeFlag('Support Scaling', RasterCaps,RC_SCALING); MakeFlag('Support Bitmaps > 64 kByte', RasterCaps,RC_BITMAP64); MakeFlag('Support features of Win 2.0',RasterCaps,RC_GDI20_OUTPUT); MakeFlag('Support Set~/GetDIBITS()', RasterCaps,RC_DI_BITMAP); MakeFlag('Support Palette Devices', RasterCaps,RC_PALETTE); MakeFlag('Support SetDIBitsToDevice()',RasterCaps,RC_DIBTODEV); MakeFlag('Support Floodfill', RasterCaps,RC_FLOODFILL); MakeFlag('Support StretchBlt()', RasterCaps,RC_STRETCHBLT); MakeFlag('Support StretchBID()', RasterCaps,RC_STRETCHDIB); MakeFlag('Support DIBS', RasterCaps,RC_DEVBITS); MakeHex('Curve Printion Flages', CurveCaps); DevCtrl.Lines.Add(sep); DevCtrl.Lines.Add(''); MakeFlag('No Curve support', CurveCaps,CC_NONE); MakeFlag('Support Circles', CurveCaps,CC_Circles); MakeFlag('Support Pie', CurveCaps,CC_PIE); MakeFlag('Support Arces', CurveCaps,CC_CHORD); MakeFlag('Support Ellipses', CurveCaps,CC_ELLIPSEs); MakeFlag('Support WIDE FRAMES', CurveCaps,CC_WIDE); MakeFlag('Support STYLED FRAMES', CurveCaps,CC_STYLED); MakeFlag('Support WIDE&STYLED FRAMES', CurveCaps,CC_WIDESTYLED); MakeFlag('Support INTERIORS', CurveCaps,CC_INTERIORS); MakeFlag('Support ROUNDRECT', CurveCaps,CC_ROUNDRECT); MakeHex('Line & Polygon Printing Flags', LineCaps); DevCtrl.Lines.Add(sep); DevCtrl.Lines.Add(''); MakeFlag('No Line Support', LineCaps,LC_NONE); MakeFlag('Support Polylines', LineCaps,LC_PolyLine); MakeFlag('Support Marker', LineCaps,LC_Marker); MakeFlag('Support PolyMarker', LineCaps,LC_PolyMarker); MakeFlag('Support Wide Lines', LineCaps,LC_WIDE); MakeFlag('Support STYLED Lines', LineCaps,LC_STYLED); MakeFlag('Support WIDE&STYLED Lines', LineCaps,LC_WIDESTYLED); MakeFlag('Support Lines Interiors', LineCaps,LC_INTERIORS); MakeHex('Polygon (Areal) Printing Flags', POLYGONALCAPS); DevCtrl.Lines.Add(sep); DevCtrl.Lines.Add(''); MakeFlag('No Polygon Support', PolygonalCaps,PC_NONE); MakeFlag('Filling Alternate Polygons', PolygonalCaps,PC_POLYGON); MakeFlag('Drawing Rectangles', PolygonalCaps,PC_RECTANGLE); MakeFlag('Filling Winding Polygons', PolygonalCaps,PC_WINDPOLYGON); MakeFlag('Drawing Trapezoid (??Flag)', PolygonalCaps,PC_Trapezoid); MakeFlag('Drawing a ScanLine', PolygonalCaps,PC_SCANLINE); MakeFlag('Drawing Wide Border', PolygonalCaps,PC_WIDE); MakeFlag('Drawing Styled Border', PolygonalCaps,PC_STYLED); MakeFlag('Drawing WIDE&STYLED Border', PolygonalCaps,PC_WIDESTYLED); MakeFlag('Drawing Interiors', PolygonalCaps,PC_INTERIORS); MakeHex('Text Printing Flags', TEXTCAPS); DevCtrl.Lines.Add(sep); DevCtrl.Lines.Add(''); MakeFlag('Support Character Output Precision',TextCaps,TC_OP_CHARACTER); MakeFlag('Support Stroke Output Precision', TextCaps,TC_OP_STROKE); MakeFlag('Support Stroke Clip Precision', TextCaps,TC_CP_STROKE); MakeFlag('Support 90° Character Rotation', TextCaps,TC_CR_90); MakeFlag('Support any Character Rotaion', TextCaps,TC_CR_ANY); MakeFlag('Support Character Scaling in X&Y', TextCaps,TC_SF_X_YINDEP); MakeFlag('Support Character Scaling REAL', TextCaps,TC_SA_DOUBLE); MakeFlag('Support Character Scaling RATIONAL',TextCaps,TC_SA_INTEGER); MakeFlag('Support Character Scaling EXACT', TextCaps,TC_SA_CONTIN); MakeFlag('Support Character Weight REAL', TextCaps,TC_EA_DOUBLE); MakeFlag('Support Character Italic', TextCaps,TC_IA_ABLE); MakeFlag('Support Character Underline', TextCaps,TC_UA_ABLE); MakeFlag('Support Character Strikeout', TextCaps,TC_SO_ABLE); MakeFlag('Support Character as RASTER FONT', TextCaps,TC_RA_ABLE); MakeFlag('Support Character as VECTOR FONT', TextCaps,TC_VA_ABLE); MakeFlag('Reserved Flag ???', TextCaps,TC_Reserved); MakeFlag('DEVICE NOT USE a SCROLLBIT BLOCK ?',TextCaps,TC_SCROLLBLT); DevCtrl.Lines.Insert(0,'..THE RESULTS ARE:'); Except // MessageDlg('The Current Printer is not valid ! ', // mtError,[mbok],0); Printer.PrinterIndex:=-1; DevCtrl.Lines.Add(' ! The Printer is not valid !'); End; DevCtrl.SetFocus; DevCtrl.Visible:=True; End; procedure TPrinterUtil.EditPrinterClick(Sender: TObject); begin PSDLG.Execute; RefreshSettingsClick(NIL); end;