Avatar billede spinner Nybegynder
16. februar 2000 - 11:59 Der 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
Avatar billede nolle_k Nybegynder
16. februar 2000 - 12:20 #1
Et forslag!!

Prøv at indsætte en Exit For i loopen når du har fundet den printer der skal bruges??

Altså

Set Printer = P
Exit For

Bevirker højest sandsynligt ikke noget man man kan aldrig vide!!
Avatar billede spinner Nybegynder
16. februar 2000 - 12:40 #2
>>nolle_k: Næh, det virkede desværre ikke...
 
Det giver stadig bare samme fejl.

Jeg forstår bare ikke at den har valgt den rigtige printer, men idet der skal udskrives så tager den standard printeren og skriver på...

\\spinner
Avatar billede nolle_k Nybegynder
16. februar 2000 - 12:47 #3
Prøv at sætte Printer.TrackDefault til true eller false (Prøv begge) inden
Set Printer = P
Avatar billede spinner Nybegynder
16. februar 2000 - 13:00 #4
>>nolle_k: Ingen held ;(

Jeg prøvede både at sætte den ind lige inden "Set Printer = P"
og lige inden den begynder at skrive ud.

\\spinner
Avatar billede sjensen Nybegynder
16. februar 2000 - 14:15 #5
At du vælger printeren betyder ikke at du sætter den som default.

Der hvor du sætter de øvrige printer options skal du også sætte den valgte printer som default.

Lige hvordan du gør det i vb kan jeg ikke sige, men læs lidt om dt hjælpeteksten.

sjensen
Avatar billede spinner Nybegynder
16. februar 2000 - 15:04 #6
>>sjensen:

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...)

\\spinner
Avatar billede sjensen Nybegynder
17. februar 2000 - 00:50 #7
Spinner,

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.

sjensen
Avatar billede spinner Nybegynder
17. februar 2000 - 09:57 #8
>>sjensen:

Problemet er bare at ovenstående kode ikke virker til at skifte default printer for mit program. HVis jeg gør det skifter den tilbage igen.

Men jeg har lagt mærke til at CommonDialog skifter default printer for _hele_ computeren.

Og så var det jeg tænkte at det kunne jeg da også bare gøre, men jeg kan sq ikke få den til at skifte system default printer...

\\spinner
Avatar billede nolle_k Nybegynder
17. februar 2000 - 10:44 #9
Prøv at sætte den printer du skal bruge som default og herefte sætte
Printer.PrinterDefault = True eller måske i omvendt rækkefølge!! ??
Avatar billede farout Nybegynder
21. februar 2000 - 20:43 #10
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

Avatar billede spinner Nybegynder
22. februar 2000 - 08:31 #11
>>farout:

Set P = list1.text  resulterer i en

"Object required"-fejl.

>>nolle_k:

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 :)

\\Spinner
Avatar billede spinner Nybegynder
22. februar 2000 - 08:32 #12
Jeg tænkte; er der måske nogen der har en kode liggende, hvori de har fået et printer-skift til at virke?

\\Spinner
Avatar billede bkp Nybegynder
23. februar 2000 - 17:39 #13
Prøv dette:

  Dim P As Printer
  printer.enddoc
  `For Each P In Printers
    `If P.DeviceName = List1.Text Then
  << Set Printer = list1.text >>
    `End If
  `Next

Hvis der er sendt lidt data til printer objektet har den meget sværd ved at skifte til en anden printer, jeg taler af erfaring!
Avatar billede sjensen Nybegynder
23. februar 2000 - 17:46 #14
spinner,

i de 2 eksempler der er givet af hhv farout og bkp skal du bruge

set printer = P som er indexet for printeren i listen. Ved at sætte printer til index sætter du den til default for dit program.

Ved at sætte printer = 0 sætter du den første printer i listen som default.
Avatar billede spinner Nybegynder
23. februar 2000 - 19:15 #15
>>bkp:

Det hjalp desværre 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!?!?!?!

\\Spinner
Avatar billede bkp Nybegynder
24. februar 2000 - 08:35 #16
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.
Avatar billede spinner Nybegynder
24. februar 2000 - 09:15 #17
>>bkp:

Ok, det er nu lykkedes mig at få den til at udskrive på den rigtige printer, v.hj.a. denne kode:

Dim P As Printer
 
  x = Printer.Orientation  'Denne linje gjorde udslaget (I stedet for Printer.EndDoc)
 
  For Each P In Printers
    If P.DeviceName = List1.Text Then
      Printer.TrackDefault = False
      Set Printer = P
      Exit For
    End If
  Next
 
  Printer.Orientation = vbPRORLandscape
  Printer.Copies = 1
  Printer.Font = "Tahoma"
  Printer.FontSize = "16"
  Printer.Print "Printertest..."
  Printer.Font = "Tahoma"
  Printer.FontSize = "16"
  Printer.Print "ARGHHHH!"
  Printer.EndDoc

MEN GUD HJÆLPE MIG om jeg nu ikke er i stand til at vælge skrifttype/størrelse. ALT bliver skrevet ud med standard skrifttype/-størrelse.

Om jeg FATTER at det skal være så svært at lave en ordentlig udskrift i VB.
Avatar billede bkp Nybegynder
24. februar 2000 - 09:33 #18
Du skal ikke referere til printer, når du har valgt en anden printer men til P:

Prøv denne:

  For Each P In Printers
    If P.DeviceName = List1.Text Then
      Set Printer = P
      p.print " "
      Exit For
    End If
  Next
 
 

  P.Orientation = vbPRORLandscape
  P.Copies = 1
  P.Font = "Tahoma"
  P.FontSize = "16"
  P.Print "Printertest..."
  P.Font = "Tahoma"
  P.FontSize = "16"
  P.Print "ARGHHHH!"
  P.EndDoc

Desuden kan du kun vælge en font som din printer er født med dem kan du finde med p.Fonts() inden for dens index som du finder med p.fontscount
Avatar billede bkp Nybegynder
24. februar 2000 - 09:34 #19
Jeg håber at det hjalp!
Avatar billede spinner Nybegynder
24. februar 2000 - 10:06 #20
Hmmm...

Jeg har Dim'et P as Printer

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?

Avatar billede bkp Nybegynder
24. februar 2000 - 11:38 #21
Du sætter ikke Printer = P men P = Printer, det andet kan du ikke!!!
Avatar billede bkp Nybegynder
24. februar 2000 - 12:25 #22
Prøv dette:

  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
 
 

  P.Orientation = vbPRORLandscape
  P.Copies = 1
  P.Font = "Tahoma"
  P.FontSize = "16"
  P.Print "Printertest..."
  P.Font = "Tahoma"
  P.FontSize = "16"
  P.Print "ARGHHHH!"
  P.EndDoc

Avatar billede bkp Nybegynder
24. februar 2000 - 12:29 #23
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!
Avatar billede farout Nybegynder
24. februar 2000 - 16:32 #24
bkp det virker sørme :0)
Avatar billede bkp Nybegynder
25. februar 2000 - 18:41 #25
GODT
Avatar billede spinner Nybegynder
28. februar 2000 - 01:20 #26
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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester