Toon posts:

[Delphi] TPrintDialog met "afdruk voorbeeld" knop*

Pagina: 1
Acties:

Verwijderd

Topicstarter
Is het op een of andere manier toch mogelijk om een afdruk voorbeeld knop op een standaard TPrintDialog scherm te krijgen?

Ik heb het zelf niet kunnen vinden in de MSDN, maar misschien is het mogelijk met een of andere hack.

Vind het trouwens wel een beetje vreemd. Want je moet dus de gebruiker eerst al een scherm laten zien, waar die op een knop kan drukken en vervolgens een voorbeeld te zien krijgt. Daarna ga je de selectie bepalen, type printer, enz... bij het TPrintDialog scherm.

Dus eigenlijk heeft het pas zin om een voorbeeld te zien, wanneer die instellingen gedaan zijn door de gebruiker, dus bij het TPrintDialog scherm. Dus ik snap echt niet waarom het zo ontworpen is.

edit:

Topic titel is op 1 of andere manier niet goed verstuurd. Kan iemand hem aanpassen?

Moet inkomen: TPrintDialog met "afdruk voorbeeld" knop

[ Voor 11% gewijzigd door Verwijderd op 05-01-2004 20:05 ]


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

De reden van deze ontwerp is dat een programma eigenlijk los staat van de printer, Het programma vertelt tegen windows wat er geprint moet worden, en windows zorgt daarvoor. Het programma bepaald dus het formaat ( A4 / A3 / Paper/ whatever) waarop geprint moet worden. De gebruiker kan dan uiteindelijk beslissen om het stiekum op een ander formaat te printen.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

En jij zorgt voor het afdrukvoorbeeld? Je zou het scherm zelf kunnen namaken. Alle instellingen die daar op staan kan je ook gewoon zelf doen.

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
Ja maar je hebt ook de keuze:

-Alles afdrukken
-Selectie
-Pagina 1...7

enz...

Die doe je pas bij het TPrintDialog scherm. Als je dan op afdruk voorbeeld drukt, zie je ook daadwerkelijk de informatie die de gebruiker wil zien.

Verwijderd

Topicstarter
LordLarry schreef op 05 januari 2004 @ 20:32:
En jij zorgt voor het afdrukvoorbeeld? Je zou het scherm zelf kunnen namaken. Alle instellingen die daar op staan kan je ook gewoon zelf doen.
Uiteraard. Maar ik wil eerst zeker weten dat het toch niet mogelijk met een hack ofzo. Scheelt namelijk een hoop werk + het voordeel dat je dan de windows dialog gebruikt (dus uptodate bij welke windows versie) ipv een eigen gemaakte.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Tis al een hele oude printerdialog hoor. De nieuwe die 2000/XP ziet er weer heel anders uit :) Je zal componenten moeten injecteren op het bestaande form. Geloof mij, tis echt veel simpeler om het zelf opnieuw te doen. Als je het niet (helemaal) zelf wil doen kan je nog kijken naar http://www.luziusschneider.com/PrintDialogExGeHome.htm en http://home11.inet.tele.dk/BakSoft/PBPrinterSetupDialog.htm

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
LordLarry schreef op 05 januari 2004 @ 21:42:
Tis al een hele oude printerdialog hoor. De nieuwe die 2000/XP ziet er weer heel anders uit :) Je zal componenten moeten injecteren op het bestaande form. Geloof mij, tis echt veel simpeler om het zelf opnieuw te doen. Als je het niet (helemaal) zelf wil doen kan je nog kijken naar http://www.luziusschneider.com/PrintDialogExGeHome.htm en http://home11.inet.tele.dk/BakSoft/PBPrinterSetupDialog.htm
Ja ik was al begonnen met het zelf maken van het scherm. Die 2 links heb ik inderdaad al gedownload, staat zeker nuttige informatie.

Maar iig bedankt voor het meedenken.

Verwijderd

Topicstarter
Inmiddels werkt het helemaal, maar ik heb nog 2 vragen:

Boven aan het scherm (in het zelf gemaakte Print Dialog scherm) heb ik dus een combobox om de printer te selecteren. Daaronder staan de velden:

-Status
-Type
-Waar
-Opmerking

Deze informatie velden vul ik m.b.v. de API GetPrinter en vraag ik een PRINTER_INFO_2 record op. Dit record heeft het veld status die een combinatie kan zijn van een X aantal mogelijkheden.

Is het mogelijk om de tekst van die status op te vragen i.p.v. de integer waarde die je terug krijgt. (Die zijn natuurlijk aanwezig). Dus misschien is er een soort convert functie??

Dus bijv: status van de GetPrinter geeft terug PRINTER_STATUS_DOOR_OPEN

ik wil dan een string krijgen: 'De klep is open'


Verder wil ik dat bij dat status labeltje, altijd de actuele waarde staat. Nu dacht ik eerst om te reageren op een WM_SPOOLERSTATUS message en dan vervolgens de status van de geselecteerde printer opnieuw op te vragen. Echter dat werkt niet. Met welke trigger kan ik dit doen?

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Nee, beide zal je zelf moeten maken. Bij de laatste zal je moeten gaan pollen. Om de zoveel tijd de status opvragen dus.

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
LordLarry schreef op 07 januari 2004 @ 10:34:
Nee, beide zal je zelf moeten maken. Bij de laatste zal je moeten gaan pollen. Om de zoveel tijd de status opvragen dus.
Oke, bedankt.

Verwijderd

Topicstarter
Voor degene die dit ook nog een keer nodig hebben, is hier de code:


Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
procedure Tfrm_Afdrukken.FormCreate(Sender: TObject);
begin
  cmbbx_PrinterNaam.Items.Assign(Printer.Printers);
  cmbbx_PrinterNaam.ItemIndex := Printer.PrinterIndex;
  cmbbx_PrinterNaamChange(Self);
end;

procedure Tfrm_Afdrukken.tim_PrinterStatusTimer(Sender: TObject);
begin
  cmbbx_PrinterNaamChange(Self);
end;

procedure Tfrm_Afdrukken.cmbbx_PrinterNaamChange(Sender: TObject);
var hPrinter: THandle;
    pInfo: PPrinterInfo2;
    bytesNeeded: DWORD;
begin
  Printer.PrinterIndex := cmbbx_PrinterNaam.ItemIndex;

  if OpenPrinter(PChar(cmbbx_PrinterNaam.Text), hPrinter, nil) then
  begin
    try
      GetPrinter(hPrinter, 2, nil, 0, @bytesNeeded);
      pInfo := AllocMem(bytesNeeded);
      try
        GetPrinter(hPrinter, 2, pInfo, bytesNeeded, @bytesNeeded);
        with pInfo^ do
        begin
          if cJobs = 0 then
            lbl_PrinterStatusData.Caption := 'Niet-actief'
          else
            lbl_PrinterStatusData.Caption := 'Bezig met afdrukken: ' + InttoStr(cJobs) + ' document(en) in wachtrij';

          if (Status and PRINTER_STATUS_BUSY) <> 0 then lbl_PrinterStatusData.Caption := 'Printer is bezig';
          if (Status and PRINTER_STATUS_DOOR_OPEN) <> 0 then lbl_PrinterStatusData.Caption := 'De klep is open';
          if (Status and PRINTER_STATUS_ERROR) <> 0 then lbl_PrinterStatusData.Caption := 'Er is een error opgetreden';
          if (Status and PRINTER_STATUS_INITIALIZING) <> 0 then lbl_PrinterStatusData.Caption := 'Bezig met initialiseren';
          if (Status and PRINTER_STATUS_IO_ACTIVE) <> 0 then lbl_PrinterStatusData.Caption := 'Bezig met invoer/uitvoer activiteit';
          if (Status and PRINTER_STATUS_MANUAL_FEED) <> 0 then lbl_PrinterStatusData.Caption := 'Printer is in handmatige invoerstatus';
          if (Status and PRINTER_STATUS_NO_TONER) <> 0 then lbl_PrinterStatusData.Caption := 'De toner is leeg';
          if (Status and PRINTER_STATUS_NOT_AVAILABLE) <> 0 then lbl_PrinterStatusData.Caption := 'Niet beschikbaar voor printen';
          if (Status and PRINTER_STATUS_OFFLINE) <> 0 then lbl_PrinterStatusData.Caption := 'Printer is offline';
          if (Status and PRINTER_STATUS_OUT_OF_MEMORY) <> 0 then lbl_PrinterStatusData.Caption := 'Printer heeft niet voldoende geheugen';
          if (Status and PRINTER_STATUS_OUTPUT_BIN_FULL) <> 0 then lbl_PrinterStatusData.Caption := 'Uitvoer is vol';
          if (Status and PRINTER_STATUS_PAGE_PUNT) <> 0 then lbl_PrinterStatusData.Caption := 'Huidige pagina kan niet uitgeprint worden';
          if (Status and PRINTER_STATUS_PAPER_JAM) <> 0 then lbl_PrinterStatusData.Caption := 'Papier storing';
          if (Status and PRINTER_STATUS_PAPER_OUT) <> 0 then lbl_PrinterStatusData.Caption := 'Papier is op';
          if (Status and PRINTER_STATUS_PAPER_PROBLEM) <> 0 then lbl_PrinterStatusData.Caption := 'Er is een probleem met het papier';
          if (Status and PRINTER_STATUS_PAUSED) <> 0 then lbl_PrinterStatusData.Caption := 'Pauze';
          if (Status and PRINTER_STATUS_PENDING_DELETION) <> 0 then lbl_PrinterStatusData.Caption := 'Huidige taken worden verwijderd';
          if (Status and PRINTER_STATUS_POWER_SAVE) <> 0 then lbl_PrinterStatusData.Caption := 'Printer is in power save mode';
          if (Status and PRINTER_STATUS_PRINTING) <> 0 then lbl_PrinterStatusData.Caption := 'Bezig met printen';
          if (Status and PRINTER_STATUS_PROCESSING) <> 0 then lbl_PrinterStatusData.Caption := 'Bezig met taak verwerking';
          if (Status and PRINTER_STATUS_SERVER_UNKNOWN) <> 0 then lbl_PrinterStatusData.Caption := 'Onbekend';
          if (Status and PRINTER_STATUS_TONER_LOW) <> 0 then lbl_PrinterStatusData.Caption := 'Toner is bijna op';
          if (Status and PRINTER_STATUS_USER_INTERVENTION) <> 0 then lbl_PrinterStatusData.Caption := 'Error, wacht op actie van gebruiker';
          if (Status and PRINTER_STATUS_WAITING) <> 0 then lbl_PrinterStatusData.Caption := 'Printer is aan het wachten';
          if (Status and PRINTER_STATUS_WARMING_UP) <> 0 then lbl_PrinterStatusData.Caption := 'Printer is aan het opwarmen';

          lbl_PrinterTypeData.Caption := pDriverName;
          lbl_PrinterWaarData.Caption := pPortName;
          lbl_PrinterOpmerkingData.Caption := pComment;
        end;
      finally
        FreeMem(pInfo);
      end;
    finally
      Printer.PrinterIndex := Printer.PrinterIndex;
      ClosePrinter(hPrinter);
    end;
  end;
end;

procedure Tfrm_Afdrukken.btn_EigenschappenClick(Sender: TObject);
var device: array[0..255] of char;
    driver: array[0..255] of char;
    port: array[0..255] of char;
    hDMode: THandle;
    pDMode: PDEVMODE;
    hPrinter: THandle;

    DevMode: THandle;
    pDevmode: PDeviceMode;
begin
  Printer.PrinterIndex := Printer.PrinterIndex;
  Printer.GetPrinter(device, driver, port, hDMode);
  if (hDMode <> 0) then
  begin
    pDMode := GlobalLock(hDMode);
    if Assigned(pDMode) then
    begin
      try
        if OpenPrinter(PChar(cmbbx_PrinterNaam.Text), hPrinter, nil) then
        begin
          try
            DocumentProperties(Handle, hPrinter, device, pDMode^, pDMode^,
                               DM_IN_PROMPT or DM_OUT_BUFFER or DM_IN_BUFFER);
          finally
            Printer.PrinterIndex := Printer.PrinterIndex;
            ClosePrinter(hPrinter);
          end;
        end;
      finally
        GlobalUnlock(hDMode);
      end;
    end;
  end;

  // Papier orientatie overrulen !!
  Printer.Orientation := poPortrait;

  // Papier formaat overrullen !!
  // Get printer device name etc.
  Printer.GetPrinter(Device, Driver, Port, DevMode);
  // force reload of DEVMODE
  Printer.SetPrinter(Device, Driver, Port, 0);
  // get DEVMODE handle
  Printer.GetPrinter(Device, Driver, Port, DevMode);
  if Devmode <> 0 then
  begin
    // lock it to get pointer to DEVMODE record
    pDevMode := GlobalLock(Devmode);
    if pDevmode <> nil then
      try
        with pDevmode^ do
        begin
          // modify paper size
          dmPapersize := DMPAPER_A4;
          // tell printer driver that dmPapersize field contains
          // data it needs to inspect.
          dmFields := dmFields or DM_PAPERSIZE;
        end;
      finally
        // unlock devmode handle.
        GlobalUnlock( Devmode );
      end;
  end;
end;
Pagina: 1