Bonjour tout le monde,
Notre logiciel permet d'imprimer des rapports au format papier. Depuis peu, un de nos client rencontre un problème lorsqu'il essaie d'imprimer sur une de ses imprimantes. Après quelques essais. nous avons pu reproduire l'erreur dans un petit programme de test que voici :
Je commence par sélectionner toutes les imprimantes installées sur le poste de cette manière :
Lorsque le client sélectionne une imprimante, je fais ensuite la liste des sources de papier disponibles de la manière suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 ComboBox1.Clear; For I:=0 To Printer.Printers.Count-1 Do ComboBox1.Items.Add(Printer.Printers[I]);
Jusque là tout fonctionne bien.
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 procedure TForm1.ComboBox1Change(Sender: TObject); 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; Begin ComboBox4.Clear; Printer.PrinterIndex := ComboBox1.ItemIndex; 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;
Un bouton permet ensuite d'imprimer une bête page de test :
Ce code déclenche une erreur chez mon client :
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
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 procedure TForm1.Button1Click(Sender: TObject); Var FDevice,FDriver,FPort: array [0..255] of Char; DeviceMode: THandle; OldMode : Integer; DevMode: PDeviceMode; CurrentStep : AnsiString; begin Try CurrentStep:='Début'; If ComboBox1.Items.Count = 0 Then Exit; CurrentStep:='ComboBox1.Items.Count > 0'; Printer.PrinterIndex:=ComboBox1.ItemIndex; CurrentStep:='PrinterIndex'; Printer.GetPrinter(FDevice, FDriver, FPort, DeviceMode); CurrentStep:='GetPrinter'; DevMode := GlobalLock(DeviceMode); CurrentStep:='GlobalLock'; if ((DevMode^.dmFields and DM_DEFAULTSOURCE) = DM_DEFAULTSOURCE) then begin DevMode^.dmFields := DevMode^.dmFields or DM_DEFAULTSOURCE; CurrentStep:='dmFields'; If ComboBox4.ItemIndex >= 0 Then Begin DevMode^.dmDefaultSource := Integer(ComboBox4.Items.Objects[ComboBox4.ItemIndex]); CurrentStep:='dmDefaultSource'; End; end; Printer.SetPrinter(FDevice , FDriver, FPort, DeviceMode); CurrentStep:='SetPrinter'; GlobalUnlock(DeviceMode); CurrentStep:='GlobalUnlock'; Printer.Title:='TEST '+ComboBox1.Text; CurrentStep:='Title'; Printer.BeginDoc; CurrentStep:='BeginDoc'; Printer.Canvas.Brush.Color:=clWhite; CurrentStep:='Brush.Color'; Printer.Canvas.FillRect(Printer.Canvas.ClipRect); CurrentStep:='FillRect'; Printer.Canvas.Brush.Style:=bsSolid; CurrentStep:='Brush.Style'; Printer.Canvas.Font.Name:='Arial'; CurrentStep:='Font.Name'; Printer.Canvas.Font.Size:=20; CurrentStep:='Font.Size'; Printer.Canvas.Font.Color:=clRed; CurrentStep:='Font.Color'; Printer.Canvas.TextRect(Rect(200,200,Printer.PageWidth-200,Printer.PageHeight-200), 200, 200, 'Test d''impression DELPHI'); CurrentStep:='TextRect1'; Printer.Canvas.TextRect(Rect(200,1000,Printer.PageWidth-200,Printer.PageHeight-1000), 200, 1000, ComboBox1.Text); CurrentStep:='TextRect2'; Printer.Canvas.TextRect(Rect(200,2000,Printer.PageWidth-200,Printer.PageHeight-2000), 200, 2000, 'Recto'); CurrentStep:='TextRect3'; Printer.EndDoc; CurrentStep:='EndDoc'; Except On E:Exception Do MessageDlg('Erreur étape : <'+CurrentStep+'>'+#13+#10+E.Message,mtError,[mbOK],0); End; end;
Message d'erreur : "Imprimante sélectionnée incorrecte"
Ce message se déclenche sur la ligne suivante :
Il utilise une imprimante HP OfficeJet 7000 A3. Une seule source papier nommée "Bac 1" est détectée par le système.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Printer.BeginDoc;
Ce qui est bizzare, c'est que si il utilise l'une de ses autres imprimantes, l'impression se passe sans problème.
Si il imprime sur cette imprimante depuis une autre application, pas de problème non plus.
Quelqu'un a-t-il déjà rencontré ce problème? Comment puis-je le résoudre?
Merci d'avance.
PS. Je suis sous Delphi 6, le client est sous Windows 7
Partager