Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi D2009 und PrinterSetupDialog (https://www.delphipraxis.net/138669-d2009-und-printersetupdialog.html)

KEK 14. Aug 2009 18:16


D2009 und PrinterSetupDialog
 
Hallo Ihr da draußen ...
ich hab ein kleine Problemchen mit Delphi 2009 was über meinen Wissenshorizont geht.
Aufgefallen ist mir folgendes:

PrinterSetupDialog bringt stehts nur die Vorgabe für den Standarddrucker :-(
PrinterIndex:= x und anschließendes auslesen von Printer.Handle bringt auch das richtige Handle
In D7 funktioniert (PrinterSetupDialog) ohne Probleme > also richtiger Drucker und dazugehörigen Einstellungen werden beim Aufruf
angezeigt.

Auch das wiederherstellen von Druckereinstellungen aus einer Datei will nich
a la .. Printer.SetPrinter(SetupPrinter.ADevice, SetupPrinter.ADriver, #0, ADeviceMode);

Obwohl ich mir hier eben nicht sicher bin, ob vor dem schreiben der Daten in die Datei denn die richtigen Druckerwerte ausgelesen werden (siehe Verhalten von PrinterSetupDialog).

Kann einer helfen ?

Danke + Gruß Kurti

S - tefano 19. Aug 2009 00:46

Re: D2009 und PrinterSetupDialog
 
Sorry dass ich Dir durch die etwaige Benachrichtigungsmail falsche Hoffnungen mache ;)

Ich sitze gerade vor dem selben Problem. Das Setzen des Printers habe ich in einer anderen Unit, aber afaik gilt das Setzen über PrinterIndex ja jeweils für die ganze Applikation
Ich bin mir übrigens ziemlich sicher, dass das Setzen selbst (bei Deinem Abspeichern weiß ichs nicht..) funktioniert. Wenn ich nämlich über mein Formular einen Drucker wähle (nicht-Standard), den PrinterSetupDialog aufrufe, sehe dass der Standard-Drucker gewählt ist, abbreche und mir nach dem Schließen über die Printers-Unit nochmal sagen lasse, welcher Drucker gerade gewählt ist, dann ist es immernoch der, den ich vorher eingestellt hab. Hui, viele Kommas. Sorry.

Es scheint mir, als gäbs einen irgendwie gearteten Fehler beim PrinterSetupDialog der eben bewirkt, dass dieser Dialog nicht weiß welcher Drucker vorher über das Programm gewählt wurde. Aber ehrlich gesagt blicke ich nicht so ganz durch, wo der Fehler sein könnte. Ich unterstelle mal, es ist irgendwo in "GetPrinter", dass dort nicht das richtige Handle zurückgegeben wird - oder so.

Wenn ich im PrinterSetupDialog auf OK gehe, wechselt übrigens auch die Anzeige des gewählten Druckers entsprechend zu dem, der im Dialog stand.
Zu guter letzt: Wenn ich von meinem Programm aus einen Drucker wähle und eine Testseite ausgebe, kommt die auch dort an, wo ich es mir gewünscht habe.

Kann doch irgendwie nicht sein, dass man dem User sagen muss "Nicht erschrecken, der Dialog öffnet mit dem Standarddrucker, egal was Du mir grad gesagt hast". Ich werde mal gucken, ob es so einen Dialog vielleicht von Drittanbietern gibt.

Sonst noch Vorschläge? ^^

Viele Grüße,

Stefan

KEK 19. Aug 2009 06:13

Re: D2009 und PrinterSetupDialog
 
Hallo
... bin aber fast beruhigt, dass ich nich der Einzige bin.
Hab leider noch nich weiter forschen können.
Wenn du was weißt > sag mir's bitte ja ? Sollte ich was 'hinbekommen' geb ich's natürlich auch weiter.

Gruß Kurti

S - tefano 19. Aug 2009 11:24

Re: D2009 und PrinterSetupDialog
 
Interessant wäre vielleicht, wenn es denn wirklich ein Fehler auf seiten der Dialogimplementierung der 2009er Version ist, zu sehen wie der Execute- oder GetPrinter-Code einer Version aussieht, wo dieses Problem nicht auftritt.

KEK 20. Aug 2009 13:00

Re: D2009 und PrinterSetupDialog
 
Zitat:

Zitat von S - tefano
Interessant wäre vielleicht, wenn es denn wirklich ein Fehler auf seiten der Dialogimplementierung der 2009er Version ist, zu sehen wie der Execute- oder GetPrinter-Code einer Version aussieht, wo dieses Problem nicht auftritt.

Also zB die Unit Printer und Dialogs zwischen D7 und D2009 vergleichen ?
Das hatte ich schon - da reicht aber mein Tiefenwissen nicht aus um Schlüsse zu ziehen :-(

S - tefano 20. Aug 2009 22:06

Re: D2009 und PrinterSetupDialog
 
Genau, so mein ich das. Ich hab keine Ahnung ob ich da was erkennen würde, aber wenn bei beiden Methoden der Code im Prinzip gleich ist, könnte man das schonmal als Fehlerquelle ausschließen.

KEK 21. Aug 2009 06:16

Re: D2009 und PrinterSetupDialog
 
Liste der Anhänge anzeigen (Anzahl: 4)
Zitat:

Zitat von S - tefano
Genau, so mein ich das. Ich hab keine Ahnung ob ich da was erkennen würde, aber wenn bei beiden Methoden der Code im Prinzip gleich ist, könnte man das schonmal als Fehlerquelle ausschließen.

kann ich dir gerne senden - Unterschiede gibt es schon .. so wird zB in in D12 vor Aufruf des Dialogs der DevMode zurückgesetzt,
was in D7 nich getan wird.

S - tefano 21. Aug 2009 10:50

Re: D2009 und PrinterSetupDialog
 
Das mit dem DevMode zurücksetzen habe ich jetzt garnicht gefunden...das einzige wo mir nennenswerte Unterschiede aufgefallen sind, ist in Dialogs die jeweilige Prozedur GetPrinter. Da werden die Offsets in D7 noch zu Longint gecastet, in D12 gehts über PChar.
Ich kann mir aber nicht so richtig vorstellen, dass es daran wirklich liegt :/

Bernhard Geyer 21. Aug 2009 11:01

Re: D2009 und PrinterSetupDialog
 
Hilft das QC-Eintrag?

S - tefano 21. Aug 2009 11:36

Re: D2009 und PrinterSetupDialog
 
Interessant: Ich hab zwar auch D2009, aber in meiner GetPrinter findet sich ein Mix aus der D7er und D12-Version. Desweiteren gut, dass die das Problem überhaupt kennen.
Nur leider: Der Dialog verhält sich nach der Änderung genauso wie vorher. Es wird immer der Standarddrucker angezeigt, selbst wenn man in nem vorherigen PrinterSetupDialog noch einen anderen ausgewählt hat.

Ich kann übrigens in der Dialogs.pas keinen richtigen Breakpoint setzen...weiß jemand wieso?

Bernhard Geyer 21. Aug 2009 11:59

Re: D2009 und PrinterSetupDialog
 
Zitat:

Zitat von S - tefano
Nur leider: Der Dialog verhält sich nach der Änderung genauso wie vorher.

Du mußt die Datei in dein eigenes Souceverzeichnis kopieren (oder in ein Verzeichnis der Art "D2009-Fix") damit die gefixte Version statt der schon vorhandenen DCU gezogen wird.

Zitat:

Zitat von S - tefano
Ich kann übrigens in der Dialogs.pas keinen richtigen Breakpoint setzen...weiß jemand wieso?

Das gleiche wie oben. Ansonsten wird die DCU ohne Debug-Infos gezogen.

S - tefano 21. Aug 2009 12:19

Re: D2009 und PrinterSetupDialog
 
Woah, nicht zu fassen, es funktioniert! :)
Superduper, vielen Dank für den Tipp. Ohne dieses Interna-Wissen Deinerseits hätte ich da ja noch ewig rumraten können ;)

KEK 21. Aug 2009 17:44

Re: D2009 und PrinterSetupDialog
 
Zitat:

Zitat von S - tefano
Woah, nicht zu fassen, es funktioniert! :)
Superduper, vielen Dank für den Tipp. Ohne dieses Interna-Wissen Deinerseits hätte ich da ja noch ewig rumraten können ;)

Hallo hatte nich viel Zeit hab's nur mal überflogen ---
also soll der Abschnitt in GetPrinter

Delphi-Quellcode:
try
      Offset := PChar(PByte(DevNames) + SizeOf(TDevnames));
      with DevNames^ do
      begin
        wDriverOffset := Offset - PChar(DevNames);
        Offset := StrECopy(Offset, Driver) + 1;
        wDeviceOffset := Offset - PChar(DevNames);
        Offset := StrECopy(Offset, Device) + 1;
        wOutputOffset := Offset - PChar(DevNames);;
        StrCopy(Offset, Port);
      end;
    finally
      GlobalUnlock(DeviceNames);
    end;
nun so aussehen ?

Delphi-Quellcode:
 try
      Offset := PChar(PByte(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;
Wenn nicht könntes mir deine fertige Unit mal ranhängen ???
Wär nett -- hab am WE keine Zeit und könnte am Momtag noch die Änderungen wegschicken.

Danke Kurti

[edit=mkinzler]Delphi-Tags eingefügt Mfg, mkinzler[/edit]

BlueStarHH 21. Aug 2009 17:56

Re: D2009 und PrinterSetupDialog
 
Komisch, bei mir mit Delphi 2009 und XP klappt das QC-Beispiel aus Beitrag #9 ohne Probleme. Der Drucker wird gewechselt.

Delphi-Quellcode:
Printer.PrinterIndex := 0;
PageSetupDialog1.Execute;
Printer.PrinterIndex := 1;
PageSetupDialog1.Execute;

S - tefano 21. Aug 2009 18:53

Re: D2009 und PrinterSetupDialog
 
KEK: Genau andersrum ;)
Der untere Ausschnitt den Du gepostet hast, müsste der sein der jetzt momentan in Deinem GetPrinter steht. Der darüber (der ohne Longint) ist der, wie er aussehen muss um zu funktionieren. Desweiteren noch den Hinweis von Bernhard beachten, dass die modifizierte Dialogs.pas bspw. in Deinem Programmverzeichnis liegen sollte.

BlueStarHH: Hm. Wirklich komisch ^^
Wie sieht denn GetPrinter in Dialogs.pas bei Dir aus? Hab grob die gleiche Konfiguration (D2009 und XP)..

KEK 21. Aug 2009 19:12

Re: D2009 und PrinterSetupDialog
 
[quote="S - tefano"]KEK: Genau andersrum ;)
Der untere Ausschnitt den Du gepostet hast, müsste der sein der jetzt momentan in Deinem GetPrinter steht. Der darüber (der ohne Longint) ist der, wie er aussehen muss um zu funktionieren. Desweiteren noch den Hinweis von Bernhard beachten, dass die modifizierte Dialogs.pas bspw. in Deinem Programmverzeichnis liegen sollte.

Na das hat mich doch verwirrt .. meine dialogs.pas hatte ich ja schon mit ragehängt ... und die ist eben mit
Delphi-Quellcode:
wDriverOffset := Offset - PChar(DevNames);
:-((

Habs schnell mal mit beiden Syntax compiliert ... getestet auf Win2003 x86 (also auch XP) Win2008 und 2008R2, WIn 7 x86 u. x64 RTM = nöö geht nich = also kein 'Fehler' vom BS sondern im D12 Programm.

Kannst mir nicht deine Unit mal reinkopieren, wenn du sagt 'es geht jetzt' ???
Danke + Gruß Kurti

BlueStarHH 21. Aug 2009 19:18

Re: D2009 und PrinterSetupDialog
 
Zitat:

Zitat von S - tefano
BlueStarHH: Hm. Wirklich komisch ^^
Wie sieht denn GetPrinter in Dialogs.pas bei Dir aus? Hab grob die gleiche Konfiguration (D2009 und XP)..

So sieht GetPrinter bei mir aus (OK mit D2009 unter XP):
Delphi-Quellcode:
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) * SizeOf(Char));
    DevNames := PDevNames(GlobalLock(DeviceNames));
    try
      Offset := PChar(PByte(DevNames) + SizeOf(TDevnames));
      with DevNames^ do
      begin
        wDriverOffset := Offset - PChar(DevNames);
        Offset := StrECopy(Offset, Driver) + 1;
        wDeviceOffset := Offset - PChar(DevNames);
        Offset := StrECopy(Offset, Device) + 1;
        wOutputOffset := Offset - PChar(DevNames);;
        StrCopy(Offset, Port);
      end;
    finally
      GlobalUnlock(DeviceNames);
    end;
  end;
end;

S - tefano 21. Aug 2009 19:50

Re: D2009 und PrinterSetupDialog
 
Liste der Anhänge anzeigen (Anzahl: 1)
Jo, dann hast Du aus irgendeinem Grund die richtige Version ;)

@KEK: Hab sie Dir mal angehängt, wenn die so im Programmverzeichnis liegt funktionierts bei mir.

BlueStarHH 21. Aug 2009 19:59

Re: D2009 und PrinterSetupDialog
 
Zitat:

Zitat von S - tefano
Jo, dann hast Du aus irgendeinem Grund die richtige Version ;)

Habt ihr alle auch die gesamten Updates für Delphi 2009 installiert?

S - tefano 21. Aug 2009 20:05

Re: D2009 und PrinterSetupDialog
 
Hab letztens schonmal danach geguckt, aber nicht gefunden wos die gibt ;)
Laut Delphi-Info hab ich Updates 1 und 2...

mkinzler 21. Aug 2009 20:10

Re: D2009 und PrinterSetupDialog
 
Es gibt aber noch mehr Updates
http://cc.embarcadero.com/item/26921

S - tefano 21. Aug 2009 20:14

Re: D2009 und PrinterSetupDialog
 
Jo, das hab ich auch grad gefunden ^^

KEK 24. Aug 2009 20:18

Re: D2009 und PrinterSetupDialog
 
Da ich nun heut erst schauen konnte .. scheinen ja alle 'Glücklich' zu sein :-)
Nur ich leider nich - hab mal ne offizielle Anfrage gemacht - da es definitiv bei mir nich will trotz der hier aufgeführten Unit-Version.
Mal sehen was da kommt - wird sich wohl auch nur auf das Update berufen werden - was ich ja schon lange habe.
Sollte einer doch noch ne Idee haben - oder wie hier anklang eine ander Version der Dialogs.pas - wär ich recht dankbar.

Gruß Kurti


Alle Zeitangaben in WEZ +1. Es ist jetzt 12: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-2025 by Thomas Breitkreuz