Solved

Printing behaves different in Win9x und WinNT

Posted on 2001-07-17
8
219 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
 
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
How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

 
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

Highfive + Dolby Voice = No More Audio Complaints!

Poor audio quality is one of the top reasons people don’t use video conferencing. Get the crispest, clearest audio powered by Dolby Voice in every meeting. Highfive and Dolby Voice deliver the best video conferencing and audio experience for every meeting and every room.

Join & Write a Comment

In this tutorial I will show you how to use the Windows Speech API in Delphi. I will only cover basic functions such as text to speech and controlling the speed of the speech. SAPI Installation First you need to install the SAPI type library, th…
Introduction Raise your hands if you were as upset with FireMonkey as I was when I discovered that there was no TListview.  I use TListView in almost all of my applications I've written, and I was not going to compromise by resorting to TStringGrid…
Get a first impression of how PRTG looks and learn how it works.   This video is a short introduction to PRTG, as an initial overview or as a quick start for new PRTG users.
This tutorial demonstrates a quick way of adding group price to multiple Magento products.

707 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

Need Help in Real-Time?

Connect with top rated Experts

18 Experts available now in Live!

Get 1:1 Help Now