Delphi-PRAXiS
Seite 1 von 2  1 2      

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?


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:09 Uhr.
Seite 1 von 2  1 2      

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