![]() |
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 |
Re: Eigener Eigenschaftsdialog für Drucker
Schaue Dir mal die Funktion
![]() 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 §?§ |
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. |
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 |
Re: Eigener Eigenschaftsdialog für Drucker
Evtl. ist es ja das:
Delphi-Quellcode:
Quelle:
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; ![]() |
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:
Habe ich dann durch den Link gesehen.
function DocumentProperties(hWnd: HWND; hPrinter: THandle; pDeviceName: PChar;
pDevModeOutput: PDeviceMode; pDevModeInput: PDeviceMode; fMode: DWORD): Longint; stdcall; external 'winspool.dll' name 'DocumentPropertiesA'; Der Code stimmt aber auch nicht mehr wahrscheinlich war es für ein altes Windows bzw. Delphi gedacht. Richtiger:
Delphi-Quellcode:
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.
function DocumentProperties(hWnd: HWND; hPrinter: THandle; pDeviceName: PChar;
pDevModeOutput: PDeviceMode; pDevModeInput: PDeviceMode; fMode: DWORD): Longint; stdcall; external winspl name 'DocumentPropertiesA'; Mache jetzt Wochenende und teste nächste Woche weiter. Weitere Ideen oder Fixes sind erwünscht. Schönes Wochenende und bis bald. Frank |
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; |
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 |
Re: Eigener Eigenschaftsdialog für Drucker
Ok hatte ich nicht probiert :oops:
|
Re: Eigener Eigenschaftsdialog für Drucker
Zitat:
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? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:17 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-2025 by Thomas Breitkreuz