AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi automatische Druckerauswahl funktioniert nicht immer
Thema durchsuchen
Ansicht
Themen-Optionen

automatische Druckerauswahl funktioniert nicht immer

Ein Thema von PASST · begonnen am 12. Sep 2005 · letzter Beitrag vom 28. Sep 2005
Antwort Antwort
PASST

Registriert seit: 30. Mär 2005
Ort: Krefeld
325 Beiträge
 
Delphi 7 Enterprise
 
#1

automatische Druckerauswahl funktioniert nicht immer

  Alt 12. Sep 2005, 10:15
Hi allerseits,

Delphi 4 (update 3), WinNT4 bzw. WinXP

Ich habe eine Anwendung, die auf diverse Drucker drucken soll. Dabei soll der Benutzer nicht mit der Druckerauswahl belästigt werden, sondern ich habe die Auswahl des Druckers fest in einer ini-Datei eingebaut. Um den Drucker festzulegen, verwende ich folgenden Code (s.u.), der in diversen Newsforen empfohlen wurde.
Delphi-Quellcode:
procedure TFMain.SetDefaultPrinter(PrinterName: String);
var
   i: Integer;
   Device, Driver, Port : PChar;
   HdeviceMode: Thandle;
   aPrinter : TPrinter;
begin
  Printer.PrinterIndex := -1;
  OriginalDrucker := Printer.Printers[Printer.PrinterIndex];
  getmem(Device, 255);
  getmem(Driver, 255);
  getmem(Port, 255);
  aPrinter := TPrinter.create;
  for i := 0 to Printer.printers.Count-1 do
  begin
    if (uppercase(Printer.printers[i]) = uppercase(PrinterName)) then
    begin
      aprinter.printerindex := i;
      aPrinter.getprinter(device, driver, port, HdeviceMode);
      StrCat(Device, ',');
      StrCat(Device, Driver );
      StrCat(Device, Port );
      WriteProfileString('windows', 'device', Device);
      StrCopy( Device, 'windows' );
      SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, Longint(@Device));
   end;
  end;
  Freemem(Device, 255);
  Freemem(Driver, 255);
  Freemem(Port, 255);
  aPrinter.Free;
end;
Es ist jetzt schon zu häufig passiert, dass der Drucker nicht wechselt, sondern auf den Windows-Standard-Drucker ausgegeben wird. Erst beim Neustart des Programms funktioniert der Wechsel wieder. Der Fehler tritt unter NT4 auf, da unsere Clients vorwiegend NT-Maschinen sind.

Woran kann das liegen?
Oder kann mir jemand einen Tipp geben, wie ich das ganze umgehen kann?

Gruß
Peter

P.S.: SORRY, habe gerade gemerkt, dass ich den falschen Code eingefügt hatte. Das ist aber jetzt korrigiert!
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: automatische Druckerauswahl funktioniert nicht immer

  Alt 12. Sep 2005, 17:13
Deine Funktion macht keinen Mucks, wenn der übergebene Druckername nicht gefunden wird.
Hier solltest du besser eine Exception auslösen.
Manchmal (abhängig vom OS) wird der Druckername in Printer.Printers[] so gemeldet:
Code:
Druckername an LPT1:
Deskjet 1200 on LPT2:
Die könnte dazu führen, dass der Vergleich der Druckernamen fehlschlägt.
Andreas
  Mit Zitat antworten Zitat
PASST

Registriert seit: 30. Mär 2005
Ort: Krefeld
325 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: automatische Druckerauswahl funktioniert nicht immer

  Alt 15. Sep 2005, 09:15
Woran kann es denn liegen, dass es auf dem selben Rechner manchmal funktioniert und manchmal nicht?
Dieses Fehlverhalten habe ich von gestern auf heute an drei verschiedenen Rechnern feststellen können.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#4

Re: automatische Druckerauswahl funktioniert nicht immer

  Alt 28. Sep 2005, 23:41
Hi,

ich habe eine ähnliche Vorlage gefunden wie shmia (von Peter Below, Team B) und abgewandelt :

Delphi-Quellcode:
procedure Drucke (st : string);
var
  BytesWritten: DWORD;
  hPrinter: THandle;
  DocInfo: TDocInfo1;
begin
  if not WinSpool.OpenPrinter(DruckerName, hPrinter, nil) then
    raise exception.create('Drucker nicht gefunden !');
  try
    DocInfo.pDocName := DruckerName; // von INI festgelegter Standard-Drucker
                                      // beeinflußt Win-Standarddrucker nicht !
    DocInfo.pOutputFile := Nil;
    DocInfo.pDatatype := 'RAW';
    if StartDocPrinter(hPrinter, 1, @DocInfo) = 0 then
      Abort;
    try
      if not StartPagePrinter(hPrinter) then
        Abort;
      try
        if not WritePrinter(hPrinter, @st[1], Length(st), BytesWritten)
        then
          Abort;
      finally
        EndPagePrinter(hPrinter);
      end;
    finally
      EndDocPrinter(hPrinter);
    end;
  finally
    WinSpool.ClosePrinter(hPrinter);
  end;
end;

procedure DruckLn (st : string);
begin
  Drucke (st+chr (10) + chr (13));
end;
Kann man das so verwenden ? Oder kann ich auch drucken, ohne dauernd diese Prozedur zu bemühen ? Gehen tut das schon so, auch mit Netzwerkdruckern.

Und dann noch das :
DocInfo.pDatatype := 'RAW'; Habe festgestellt, daß eine Änderung von "RAW" dazu führt, daß der Drucker nicht druckt. Außerdem vermisse ich die Hilfe dazu. Ist die eventuell im Win-SDK ?
Gruß
Hansa
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz