Eingebundene Drucker auslesen -> Lösung bitte mal testen
Moderator: Moderatoren
Eingebundene Drucker auslesen -> Lösung bitte mal testen
hi hab ein kleines problem
ich möchte in einem Dialog alle im system eingebundenen Drucker zur auswahl anzeigen (combobox) damit dann das Macro direckt auf den ausgewählten drucken kann
ich weis das es ein druckmenü schon giebt allerdings lohnt sich das nur bei schon vorhandenen daten. ich erstelle aber erst die daten mit dem Macro und will sie nun direckt ausdrucken so das niemand in dem Dockument rumpfuschen kann.
wenn jemand weis wie mann die zur verfügung stehenden drucker in die Combobox bekommt dann antworte er bitte.
benjy
ich möchte in einem Dialog alle im system eingebundenen Drucker zur auswahl anzeigen (combobox) damit dann das Macro direckt auf den ausgewählten drucken kann
ich weis das es ein druckmenü schon giebt allerdings lohnt sich das nur bei schon vorhandenen daten. ich erstelle aber erst die daten mit dem Macro und will sie nun direckt ausdrucken so das niemand in dem Dockument rumpfuschen kann.
wenn jemand weis wie mann die zur verfügung stehenden drucker in die Combobox bekommt dann antworte er bitte.
benjy
Zuletzt geändert von benjy am Mo, 08.01.2007 15:27, insgesamt 1-mal geändert.
Vielleicht wäre das Betreinsystem noch hilfreich?
Leider gibt es keine eigene Funktion/Api für das auslesen der Systemdrucker.
Unter Windows kann die Infos selber aus der Registry auslesen.
Für Windows NT/2000/XP steht hier eine Lösung: http://www.dannenhoefer.de/faqstarbasic ... ucker.html
Für Linux .... ?
mfg
Michael
Leider gibt es keine eigene Funktion/Api für das auslesen der Systemdrucker.
Unter Windows kann die Infos selber aus der Registry auslesen.
Für Windows NT/2000/XP steht hier eine Lösung: http://www.dannenhoefer.de/faqstarbasic ... ucker.html
Für Linux .... ?
mfg
Michael
__
FAQ zu Starbasic -> http://www.starbasicfaq.de
FAQ zu Starbasic -> http://www.starbasicfaq.de
danke für die info
sollte eigentlich unabhänging vom system laufen.
hab mal selbst in der APi geschaut und etwas gefunden
http://api.openoffice.org/docs/common/r ... erver.html
unter "getPrinterNames" werden dort alle verfügbare drucker zurück gegeben
ist es darüber vieleicht möglich ohne die windofs registrie zu quälen
wenn ja dann sagt mir bitte wie.
Gruß benjy
sollte eigentlich unabhänging vom system laufen.
hab mal selbst in der APi geschaut und etwas gefunden
http://api.openoffice.org/docs/common/r ... erver.html
unter "getPrinterNames" werden dort alle verfügbare drucker zurück gegeben
ist es darüber vieleicht möglich ohne die windofs registrie zu quälen
wenn ja dann sagt mir bitte wie.
Gruß benjy
Nein dieses Interface nützt leider nichts.
Es gibt keinen Service dem es zugeordnet ist.
Daher kann es nicht verwenden.
Ich suche selber ein vernünftige Lösung für alle BS.
mfg
Michael
Es gibt keinen Service dem es zugeordnet ist.
Daher kann es nicht verwenden.

Ich suche selber ein vernünftige Lösung für alle BS.
mfg
Michael
__
FAQ zu Starbasic -> http://www.starbasicfaq.de
FAQ zu Starbasic -> http://www.starbasicfaq.de
-
- Beiträge: 2
- Registriert: Fr, 17.11.2006 14:51
Habe mal versucht, die Drucker vom Betriebssystem (Linux mit CUPS) zu ermitteln - mittels lpstat (könnte also auch statt it CUPS mit lpd gehen). Unschön ist hier noch, wie ich inaktive Drucker ausfiltere, weil ich die deutsche Ausgabe von lpadmin unterstelle. Aber es funktioniert.
Der Code geht von einem Tabellenblatt namens "INI" aus, in das die Drucker eingetragen werden.
Die auskommentierte Zeile würde den Standard-Drucker zurückgeben.
Der Code geht von einem Tabellenblatt namens "INI" aus, in das die Drucker eingetragen werden.
Die auskommentierte Zeile würde den Standard-Drucker zurückgeben.
Code: Alles auswählen
ErstelleDruckerliste()
Dim INI as Object
Dim List as Integer
Dim Drucker as String, I as Integer
INI = ThisComponent.Sheets.getByName("INI")
Dim Sys as Object
Sys = createUnoService("com.sun.star.system.SystemShellExecute")
'Sys.execute("lpstat", "-d | cut -f3 -d' ' > /tmp/printers", 0)
Sys.execute("lpstat", "-a | grep -i -v ""rejecting"" | grep -i -v ""keine anfragen"" | cut -f1 -d' ' > /tmp/printers", 0)
List = FreeFile()
Open "/tmp/printers" for input as #List
INI.getCellRangeByName("A1:A100").ClearContents(com.sun.star.sheet.CellFlags.STRING + _
com.sun.star.sheet.CellFlags.VALUE)
I = 0
do while not eof(#List)
line input #List, Drucker
INI.getCellByPosition(0, I).String = Drucker
I = I + 1
NextZeile:
loop
close #List
End Sub
Da es offensichtlich keine BS übergreifende Lösung gibt, die Drucker auszulesen/anzusprechen, könntest Du ggf. das Ganze umgehen.
So zum Beispiel:
Nicht schön, müsste aber gehen (habe es für eine Mailfunktion und für unabhängige Abfragen des Environment schon erfolgreich genutzt).
HTH
So zum Beispiel:
Code: Alles auswählen
If GetGuiType = 1 Then
' Windows
Code von Dannhöfer
ElseIf GetGuiType = 4 Then
' Unix, Linux
Code von martin schniewind
ElseIf GetGuiType = ? Then
'Mac Type habe ich auf die Schnelle nicht gefunden
Code für Mac (wie Unix -> CUPS?!)
Else
MsgBox "Nix Drucken"
End If
HTH
hi hatte vergessen das ich diese frage hier gestellt hatte und deshalb heute erst eure antworten gelesen.
na ja da ich in der zwichenzeit eine Distri gefunden habe die mir persönlich zusagt habbe ich mich selber daran gesetzt eine lösung zu finden. grundsätzich sieht sie genau so aus wie eure mit dem unterschied das ich noch den standart drucker mit auslese.
da ich hier zur zeit nur ein linux im einsatz habe würde ich mal alle bitten den code zu testen und sagen ob er geht oder nicht. Danke
ein anwendungs bespiel:
na ja da ich in der zwichenzeit eine Distri gefunden habe die mir persönlich zusagt habbe ich mich selber daran gesetzt eine lösung zu finden. grundsätzich sieht sie genau so aus wie eure mit dem unterschied das ich noch den standart drucker mit auslese.
da ich hier zur zeit nur ein linux im einsatz habe würde ich mal alle bitten den code zu testen und sagen ob er geht oder nicht. Danke
Code: Alles auswählen
'Liefert in einem Array die installierten Drucker zurück! zuletzt wird der standerd drucker noch einmal wiederholt.
sub GetAlleDrucker(ListOfAllPrinter())
dim inumber as integer
dim ipos as integer
dim zaehler as integer
dim shilf(3) as string
Dim myPrinter(20)
if GetGUIType = 1 then
'listet alle drucker und den primären drucker bei windows auf !!! Achtung geht nur ab Windows NT!!
shell("regedit.exe" , 10 ," /e c:\printer.txt " & Chr(34) & "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices" & Chr(34),true)
zaehler=0
iNumber = Freefile
shilf(0) = "file:///c:/printer.txt"
Open shilf(0) For Input As #iNumber
On Error Goto schluss
While not eof(iNumber)
Line Input #iNumber, shilf(1)
shilf(2)=left(shilf(1),1)
if shilf(2)="""" then
ipos=InStr(shilf(1),"""=")
myprinter(zaehler)=mid(shilf(1),2,ipos-2)
zaehler=zaehler+1
end if
wend
schluss:
Close #iNumber
shell("regedit.exe" , 10 ," /e c:\printer.txt " & Chr(34) & "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows" & Chr(34),true)
ipos=0
iNumber = Freefile
Open shilf(0) For Input As #iNumber
On Error Goto schluss2
do While not eof(iNumber)
if ipos = 0 then
Line Input #iNumber, shilf(1)
shilf(2)=mid(shilf(1),2,6)
if shilf(2)="Device" then
ipos=InStr(shilf(1),",")
myprinter(zaehler)=mid(shilf(1),11,ipos-11)
zaehler=zaehler+1
end if
else
exit do
end if
loop
schluss2:
Close #iNumber
if zaehler>0then
redim ListofAllPrinter(zaehler-1)
for iNumber=0 to zaehler-1
ListofAllPrinter(iNumber)=myprinter(iNumber)
next iNumber
end if
kill shilf(0)
elseif GetGUIType = 4 then
'listet alle drucker und den primären drucker bei LINUX auf
shilf(0) = "file:///tmp/printer"
iNumber = Freefile
open shilf(0) for Output as #iNumber
Print #iNumber, "#!/bin/sh"
Print #iNumber, "lpstat -p -d > /tmp/printer.txt"
Close #iNumber
shell("chmod u+x /tmp/printer")
wait 20
shell("/tmp/printer",10,"",true)
wait 20
shilf(0) = "file:///tmp/printer.txt"
zaehler=0
iNumber = Freefile
Open shilf(0) For Input As #iNumber
On Error Goto schluss3
While not eof(iNumber)
Line Input #iNumber, shilf(1)
shilf(2)=left(shilf(1),5)
if shilf(2)="print" then
ipos=InStr(shilf(1),"is idle.")
myprinter(zaehler)=mid(shilf(1),9,ipos-9)
zaehler=zaehler+1
elseif shilf(2)="syste" then
ipos=InStr(shilf(1),": ")
myprinter(zaehler)=right (shilf(1),len(shilf(1))-(ipos+1))
zaehler=zaehler+1
end if
wend
schluss3:
Close #iNumber
if zaehler>0then
redim ListofAllPrinter(zaehler-1)
for iNumber=0 to zaehler-1
ListofAllPrinter(iNumber)=myprinter(iNumber)
next iNumber
end if
kill("file:///tmp/printer")
kill("file:///tmp/printer.txt")
endif
end sub
Code: Alles auswählen
dim listdrucker as variant
dim ihilf as integer
dim olist as object
GetAlleDrucker (listdrucker())
oList = oDlgDruck.GetControl("ComboBox1")
oList.removeitems(0,100)
if Isarray(listdrucker()) then
for ihilf = lBound(listdrucker()) to (uBound(listdrucker())-1)
oList.additem(listdrucker(ihilf),100)
next ihilf
oList.text= listdrucker(uBound(listdrucker()))
end if