AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

2 Druckertreiber für 1 Drucker?

Ein Thema von Mattze · begonnen am 20. Jun 2014 · letzter Beitrag vom 23. Jun 2014
Antwort Antwort
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#1

2 Druckertreiber für 1 Drucker?

  Alt 20. Jun 2014, 15:26
Hallo,

folgendes Problem:
Mache ich Printer.getprinter... bekomme ich als Druckertreiber den Namen des Druckers selber zurück.
Mache ich VORHER Printdialog.execute und OK, dann bekomme ich, auch mit Printer.getprinter, als Druckertreiber winspool zurück.

Ich nehme an, winspool ist richtig!

Es reicht nicht, den printerindex entsprechend zu setzen. Offenbar setzt der Printdialog also noch etwas, damit es richtig wird. Aber was? Aus dem Quelltext kriege ich es leider nicht raus.

Wie bekomme ich denn das nun korrekt OHNE den Printdialog?
(Zumindest nicht mal so und mal so.)

Übrigens habe ich das mit mehreren Druckern probiert.

(Delphi 7 pro, Win 7 64)

Gruß
Mattze
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.869 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: 2 Druckertreiber für 1 Drucker?

  Alt 20. Jun 2014, 15:27
WinSpool ist nicht der Treiber für den Drucker, sondern die Druckerwarteschlange
Markus Kinzler
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#3

AW: 2 Druckertreiber für 1 Drucker?

  Alt 20. Jun 2014, 16:34
Hallo!

Das dachte ich auch und war verwundert: Warum wird es dann in PPrinterInfo2 unter pDriverName angegeben.

Das hilft mir aber nun nicht weiter, weil ich nicht weiß, wie das einzuordnen ist!
Warum zwei Drivernamen? Was ist der richtige?

Gruß
Mattze
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.316 Beiträge
 
Delphi 12 Athens
 
#4

AW: 2 Druckertreiber für 1 Drucker?

  Alt 20. Jun 2014, 17:05
Zitat:
Es reicht nicht, den printerindex entsprechend zu setzen
Ja, in Delphi 7 gibt es einen Bug.
Mindestens seit XE ist das aber repariert.

Mal sehn, ob ich den Bugfix wiederfinde, den ich vor paar Wochen ausgebaut hatte. (denn seit des in Delphi wieder funktioniert, macht nun der Bugfix das kaputt)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#5

AW: 2 Druckertreiber für 1 Drucker?

  Alt 20. Jun 2014, 18:31
Hallo himitsu,

vielen Dank! Dass es ein Bug in Delphi 7 ist, tröstet mich tatsächlich schon ein bisschen. Dann habe nämlich nicht ich wieder mal alles durcheinander gebracht!

Bitte, bitte suche den Bugfix und finde ihn auch! Das wäre super!

Ich bin jetzt soweit, dass ich mit Printer.GetPrinter winspool als Treiber bekomme (oder, je nachdem, wie ich es initialisiere (!) auch den Druckernamen als Treiber!) und mit openprinter den richtigen Port. Wobei ich eben nicht weiß, was winspool als Treiber bedeuten soll.

Aber, irgendwie befriedigt mich das nicht!
Ich denke mir, dass Printer.GetPrinter das ALLES richtig zurückgeben sollte.

Gruß
Mattze
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.316 Beiträge
 
Delphi 12 Athens
 
#6

AW: 2 Druckertreiber für 1 Drucker?

  Alt 22. Jun 2014, 11:44
Ob das jetzt alles ist, kann ich auf die Schnelle nicht sagen.

Delphi-Quellcode:
i := Printer.Printers.IndexOf(Drucker);
if i >= 0 then begin
  Printer.PrinterIndex := i;
  {$IF CompilerVersion <= 16}  // k.A. ab wann es genau wieder funktioniert
  SetPrinterFromData; // richtigen Printer anhand des PrinterIndex setzen
  {$IFEND}
end;
Das war praktisch der hauptsächliche Code, welchen auch vom Printterdialog ausgeführt wird.
Delphi-Quellcode:
procedure GetPrinter(var DeviceMode, DeviceNames: THandle);
var
  Device, Driver, Port: array[0..1023] of char;
  DevNames: PDevNames;
  Offset: PChar;
begin
  Printer.GetPrinter(Device, Driver, Port, DeviceMode);
  if DeviceMode <> 0 then
  begin
    DeviceNames := GlobalAlloc(GHND, SizeOf(TDevNames) +
     StrLen(Device) + StrLen(Driver) + StrLen(Port) + 3);
    DevNames := PDevNames(GlobalLock(DeviceNames));
    try
      Offset := PChar(DevNames) + SizeOf(TDevnames);
      with DevNames^ do
      begin
        wDriverOffset := Longint(Offset) - Longint(DevNames);
        Offset := StrECopy(Offset, Driver) + 1;
        wDeviceOffset := Longint(Offset) - Longint(DevNames);
        Offset := StrECopy(Offset, Device) + 1;
        wOutputOffset := Longint(Offset) - Longint(DevNames);;
        StrCopy(Offset, Port);
      end;
    finally
      GlobalUnlock(DeviceNames);
    end;
  end;
end;


procedure SetPrinter(DeviceMode, DeviceNames: THandle);
var
  DevNames: PDevNames;
begin
  DevNames := PDevNames(GlobalLock(DeviceNames));
  try
    with DevNames^ do
      Printer.SetPrinter(PChar(DevNames) + wDeviceOffset,
        PChar(DevNames) + wDriverOffset,
        PChar(DevNames) + wOutputOffset, DeviceMode);
  finally
    GlobalUnlock(DeviceNames);
    GlobalFree(DeviceNames);
  end;
end;


function CopyData(Handle: THandle): THandle;
var
  Src, Dest: PChar;
  Size: Integer;
begin
  if Handle <> 0 then
  begin
    Size := GlobalSize(Handle);
    Result := GlobalAlloc(GHND, Size);
    if Result <> 0 then
      try
        Src := GlobalLock(Handle);
        Dest := GlobalLock(Result);
        if (Src <> nil) and (Dest <> nil) then Move(Src^, Dest^, Size);
      finally
        GlobalUnlock(Handle);
        GlobalUnlock(Result);
      end
  end
  else Result := 0;
end;


procedure THauptForm.SetPrinterFromData;
var
  PrintDlgRec: TPrintDlg;
  DevHandle: THandle;
begin
  FillChar(PrintDlgRec, SizeOf(PrintDlgRec), 0);
  with PrintDlgRec do
  begin
    lStructSize := SizeOf(PrintDlgRec);
    hInstance := SysInit.HInstance;
    GetPrinter(DevHandle, hDevNames);
    hDevMode := CopyData(DevHandle);
    Flags := PD_ENABLESETUPHOOK or PD_PRINTSETUP;
    //lpfnSetupHook := DialogHook;
    //hWndOwner := Application.Handle;
    //Result := TaskModalDialog(@PrintDlg, PrintDlgRec);
    SetPrinter(hDevMode, hDevNames)
  end;
end;
Ein Therapeut entspricht 1024 Gigapeut.
  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 05:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz