[Delphi] Printer eigenschappen

Pagina: 1
Acties:

  • MidnightMotion
  • Registratie: April 2002
  • Laatst online: 03-04-2022
Ik wil de gebruiker de mogelijkheid geven tijdelijk de driver afhankelijke printereigenschappen te wijzigen, dit kan dmv de functie DocumentProperties. Deze toont het juiste dialoog en wijzigingen worden ook opgeslagen want na de 2e keer openen staan de instellingen zoals ze de vorige keer zijn achtergelaten.
De printer doet alleen niets met deze instellingen.... Is er iets mis met onderstaande code of ben ik misschien iets vergeten?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
var
  Device: array[0..255] of char;
  Driver: array[0..255] of char;
  Port: array[0..255] of char;
  lFullDevMode: PDeviceMode;
  lPFullDevMode: Cardinal;
  lPrinterHandle: THandle;
  lPrinterName: PChar;
begin
  Assert(Assigned(aForm), 'Parameter aForm not assigned');
  lPrinterName := PChar(GetPrinterName(aPrinterIndex));

  OpenPrinter(lPrinterName, lPrinterHandle, nil);
  try
    Printer.GetPrinter(Device, Driver, Port, lPFullDevMode);

    lFullDevMode := GlobalLock(lPFullDevMode);
    try
        { Dialoog tonen }
      Result := DocumentProperties(Handle,
                                   lPrinterHandle,
                                   Device,
                                   lFullDevMode^,
                                   lFullDevMode^,
                                   DM_IN_BUFFER or DM_IN_PROMPT or DM_OUT_BUFFER) > 0;

      Printer.SetPrinter(Device, Driver, Port, lPFullDevMode);

    finally
      GlobalUnlock(lPFullDevMode);
    end;
  finally
    ClosePrinter(lPrinterHandle);
  end;
end;

Eigenaar van domoticavergelijken.info


  • MidnightMotion
  • Registratie: April 2002
  • Laatst online: 03-04-2022
In dat stukje code worden de instellingen in een stream opgeslagen, dit was het probleem niet. De instellingen blijven wel bewaard voor zolang het nodig is, de printer gebruikt ze alleen niet!

[ Voor 4% gewijzigd door MidnightMotion op 27-09-2004 11:30 ]

Eigenaar van domoticavergelijken.info


  • Robbemans
  • Registratie: November 2003
  • Laatst online: 17-07-2025
Het stukje ONDERAAN de code die in de webpagina staat zorgt er voor dat de printer daarwerkelijk geinitialiseerd wordt, onderaan LoadPrinterInfo:

code:
1
2
3
4
5
6
          // Apply settings to the printer 
          if DocumentProperties(0, hPrinter, APrinterName, PI2.pDevMode^, 
                                PI2.pDevMode^, DM_IN_BUFFER or DM_OUT_BUFFER) = IDOK then 
          begin 
            SetPrinter(HPrinter, 2, PI2, 0);  // Ignore the result of this call... 
          end;


Ook de desired access is verplicht (bovenin de method)
code:
1
2
3
4
5
6
  with PrinterDefaults do
  begin
    DesiredAccess := PRINTER_ACCESS_USE;
    pDatatype := nil;
    pDevMode := nil;
  end;


Met andere woorden, je printer zal niet worden ingesteld tenzij je het op de vermelde manier doet...

[ Voor 25% gewijzigd door Robbemans op 27-09-2004 11:40 ]


  • MidnightMotion
  • Registratie: April 2002
  • Laatst online: 03-04-2022
Robbemans schreef op 27 september 2004 @ 11:38:
Het stukje ONDERAAN de code die in de webpagina staat zorgt er voor dat de printer daarwerkelijk geinitialiseerd wordt, onderaan LoadPrinterInfo:

code:
1
2
3
4
5
6
          // Apply settings to the printer 
          if DocumentProperties(0, hPrinter, APrinterName, PI2.pDevMode^, 
                                PI2.pDevMode^, DM_IN_BUFFER or DM_OUT_BUFFER) = IDOK then 
          begin 
            SetPrinter(HPrinter, 2, PI2, 0);  // Ignore the result of this call... 
          end;


Ook de desired access is verplicht (bovenin de method)
code:
1
2
3
4
5
6
  with PrinterDefaults do
  begin
    DesiredAccess := PRINTER_ACCESS_USE;
    pDatatype := nil;
    pDevMode := nil;
  end;


Met andere woorden, je printer zal niet worden ingesteld tenzij je het op de vermelde manier doet...
Het voorbeeld werkt inderdaad wel, vreemd dat ik zoveel voorbeelden ben tegengekomen op andere forums die blijkbaar bij die users wel werkten!

Thanx!

EDIT:
Bij nader inzien, dit werkt ook niet zoals bedoeld, nu worden de instellingen opgeslagen bij de printer ipv dat ze per sessie blijven bestaan

[ Voor 7% gewijzigd door MidnightMotion op 27-09-2004 11:57 ]

Eigenaar van domoticavergelijken.info


  • Robbemans
  • Registratie: November 2003
  • Laatst online: 17-07-2025
Dit is mijn eigen post op die site. Je wil niet weten hoeveel ik aan het kl*ten ben geweest...

Om dat te voorkomen, gebruik gewoon deze routines dsn kun je de boel ook nog in een file opslaan.

  • MidnightMotion
  • Registratie: April 2002
  • Laatst online: 03-04-2022
Ik weet niet of je mijn edit nog hebt gelezen in de vorige post maar het werkt dus nog niet helemaal zoals ik het hebben wil, nu worden de instellingen echt in windows opgeslagen en dat was dus niet de bedoeling! Onderstaande code is trouwens een vereenvoudigde versie van die van jou (zonder mogelijkheid tot opslaan). Misschien is deze nog zo aan te passen dat de instellingen wel alleen binnen de sessie geldig blijven...

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
var
  lPrinterHandle: THandle;
  lPrinterName: PChar;

  lSize: Cardinal;
  lPrinterInfo: PPrinterInfo2;
begin
  lPrinterName := PChar(cbPrinters.Text) ;

  OpenPrinter(lPrinterName, lPrinterHandle, nil);
  try
    lPrinterInfo := AllocMem(lSize);
    try
      GetPrinter(lPrinterHandle, 2, lPrinterInfo, lSize, @lSize);

       { Dialoog tonen }
      if DocumentProperties(Handle, 
                                          lPrinterHandle, 
                                          PChar(cbPrinters.Text), 
                                          lPrinterInfo.pDevMode^, 
                                          lPrinterInfo.pDevMode^, 
                                          DM_IN_BUFFER or DM_IN_PROMPT or DM_OUT_BUFFER) < 0 then
        ShowMessage(SysErrorMessage(GetLastError));

      SetPrinter(lPrinterHandle, 2, lPrinterInfo, 0);
    finally
      FreeMem(lPrinterInfo);
    end;
  finally
    ClosePrinter(lPrinterHandle);
  end;
end;

[ Voor 9% gewijzigd door MidnightMotion op 27-09-2004 13:14 . Reden: layout beetje hersteld ]

Eigenaar van domoticavergelijken.info


  • Robbemans
  • Registratie: November 2003
  • Laatst online: 17-07-2025
Dit heb ik als volgt opgelost (pseudo code)

- Printerinstellingen opslaan
- Eigen instelingen laden
- Afdrukken
- Oude instellingen terugzetten

Dit moet ik wel doen, omdat ik vanuit MSWord print. De active printer wordt daar altijd geinitialiseerd ahv de courante Windows instellingen.

Het aanpassen van Sessie instellingen is niet direct mogelijk, omdat het Printer object in Delphi daarvoor opnieuw moet worden geinitialiseerd. Daar is sinds Delphi 5 of 6 wel de mogelijkheid voor via Printer.Refresh (haalt de instellingen naar de Delphi sessie vanuit de printer)

[ Voor 33% gewijzigd door Robbemans op 27-09-2004 13:40 ]


  • MidnightMotion
  • Registratie: April 2002
  • Laatst online: 03-04-2022
Robbemans schreef op 27 september 2004 @ 13:37:
Dit heb ik als volgt opgelost (pseudo code)

- Printerinstellingen opslaan
- Eigen instelingen laden
- Afdrukken
- Oude instellingen terugzetten

Dit moet ik wel doen, omdat ik vanuit MSWord print. De active printer wordt daar altijd geinitialiseerd ahv de courante Windows instellingen.
Mja, eigenlijk niet zoals het hoort dus (volgens mij) als er iets (goed) misgaat tijdens het afdrukken blijven de instellingen staan.... Er moet toch een andere manier zijn, ik kan me bijna niet voorstellen dat in bv Word dit ook zo gedaan wordt.

Eigenaar van domoticavergelijken.info


  • MidnightMotion
  • Registratie: April 2002
  • Laatst online: 03-04-2022
Robbemans schreef op 27 september 2004 @ 13:37:
Het aanpassen van Sessie instellingen is niet direct mogelijk, omdat het Printer object in Delphi daarvoor opnieuw moet worden geinitialiseerd. Daar is sinds Delphi 5 of 6 wel de mogelijkheid voor via Printer.Refresh (haalt de instellingen naar de Delphi sessie vanuit de printer)
Maar de instellingen moeten toch juist vanuit de Delphi sessie naar de printer? :?
Ik heb het trouwens nog eens geprobeerd met
code:
1
2
        Printer.SetPrinter(Device, Driver, Port, DevMode);
        Printer.Refresh;


Maar ook dit mocht niet baten (instellingen worden niet meegenomen naar de printer)

Eigenaar van domoticavergelijken.info


  • Robbemans
  • Registratie: November 2003
  • Laatst online: 17-07-2025
LOL!

In Word wordt VIA WORD afgedrukt, dus IN de sessie.
Als je tijdens het afdrukken in Word je instellingen opvraagt, dan zijn ze globaal!!!

Dus, mocht je idd een beter idee hebben, dan hoor ik het graag. Het heeft me tot nu to ruim een week (!) gekost om dit enigszins werkzaam te krijgen en dat vond ik wel voldoende...

Houd er wel rekening mee dat globaal ook echt globaal is. De instellingen worden dus voor ALLE gebruikers in het netwerk actief als het een netwerkprinter betreft.

  • Robbemans
  • Registratie: November 2003
  • Laatst online: 17-07-2025
MidnightMotion schreef op 27 september 2004 @ 13:53:
[...]


Maar de instellingen moeten toch juist vanuit de Delphi sessie naar de printer? :?
Ik heb het trouwens nog eens geprobeerd met
code:
1
2
        Printer.SetPrinter(Device, Driver, Port, DevMode);
        Printer.Refresh;


Maar ook dit mocht niet baten (instellingen worden niet meegenomen naar de printer)
Wat is je complete code? Heb je wel de rechten om de printer aan te passen zoals in de Load method:

code:
1
2
3
4
5
6
  with PrinterDefaults do
  begin
    DesiredAccess := PRINTER_ACCESS_USE;
    pDatatype := nil;
    pDevMode := nil;
  end;

[ Voor 13% gewijzigd door Robbemans op 27-09-2004 13:56 ]


  • Robbemans
  • Registratie: November 2003
  • Laatst online: 17-07-2025
MidnightMotion schreef op 27 september 2004 @ 13:53:
[...]

Maar ook dit mocht niet baten (instellingen worden niet meegenomen naar de printer)
Ja en nee. Je past het Windows printer object aan. De Printers unit in Delphi houdt een 'cache' bij van alle objecten. DIE moet ververst worden voordat je de printer kan gebruiken in je sessie.

  • MidnightMotion
  • Registratie: April 2002
  • Laatst online: 03-04-2022
Nog steeds niemand met een nette oplossing voor dit probleem?De Windows defaults tijdelijk wijzigen is naar mijn bescheiden mening niet de oplossing en kan zelfs problemen veroorzaken...

Eigenaar van domoticavergelijken.info

Pagina: 1