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.

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;
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
 
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;
J'ai vérifié, la variable "CodeTray" contient le bon code correspondant au bac que je voudrais sélectionner.

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