Solved

Printing behaves different in Win9x und WinNT

Posted on 2001-07-17
8
223 Views
Last Modified: 2010-04-04
using the print-method of a FORM (Delphi4) in Win9x it prints (as espected) a Bitmap-Hardcopy, in WINNT it produces a empty sheet.

What happens?

Using my own Print-Routine (using the DC from printer.gethandle) its the same strange thing: in WIN9x all is fine, under NT I get empty sheets. A small difference to the Delphi-print-method: (NT) after get empty pages from the first print-job the next print-job prints fine, but if after change any of the printeroptions (for inst. portrait->landscape) it prints (for the first time) again empty sheet...

Another strange thing is, that the printouts got from the same code and the same printer in NT and 9x differ: for inst. a frame around the whole printable area dont have a right side printing under NT, but is OK printing under 9x.


Whats wrong?

any hints?

nmm
0
Comment
Question by:nmm
  • 5
  • 2
8 Comments
 
LVL 30

Expert Comment

by:third
ID: 6292580
have u tried printing a test page in NT? and check if the printer selected in the printer options is the hardware that u have... :)
0
 
LVL 3

Expert Comment

by:SteveWaite
ID: 6293821
I had a similar problem. Maybe the printer driver has different referances to the gutter and margin widths on NT and 9x and wouldn't print anything on NT. Do not have your print code read and believe the margin widths from the driver but create your own. Some printer drivers (HP850c for one) does this between 95 and 98 where 95 gives proper dimensions and 98 gives wrong ones.

Steve
0
 

Author Comment

by:nmm
ID: 6401547
Hi Steve
What does that mean: "create your own", do you mean I should create my own printerdriver? I suppose that will be unpractiable, because the program sould print on any printer with windows-driver.

If you mean, I should create my own margin widths, that will also be not possible, because this way I have to guess (or believe the GetDeviceCaps-Information) the printers resulution, the sheet dimension and so on.

If the GetDeviceCaps-Infos are usualy wrong in NT, why will the second print-job print fine?

For me it looks like: somesort of necessary initialization will not be done proper by BeginDoc und sonething is wrong until the first Print-Job is done. May be its possible to do this special initialization befor printing? The crux is, that I dont know what is to be initialized...

nmm

0
Free Tool: Postgres Monitoring System

A PHP and Perl based system to collect and display usage statistics from PostgreSQL databases.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
LVL 3

Expert Comment

by:SteveWaite
ID: 6903498
if you are still there....
this is what i do and works ok..
    try //except
      try //finally
        Application.MainForm.Enabled := False;
        with Printer do
        begin
          if (Copies = 1)
            then Title := txtTitle
            else Title := txtTitle + ' x' + IntToStr(Copies);
          BeginDoc;
          for I := Start to Stop do
          begin
            DrawPage; // Printer.Canvas
            if (I <> Stop)
              then NewPage;
          end;
          EndDoc;
        end;
      finally
        Application.MainForm.Enabled := True;
      end;
    except
      begin
        Errored := True;
        if Printer.Printing
          then Printer.Abort;
      end;
    end;
Regards,
Steve
0
 
LVL 3

Expert Comment

by:SteveWaite
ID: 6903513
> Another strange thing is, that the printouts got from the same code and the same printer in NT and 9x
differ: for inst. a frame around the whole printable area dont have a right side printing under NT,
but is OK printing under 9x.

Your 'printable area' is bigger than the 'actual' printable area and so your border is outside.

I was trying to say that you should not trust the GetDeviceCaps-Information.

Make your area smaller?
Regards,
Steve
0
 
LVL 3

Accepted Solution

by:
SteveWaite earned 200 total points
ID: 6903541
and do a proper printer setup before the print job..

// Assert confguration details
procedure TForm1.PrinterConfig;
var
  Device, Driver, Port: array[0..80] of Char;
  DevMode: THandle;
  PDevMode: PDeviceMode;
begin
  Printer.GetPrinter(Device, Driver, Port, DevMode); // Get printer device name etc.
  Printer.SetPrinter(Device, Driver, Port, 0);  // force reload of DEVMODE
  Printer.GetPrinter(Device, Driver, Port, DevMode); // get DEVMODE
  if not (DevMode = 0) then
  begin
    PDevMode := GlobalLock(DevMode); // lock it to get pointer to DEVMODE record
    if not (PDevMode = nil) then
    try
      with PDevMode^ Do
      begin
        // example: change the paper size
        dmPapersize := DMPAPER_A4;
        dmFields := dmFields or DM_PAPERSIZE; // force driver to re-select size
        // set something else
        // ..
      end;
    finally
      GlobalUnlock(DevMode);
    end;
  end;
end;
0
 

Author Comment

by:nmm
ID: 6911076
Hi Steve, thanx for this comments, finally it leads me to the solution: beside the differences of GetDeviceCap, which are explain the different behavior in printing frames, there is a difference in NT/2000 and Win98: If you assign the printer.handle to a variable DC:HDC, it differs depending on assignment before BeginDoc and after BeginDoc in NT.
I used such a "before-assigned" DC in what you call "DrawPage" (instad of printer.hanlde). In Win98 this works fine, but in NT the first time printing goes to a undefined DC.
After changing this (assign the DC-variable again after BeginDoc) it words in NT/2000 as well.

Reagrds
nmm
0
 
LVL 3

Expert Comment

by:SteveWaite
ID: 6911088
Glad I helped after all and thanks for posting that info too!
Regards,
Steve
0

Featured Post

Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction I have seen many questions in this Delphi topic area where queries in threads are needed or suggested. I know bumped into a similar need. This article will address some of the concepts when dealing with a multithreaded delphi database…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…
This video shows how to quickly and easily add an email signature for all users on Exchange 2016. The resulting signature is applied on a server level by Exchange Online. The email signature template has been downloaded from: www.mail-signatures…
This video shows how to use Hyena, from SystemTools Software, to bulk import 100 user accounts from an external text file. View in 1080p for best video quality.

856 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question