Bonjour tout le monde,
J'ai un nouveau problème d'impression. Je voudrais sélectionner le bac papier d'une imprimante et quoi que je fasse, l'imprimante prend les feuilles dans son bac par défaut. voici ce que j'ai fait :
Affichage de la liste des bacs disponibles pour une imprimante :
ComboBox2 contient le nom de mon imprimante.
La liste des bacs est affichée dans ComboBox4.
Sélection des propriétés de l'imprimante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 Procedure TImprimer_Doc.RemplirSourcesPapier; Type TBinName = array [0..23] of Char; TBinNameArray = array [1..High(Integer) div SizeOf(TBinName)] of TBinName; PBinnameArray = ^TBinNameArray; TBinArray = array [1..High(Integer) div SizeOf(Word)] of Word; PBinArray = ^TBinArray; Var Device, Driver, Port: array [0..255] of Char; hDevMode: THandle; i, numBinNames, numBins, temp: Integer; pBinNames: PBinnameArray; pBins: PBinArray; TrayName : AnsiString; Begin ComboBox4.Clear; If ComboBox2.Text = '' Then Exit; Printer.PrinterIndex:=PrntIndex; Printer.GetPrinter(Device, Driver, Port, hDevmode); numBinNames := WinSpool.DeviceCapabilities(Device, Port, DC_BINNAMES, nil, nil); numBins := WinSpool.DeviceCapabilities(Device, Port, DC_BINS, nil, nil); If numBins <> numBinNames Then raise Exception.Create('DeviceCapabilities reports different number of bins and bin names!'); If numBinNames > 0 Then Begin pBins := Nil; GetMem(pBinNames, numBinNames * SizeOf(TBinname)); GetMem(pBins, numBins * SizeOf(Word)); Try WinSpool.DeviceCapabilities(Device, Port, DC_BINNAMES, PChar(pBinNames), Nil); WinSpool.DeviceCapabilities(Device, Port, DC_BINS, PChar(pBins), Nil); For i := 1 To numBinNames Do Begin temp := pBins^[i]; ComboBox4.Items.AddObject(pBinNames^[i], TObject(temp)); End; Finally FreeMem(pBinNames); If pBins <> Nil Then FreeMem(pBins); End; End; ComboBox4.ItemIndex:=0; End;
J'ai vérifié, la variable "CodeTray" contient le bon code correspondant au bac que je voudrais sélectionner.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 Procedure TImprimer_Doc.SelectionPrinterIndex(PrinterIndex_ : Integer); Var FDevice,FDriver,FPort: array [0..255] of Char; DeviceMode: THandle; DevMode: PDeviceMode; Begin Printer.PrinterIndex:=PrinterIndex_; Printer.GetPrinter(FDevice, FDriver, FPort, DeviceMode); DevMode := GlobalLock(DeviceMode); CodeTray:=0; If ComboBox4.Items.Count > 0 Then CodeTray:=Integer(ComboBox4.Items.Objects[ComboBox4.ItemIndex]); DevMode^.dmFields:=DevMode^.dmFields or DM_DEFAULTSOURCE; DevMode^.dmDefaultSource:=CodeTray; ShowMessage(IntTOStr(DevMode^.dmDefaultSource)); Printer.SetPrinter( FDevice , FDriver, FPort, DeviceMode); GlobalUnlock(DeviceMode); End;
Si j'imprimer un document comme cela, le papier est toujours pris dans le bac par défaut de l'imprimante.
Est-ce que vous avez une idée d'une solution?
Merci d'avance
Partager