AGB  ·  Datenschutz  ·  Impressum  







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

Druckproblem

Ein Thema von Sämy · begonnen am 18. Apr 2008 · letzter Beitrag vom 19. Apr 2008
Antwort Antwort
Sämy

Registriert seit: 4. Nov 2004
Ort: Basel (CH)
76 Beiträge
 
Delphi 2007 Professional
 
#1

Druckproblem

  Alt 18. Apr 2008, 15:19
Hallo

Ich bin am Verzweifeln... Ich probiere auf einem Drucker aus einem bestimmten Papierfach zu drucken.
Mein Vorgehen:

Als erstes wähle ich den Drucker:
  Printer.PrinterIndex := Printer.Printers.indexOf(printername); Danach selektiere ich das Papierfach:
Delphi-Quellcode:
printer.setPaperTrayIndex(printer.getPaperTrays.indexOf(trayname));

[...]

function TSZPrinter.getPaperTrays: TStrings;
var
  pDevMode: PDeviceMode;
  bin: array[0..255,0..23] of Char;
  x: integer;
  res: integer;
begin
  if not Assigned(FPaperTrays) then
    FPaperTrays := TStringList.Create;
  FPaperTrays.Clear;

  GetPrinter(aDevice, aDriver, aPort, hDMode);
  pDevMode := nil;

  res := DeviceCapabilities(aDevice, aPort, DC_BINNAMES, PChar(@(bin[0][0])), pDevMode);
  for x := 0 to res - 1 do
    FPaperTrays.Add(bin[x]);
  Result := FPaperTrays;
end;

procedure TSZPrinter.setPaperTrayIndex(value: integer);
var
  pDevMode: PDeviceMode;
  p: array [0..99] of Word;
  res: integer;
begin
  if Printing then
    raise EPrinter.Create(SPrinting);

  if (value < 0) or (value >= PaperTrays.Count) then
    Exit;

  FPaperTrayIndex := Value;
  GetPrinter(aDevice, aDriver, aPort, hDMode);

  if hDMode = 0 then
  begin
    SetPrinter(aDevice, aDriver, aPort, hDMode);
    GetPrinter(aDevice, aDriver, aPort, hDMode);
  end;

  pDevMode := nil;
  res := DeviceCapabilities(aDevice, aPort, DC_BINS,PCHAR(@p[0]), pDevMode);
  if (FPaperTrayIndex <= res) and (hDMode <> 0) then
  begin
    pDevMode := GlobalLock(hDMode);
    if Assigned(pDevMode) then
    begin
      pDevMode^.dmFields := pDevMode^.dmFields or DM_DEFAULTSOURCE; // <----
      pDevMode^.dmDefaultSource := p[FPaperTrayIndex];
    end;
    GlobalUnlock(hDMode);
  end;
end;
Mein Problem liegt nun dabei, dass wenn ich drucke, nicht das richtige Papierfach gewählt wird.
Ich habe bemerkt, dass die Eigenschaft pDevMode^.dmDeviceName (lese ich per debugger an der mit <---- gekennzeichneten Stelle aus) nicht den richtigen Druckernamen angibt.
Weiter habe ich bemerkt, dass es bei einzelnen Druckern funktioniert, wenn ich den Schacht nicht per Namen, sondern direkt über dessen Id selektiere.

Kann mir jemand einen Tipp geben, wie ich dieses Problem lösen könnte?

Danke
Sämy
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#2

Re: Druckproblem

  Alt 19. Apr 2008, 13:43
Hallo Sämy,

hab schon lang nix mehr mit der unit printers gemacht und aktuell auch keinen drucker zur verfügung. Was ich mich frage ist, weshalb nimmste nicht RAVE? ist doch in D2007 mit dabei und die haben das schon implementiert, den druckerschachtwechsel. Über das Codebased Printing, biste da auch recht flexibel, ausserdem haste dann schon einige features (z. B. Seitenvorschau) welche du verwendeten kannst, wenn du Lust und Laune hast.

grüsse
GG
  Mit Zitat antworten Zitat
Sämy

Registriert seit: 4. Nov 2004
Ort: Basel (CH)
76 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Druckproblem

  Alt 19. Apr 2008, 15:05
Mein Problem ist, dass ich diese Methode bereits an vielen Orten einsetze.
hat bis jetzt mit allen Druckern funktioniert. Ausser eben jetzt, da ich auf ein anderes Papierformat als A4 drucken will... (ka, wieso dies nicht auch funktionieren soll)

Auf Rave umzustellen wäre ein enormer Zeitaufwand... Diese Zeit habe ich jedoch nicht. :s
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.
  Mit Zitat antworten Zitat
Sämy

Registriert seit: 4. Nov 2004
Ort: Basel (CH)
76 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Druckproblem

  Alt 19. Apr 2008, 19:27
Hab es selbst rausgefunden.
Da ich von der Klasse TPrinter ableitete, musste ich beim ändern der Eigenschaft PrinterIndex noch SetPrinter aufrufen:

Delphi-Quellcode:
procedure TSZPrinter.setPrinterIndex(value: integer);
begin
  inherited PrinterIndex := value;

  { Reinit the hDMode }
  GetPrinter(aDevice, aDriver, aPort, hDMode);
  hDMode := 0;
  SetPrinter(aDevice, aDriver, aPort, hDMode);
end;
Danke trotzdem!
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.
  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:39 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