16. februar 2000 - 11:59Der er
25 kommentarer og 1 løsning
Vælge printer
Jeg har lavet følgende lille testkode, da jeg altid har haft problemer med at vælge printere via VB.
Problemet er at den godt nok vælger printeren (1. msgbox). Men når den skriver ud, skriver den alligevel til standard-printeren, selvom der er valgt en anden.
1. msgbox: "Now printing on Farveprinter - Xerox 5765 via Fiery X2"
...[udskriv]...
2. msgbox: "Finished printing on Sort/Hvid/Fax - Xerox Document Centre 230" (Som er standard-printeren)
Nogen der har en ide til hvad der er galt?
Private Sub CmdShowPrinters_Click() Dim P As Printer For Each P In Printers List1.AddItem P.DeviceName Next End Sub
Private Sub CmdSelectPrinter_Click() Dim P As Printer For Each P In Printers If P.DeviceName = List1.Text Then Set Printer = P End If Next End Sub
Private Sub CmdPrintTest_Click() MsgBox "Now printing on " & Printer.DeviceName Printer.Orientation = vbPRORLandscape Printer.Font = "Tahoma" Printer.FontSize = "16" Printer.Copies = 1 Printer.Print "Printertest..." Printer.EndDoc MsgBox "Finished printing on " & Printer.DeviceName End Sub
Jeg ønsker heller ikke at ændre på systemets default-printer. Jeg vil bare gerne udskrive på en anden end lige default.
Hvis jeg bruger CommonDlg der er med i VB så virker det godt nok, men den udskifter også systemets default printer, hvilket jo ikke helt er meningen.
Desuden vil jeg gerne benytte min egen Udskrifts-Dialogboks da jeg har nogle ekstra "options" der skal med.
Men måske er svaret at ændre systemets default-printer, mens jeg skriver ud, og så sætte den tilbage igen...
Her er hvad der står om at sætte default-printeren i help:
The Printers collection enables you to query the available printers so you can specify a default printer for your application. For example, you may want to find out which of the available printers uses a specific printer driver. The following code searches all available printers to locate the first printer with its page orientation set to portrait, then sets it as the default printer:
Dim X As Printer For Each X In Printers If X.Orientation = vbPRORPortrait Then ' Set printer as system default. Set Printer = X ' Stop looking for a printer. Exit For End If Next
You designate one of the printers in the Printers collection as the default printer by using the Set statement. The preceding example designates the printer identified by the object variable X, the default printer for the application.
Det ligner jo _meget_ min kode, men af en eller anden grund virker det ikke.
Jeg ved dog at Set-statementet skifter printeren, og jeg kan også trække diverse egenskaber fra den, men når jeg vil sætte egenskaber eller udskrive, så skifter den tilbage igen...
Hjælp mig *snøft*...
(Syntes efterhånden det er mere end 30 point værd, så vi starter lige med at fordoble...)
Det der med at sætte default printer er ikke så farligt. Du kan jo starte med at gemme den printer der p.t. er default i en x-var af typen printer, derefter søge dig frem til den printer du vil bruge (evt. via navnet if x.name = 'HPlaserxxx...'), udskrive dt du vil, og derefter sætte den gamle printer tilbage som default igen. Det er jo kun for dit program du sætter default. Ikke for alle andre windows programmer på maskinen.
Private Sub CmdSelectPrinter_Click() Dim P As Printer `For Each P In Printers `If P.DeviceName = List1.Text Then << Set Printer = list1.text >> `End If `Next End Sub
Hmm. Når jeg indtaster koden Printer.printerdefault genkender VB godt nok koden, og ændrer det til Printer.PrinterDefault. Men når jeg eksekverer koden får jeg fejlen "Method or data member not found".
PrinterDefault-prop.'en står godt nok heller ikke på listen (Men det gør Print jo heller ikke :)
Jeg fatter ikke hvorfor den ikke kan holde på den printer jeg vælger.
Hvis jeg efter at have Set Printer = P, spørger hvilken printer der er aktiv, svarer den at det er den jeg har valgt (Den rigtige)
Men skriver jeg bare een kommando til Printer-objektet (Printer.Print "ARGHHH!") og derefter spørger hvilken printer der er aktiv, er svaret bare system-printeren.
Jeg forstår ikke hvorfor den ikke kan "låse" sig fast!?!?!?!
Har du prøvet at debugge, altså følge linie for linie, så og se hvornår P forlader det valg du har taget. Hvis du har dit emidiate window åben kan du jo løbende skrive: ? p.DriverName for at se hvad der går galt.
Jeg har en ide om at det er fordi at dit printerobject ikke er global, prøv at holde hele udskriften inden for samme rutine, eller at lave en P.Print " " lige efter du har valgt printer, så burde valget være truffet for good.
Men når jeg skriver P.Print " " efter Set Printer = P, får jeg en fejl 438: Object doesn't support this property or method.
Men altså, man sætter da også Printer = P, og ikke P = Printer, så det må da være Printer-fætteren jeg skal skrive til ?!? Eller har jeg helt misforstået noget?
Dim FoundP as Printer Dim P as Printer For Each FoundP In Printers If FoundP.DeviceName = List1.Text Then Set P = FoundP p.print " " Exit For End If Next
Linien: x = Printer.Orientation reserverer ikke din printer, den spørger bare om hvordan papiret vender, for at fastholde en printer skal du udføre en kommando, som f.eks. p.print " "
Husk at du skal bruge et user defineret object istedet for Printer, det giver det bedste resultat!
Hmm. jeg har fået meldinger fra flere sider om at den allerførste kode jeg har postet åbenbart virker fint for flere, så jeg tror næsten det er en fejl på mit system. Bare ret underligt efter som jeg har programmeret på 2 forskellige PC'ere (dog i samme netværk) hvor fejlen var ens på begge PC'ere...
Men bkp får pointene, da det lader til at farout har haft held med bkp's kode.
\\Spinner
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.