AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Druckdialog Einstellungen ohne VCL
Thema durchsuchen
Ansicht
Themen-Optionen

Druckdialog Einstellungen ohne VCL

Ein Thema von Luckie · begonnen am 6. Mai 2003 · letzter Beitrag vom 24. Sep 2003
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Druckdialog Einstellungen ohne VCL

  Alt 6. Mai 2003, 18:50
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ß?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Druckdialog Einstellungen ohne VCL

  Alt 6. Mai 2003, 19:05
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 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.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3
  Alt 6. Mai 2003, 19:19
Ja das habe ich auch schon gefunden. Nur wo ein Handle hernehmen, wenn nicht stehlen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#4
  Alt 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.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#5
  Alt 6. Mai 2003, 20:05
Habe leider keinen Drucker zum Testen zur Hand, aber probier´s mal damit:
Move(pd.hDevMode,dm,sizeof(TDevMode)); Verursacht zumindest keinen Fehler.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6
  Alt 6. Mai 2003, 20:49
Kompilieren tut er, nur wird nicht auf Querformat umgeschaltet im Druckdialog.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#7
  Alt 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. 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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8
  Alt 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ß.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
emkay

Registriert seit: 24. Sep 2003
9 Beiträge
 
#9

Re: Druckdialog Einstellungen ohne VCL

  Alt 24. Sep 2003, 21:33
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Druckdialog Einstellungen ohne VCL

  Alt 24. Sep 2003, 21:38
Puh, hast du mal auf das Datum gekuckt? Aber hattest recht, das Problem war noch nicht gelöst. Wird aber demnächst wieder aktuell.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:22 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