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 Druckdialog Einstellungen ohne VCL (https://www.delphipraxis.net/4625-druckdialog-einstellungen-ohne-vcl.html)

Luckie 6. Mai 2003 18:50


Druckdialog Einstellungen ohne VCL
 
So, ich habe einen Druckdialog, der auch wunderbar funktioniert. Nur ist es erforderlich, dass man beim Drucken Querformat auswählt, sonst wird das nichts.

Dazu muß man die DEVMODE-Struktur füllen. Und diese dann an die PRINTDLG-Struktur übergeben:
Delphi-Quellcode:
var
  pd  : TPrintDlg;
  dm  : TDevMode;
begin
  ZeroMemory(@pd, sizeof(TPrintDlg));
  Zeromemory(@dm, sizeof(TDevMode));
  dm.dmOrientation := DMORIENT_LANDSCAPE;
  pd.lStructSize := sizeof(TPrintDlg);
  pd.hWndOwner  := hWnd;
  pd.Flags      := PD_ALLPAGES or PD_COLLATE or PD_RETURNDC or PD_NOSELECTION;
  pd.hDevMode   := dm; // <- Hier sagt er mir: [Fehler] Inkompatible Typen: 'Cardinal' und '_devicemodeA'
  pd.nCopies    := 1;
Weiß jemand, wie ich das richtig machen muß?

Chewie 6. Mai 2003 19:05

Re: Druckdialog Einstellungen ohne VCL
 
Zitat:

Zitat von Luckie
Weiß jemand, wie ich das richtig machen muß?

Das weiß ich nicht, aber ich sehe, was du falsch gemacht hast. Die TPrintDLg-Struktur verlangt ha in hDevMode ein Handle auf die DevMode-Struktur, nicht ein Zeiger auf die Struktur oder die Struktur selber. Bei der PrintDlg-Funktion steht ja folgendes über dieses Feld dabei:
Zitat:

Zitat von MSDN
Handle to a movable global memory object that contains a DEVMODE structure

Was genau damit gemeint ist, steht nicht so klar dabei, aber vielleicht kannst du damit was anfangen.

Luckie 6. Mai 2003 19:19

Ja das habe ich auch schon gefunden. Nur wo ein Handle hernehmen, wenn nicht stehlen. :mrgreen:

Chewie 6. Mai 2003 19:21

Ich hab gerade mal im SDK bisschen rumgelesen. HeapAlloc
Zitat:

allocates a block of memory from a heap
, aber
Zitat:

The allocated memory is not movable
. Vielleicht findest du herraus, wie man ein "movable block of memory" erzeugt.

MathiasSimmack 6. Mai 2003 20:05

Habe leider keinen Drucker zum Testen zur Hand, aber probier´s mal damit:
Delphi-Quellcode:
Move(pd.hDevMode,dm,sizeof(TDevMode));
Verursacht zumindest keinen Fehler. :)

Luckie 6. Mai 2003 20:49

Kompilieren tut er, nur wird nicht auf Querformat umgeschaltet im Druckdialog. :cry:

MathiasSimmack 7. Mai 2003 07:53

Sorry, Luckie, kann ja auch nicht gehen. Rein logisch, meine ich. Ich versuche ja den Inhalt eines Records auf eine Cardinal-Variable zu übertragen. :oops: Als Anregung hätte ich jetzt noch das hier
Delphi-Quellcode:
var
  hdm : THandle;
  pdm : PDevMode;
begin
  hdm := GlobalAlloc(GMEM_MOVEABLE or GMEM_ZEROINIT,
    sizeof(TDevMode));
  pdm := GlobalLock(hdm);

  pdm^.dmDeviceName := 'Druckername';
  pdm^.dmSize       := sizeof(TDevMode);
  pdm^.dmOrientation := DMORIENT_LANDSCAPE;


  { ... }
  pd.hDevMode       := hdm;
  { ... }


  GlobalFree(hdm);
end;
Er bringt zwar den Dialog zum Vorschein (wenn der Druckername stimmt!), aber stellt auch nicht auf Querformat um. Entweder habe ich was vergessen, oder so funktioniert´s auch nicht. :(

Luckie 7. Mai 2003 13:42

Verdammt. Es muß doch eine Möglichkeit geben, das Querformat voreinzustellen. Ich kann ja nicht in der Readme schreiben, dass man Querformat auswählen muß. :cry:

emkay 24. Sep 2003 21:33

Re: Druckdialog Einstellungen ohne VCL
 
Ich weiß nicht ob Dein Problem schon gelöst ist, ich hab aber noch einen Tip!

Die Devmode-Struktur besitzt noch eine Variable dmFields. Jedes Bit dieser Variable repräsentiert einen Flag zu einer Einstellung. Diese Flags müssen jedoch extra initialisiert werden!!! Den nur initialisierte Einstellungen werden berücksichtigt.

In Deinem Fall müsste es heißen:


pdm.dmFields := pdm.dmFields OR DM_ORIENTATION;


Hoffe geholfen zu haben!!

emkay

Luckie 24. Sep 2003 21:38

Re: Druckdialog Einstellungen ohne VCL
 
Puh, hast du mal auf das Datum gekuckt? Aber hattest recht, das Problem war noch nicht gelöst. Wird aber demnächst wieder aktuell. :mrgreen:


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

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