Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Eigener Eigenschaftsdialog für Drucker (https://www.delphipraxis.net/8809-eigener-eigenschaftsdialog-fuer-drucker.html)

Sourcemaker 12. Sep 2003 12:33


Eigener Eigenschaftsdialog für Drucker
 
In meiner Anwendung benutze ich einen eigenen Druckerdialog um die im Programm mit Pseudonym angelegten Drucker auszuwählen.
Das heißt ich habe z.B. 4 mögliche Drucker Formular-1, Formular-2, Fax und Etiketten diese Pseudo-Drucker sind mit Printerindizes der echten Systemdrucker verknüpft. Zu diesen Druckern kann ich jetzt verschiedene Eigenschaften wie Formularränder zu druckende Kopf-/Fuß-BMP´s, eigene Kopierfunktion etc. einstellen.
Das Druckerdialogfenster das ich selber gemacht habe sieht so aus wie ein normaler Printdialog das habe ich alles nachstellen können aber der Button für die Druckereigenschaften hat keine Funktion und die hätte ich nun gerne. Ich habe schon viele Internet-Recherchen durchgeführt aber nichts gefunden.

Für Vorschläge/Lösungen oder Konzepte wäre ich dankbar.

Mfg.

Frank Klose

Mario 12. Sep 2003 13:16

Re: Eigener Eigenschaftsdialog für Drucker
 
Schaue Dir mal die Funktion DocumentProperties an. Die sollte das gewünschte tun.

Suche mal in den Sourcen deiner Komponenten danach. Du solltest da ein Beispiel finden. Ich habe es beim RBuilder gefunden, kann es aber nicht veröffentlichen, da ich mir nicht sicher bin, ob ich das darf §?§

neolithos 12. Sep 2003 13:26

Re: Eigener Eigenschaftsdialog für Drucker
 
Warum machst du nicht eine Vorauswahl, wo man einen Schalter klickt und den Windows-Drucker-Dialog sieht.

Sonst müsstes du ihn in einem Formular nachempfinden.

Sourcemaker 12. Sep 2003 13:36

Re: Eigener Eigenschaftsdialog für Drucker
 
Danke Mario schaue ich mir gerade an sieht aber gruselig aus bin merh auf der Anwendungsentwicklung als in diesen Kellern zu Hause hatte deshalb auf eine etwas simplere Schnittstelle gehofft.

Zu Neo ich habe doch erklärt wieso ich keinen Standarddialog verwende und das ich bereits das Fenster nachgebaut habe.

Danke für die Antworten aber wie gesagt ein fertiger Aufruf wäre schön.

Grüße

Frank

Mario 12. Sep 2003 13:46

Re: Eigener Eigenschaftsdialog für Drucker
 
Evtl. ist es ja das:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  hPrinter: THandle;
  Device : array[0..255] of char;
  Driver : array[0..255] of char;
  Port  : array[0..255] of char;
  hDeviceMode: THandle;
  pDevmodeOut: PDeviceMode;
  bytesNeeded: DWORD;
begin
  Printer.PrinterIndex := combobox1.itemindex;
  Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
  if WinSpool.OpenPrinter(@Device, hPrinter, nil) then
  try
    bytesNeeded := DocumentProperties(
      handle, hPrinter, Device, Nil, Nil, 0 );
    pDevmodeOut := AllocMem( bytesNeeded );
    If IDOK = DocumentProperties(
                Handle, hPrinter, Device, pDevModeOut, Nil,
                DM_OUT_BUFFER or DM_IN_PROMPT )
    Then
    ; // do something intelligent here
    FreeMem( pDevModeOut );
  finally
    WinSpool.ClosePrinter( hPrinter );
  end;
end;
Quelle: http://groups.google.com/groups?hl=d...rties%2Bdelphi

Sourcemaker 12. Sep 2003 16:42

Re: Eigener Eigenschaftsdialog für Drucker
 
Hallo Mario,

besten Dank für Deine Mühe aber poste bitte das ganze Beispiel ein entscheidener Teil fehlte.

Delphi-Quellcode:
function DocumentProperties(hWnd: HWND; hPrinter: THandle; pDeviceName: PChar;
  pDevModeOutput: PDeviceMode; pDevModeInput: PDeviceMode;
  fMode: DWORD): Longint; stdcall;
  external 'winspool.dll' name 'DocumentPropertiesA';
Habe ich dann durch den Link gesehen.
Der Code stimmt aber auch nicht mehr wahrscheinlich war es für ein altes Windows bzw. Delphi gedacht.
Richtiger:

Delphi-Quellcode:
function DocumentProperties(hWnd: HWND; hPrinter: THandle; pDeviceName: PChar;
  pDevModeOutput: PDeviceMode; pDevModeInput: PDeviceMode;
  fMode: DWORD): Longint; stdcall;
  external winspl name 'DocumentPropertiesA';
Damit kommt das Eigenschaftsfenster aber beim schließen in der IDE geht das Programm in den Debugger man kann aber F9 drücken und es läuft ohne Fehler weiter. Außerhalb der IDE keine Meldung.
Mache jetzt Wochenende und teste nächste Woche weiter.

Weitere Ideen oder Fixes sind erwünscht.

Schönes Wochenende und bis bald.

Frank

Mario 15. Sep 2003 07:07

Re: Eigener Eigenschaftsdialog für Drucker
 
Die Deklaration war bei mir nicht notwendig. So lief es dann:
Delphi-Quellcode:
uses
... Printers, WinSpool;

...

procedure TForm1.Button1Click(Sender: TObject);
var
  aDevMode: TDeviceMode;
  hPrinter: THandle;
  Device : array[0..255] of char;
  Driver : array[0..255] of char;
  Port  : array[0..255] of char;
  hDeviceMode: THandle;
  pDevmodeOut: PDeviceMode;
  bytesNeeded: DWORD;
begin
  Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
  if WinSpool.OpenPrinter(@Device, hPrinter, nil) then
  try
    bytesNeeded := DocumentProperties(
      handle, hPrinter, Device, aDevMode, aDevMode, 0 );
    pDevmodeOut := AllocMem( bytesNeeded );
    If IDOK = DocumentProperties(
                Handle, hPrinter, Device, aDevMode, aDevMode,
                DM_OUT_BUFFER or DM_IN_PROMPT )
    Then
    ; // do something intelligent here
    FreeMem( pDevModeOut );
  finally
    WinSpool.ClosePrinter( hPrinter );
  end;
end;

Sourcemaker 15. Sep 2003 13:38

Re: Eigener Eigenschaftsdialog für Drucker
 
Stimmt der Code compiliert und man kann das Fenster auch aufrufen aber sowohl in D5 als auch in D7 kommt eine Zugriffsverletzung wenn man Ok betätigt.
Als nächstes muß ich jetzt noch Quickreport beibringen die gemachten Änderungen zu übernehmen.

Grüße

Frank Klose

Mario 15. Sep 2003 13:41

Re: Eigener Eigenschaftsdialog für Drucker
 
Ok hatte ich nicht probiert :oops:

emkay 24. Sep 2003 14:05

Re: Eigener Eigenschaftsdialog für Drucker
 
Zitat:

Als nächstes muß ich jetzt noch Quickreport beibringen die gemachten Änderungen zu übernehmen.
Und das ist auch mein Problem, allerdings nicht mit Quickreport, sondern allgemein.

Durch "DM_IM_PROMPT". Erscheint ja nun der Druckertreiberdialog.
Wenn ich etwas darin ändere und OK drücke hat sich aber scheinbar nichts in der DEVMODE-Struktur geändert. Beim Nachschauen oder 'nem Druckversuch werden die alten Einstellungen verwendet.

Muss ich da noch irgendwo selbst eingreifen?

Sourcemaker 24. Sep 2003 14:50

Re: Eigener Eigenschaftsdialog für Drucker
 
Hab leider noch nicht weiter geforscht hätte aber zumindest gedacht das der "Windows-Drucker" die Einstellungen übernimmt.
Beim Quickreport habe ich schon damit gerechnet das die Einstellungen übertragen werden müssen.

Für weitere Ergüsse :firejump: dankbar.

Frank

emkay 27. Sep 2003 23:13

Re: Eigener Eigenschaftsdialog für Drucker
 
Hat denn immer noch niemand eine Idee? Ich verzweifel noch!!!

Wie gesagt, es klappt alles ohne Probleme...ich kann per Programmcode den Dialog für die Druckertreibereinstellungen öffnen. (mit DM_IN_PROMPT)
Aber, wenn ich etwas drin ändere (z.B. Auflösung oder Farbe) dann werden die Äänderungen bei OK nicht übernommen. Also, in DEVMODE scheint sich nichts zu ändern. :wall:

emkay 30. Sep 2003 16:41

Re: Eigener Eigenschaftsdialog für Drucker
 
ICH HABS!!! :P

Delphi-Quellcode:
DocumentProperties(Form1.Handle, PrinterHandle,MyPrinter,MDevmode^,MDEVmode^,DM_OUT_BUFFER OR DM_IN_PROMPT OR DM_IN_BUFFER);
Er druckt mit meinen getätigten Einstellungen und beim wiederholten Aufruf sind die Einstellungen geblieben.

Es geht wieder voran...

Ulf346C 15. Okt 2003 14:25

Re: Eigener Eigenschaftsdialog für Drucker
 
@emkay:

Re: ich hab's

hmm... ich (D5) werde die blöden Zugriffsverletzungen nicht los.
Hast du eine Idee :roll:

emkay 15. Okt 2003 20:51

Re: Eigener Eigenschaftsdialog für Drucker
 
Zugriffsverletzungen...ja, die kamen bei mir auch.

Wobei, weiß ich jetzt aber nicht mehr genau.

Wie gehabt, zeig mal Deinen Code, dann sehen wir weiter.

Sourcemaker 23. Okt 2003 10:02

Re: Eigener Eigenschaftsdialog für Drucker
 
Kannst du bitte den kompletten Code posten ?
Benutzt du auch Quickreport ?

Mfg.

Frank

Ulf346C 23. Okt 2003 15:22

Re: Eigener Eigenschaftsdialog für Drucker
 
So,

nun klappt's, ohne Fehlermeldungen.
Warum nun plötzlich weiß ich aber auch nicht :shock:

Mein eigentliches Problem waren wechselnde Papierformate (Etikettendrucker).
So hat es dann geklappt:
Code:

uses [....], printers, winspool;

procedure tEditLager.Papierformat;
 var
   Device, Driver, Port: array[0..80] of Char;
   DevMode: THandle;
   pDevmode: PDeviceMode;
 begin
   Printer.GetPrinter(Device, Driver, Port, DevMode);
   Printer.SetPrinter(Device, Driver, Port, 0) ;
   Printer.GetPrinter(Device, Driver, Port, DevMode);
   If Devmode <> 0 Then Begin
     pDevMode := GlobalLock( Devmode );
     If pDevmode <> Nil Then
     try
       With pDevmode^ Do Begin
     {   dmPapersize := DMPAPER_A4;
         dmFields := dmFields or DM_PAPERSIZE; }
         dmPapersize := DMPAPER_USER;
         dmPaperLength := 140;
         dmPaperwidth := 800;
         dmFields := dmFields or DM_PaperSize or DM_PAPERLength or dm_paperWidth;
       End;
    finally
      GlobalUnlock( Devmode );
    end;
   End; { If }
end;

ts_abc 22. Dez 2003 06:38

Re: Eigener Eigenschaftsdialog für Drucker
 
Hallo,

Ich Schreibe mal noch mit Aufruf des Eigenschaftsdialoges. So funktioniert es ohne Fehler. :)

Delphi-Quellcode:
uses [....], printers, winspool;

procedure PrinterSitting(hwnd: HWND);
var
  aDevMode: PDeviceMode;
  hPrinter: THandle;
  Device : array[0..255] of char;
  Driver : array[0..255] of char;
  Port  : array[0..255] of char;
  hDeviceMode: THandle;
begin
  Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
  if WinSpool.OpenPrinter(@Device, hPrinter, nil) then
  try
    aDevMode := GlobalLock(hDeviceMode);
    DocumentProperties(hwnd, hPrinter, Device, aDevMode^, aDevMode^,
      DM_OUT_BUFFER or DM_IN_PROMPT or DM_IN_BUFFER );
    GlobalUnlock( hDeviceMode );
  finally
    WinSpool.ClosePrinter( hPrinter );
  end;
end;
Gruß
ts_abc


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:51 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