VB + versch.Drucker + CrystalReport

Hi!

Ich habe auf einem PC zwei Drucker installiert (einen „HP Deskjet 690C“ und einen „EPSON TM-T88II No cut“ - der HP ist default). In einer VB-Anwendung will ich jetzt zwischen den Druckern hin und her schalten können. Der eine Drucker soll als Listendrucker Berichte unter CrystalReports erstellen, der andere eine Art Kassenbon ausdrucken.

Meine Idee ist es, alle verfügbaren Drucker (aus der Printers-Auflistung) anzubieten, einen Bon-Drucker und einen Listen-Drucker zu bestimmen und beim Form_Load den erforderlichen Drucker zu spezifizieren [Set Printer = Printers(Index) - wobei Index der gewählte Drucker ist]. Soweit die Theorie.

Bei einem Test habe ich den Listendrucker mal auf EPSON, mal auf HP gesetzt und wollte mit CrystalReports eine Liste drucken. CR greift jedoch immer auf den HP zu und scheint die Änderung auf den EPSON überhaupt nicht zu registrieren.

Wie schalte ich auf einen anderen Drucker um, damit auch CrystalReports das mitbekommt? Wenn z.B. der EPSON im Windows-Drucker-Menü auf default steht, ignoriert CR die programminterne Umschaltung auf den HP!

Jede Hilfe ist willkommen!

Hi Siegfried !

Zum Thema Crystal Reports : Wenn man in einem Reporting Tool nicht einmal die Datenbank Connection (z.B.: zw. Test und Produktion) aus VB verändern kann, wie kannst Du nur daran denken, daß man den Drucker ändern könnte.

Also ich empfehle es nicht mi CR zu lösen !
Andererseits kann ich dir aber kein anderes Produkt nennen.

Aber wusstest Du, daß VB auch eine Reporting Möglichkeit bietet ?

ciao
Mario

Hallo Mario!

Inzwischen habe ich herausgefunden, daß CR immer den Standard-Drucker unter Windows benutzt. Also müßte ich jetzt einen Weg finden, den Standard-Drucker unter Windows aus der Anwendung heraus neu zu definieren (API???). In einem Handbuch habe ich gelesen, daß das über den CommonDialog geht. Es soll (!) aber auch einen anderen Weg geben.

Aber wusstest Du, daß VB auch eine
Reporting Möglichkeit bietet ?

Wie das? Inkl. variablem Layout von 1. Seite / Folge-Seite / letzte Seite ?

Den Standarddrucker kannst du über die API wie folgt ändern:

Declare Function GetProfileString Lib "kernel32" Alias "GetProfileStringA" \_
 (ByVal lpAppName As String, ByVal lpKeyName As String, \_
ByVal lpDefault As String, ByVal lpReturnedString As String, \_
ByVal nSize As Long) As Long
Declare Function WriteProfileString Lib "kernel32" Alias "WriteProfileStringA" \_
 (ByVal lpszSection As String, ByVal lpszKeyName As String, \_
ByVal lpszString As String) As Long

Public Function SetDefaultPrinter(PrName As String)
' Parameter: Druckername
' Rückgabewert: Erfolg der Aktion
Dim Buffer As String, RW, Tmp As String
On Error GoTo Er

 Buffer = String(255, 0)
 RW = GetProfileString(ByVal "devices", ByVal PrName, ByVal "", Buffer, Len(Buffer))
 If RW 1 Then
 SetDefaultPrinter = False
 Exit Function
 End If
' und mitteilen, daß sich die WIN.INI geändert hat
 RW = SendMessage(HWND\_BROADCAST, WM\_WININICHANGE, 0&, 0&amp:wink:
 SetDefaultPrinter = True

Ex:
 Exit Function

Er:
 MsgBox "SetDefaultPrinter: " & Err.Description
 SetDefaultPrinter = False
 Resume Ex

End Function

Reinhard

… da fehlt noch etwas:
Da fehlt noch etwas:

Public Const WM\_SETTINGCHANGE = &H1A
Public Const HWND\_BROADCAST = &HFFFF&
Declare Function SendMessage Lib "User32" Alias "SendMessageA" \_
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Hallo Reinhard!

Ein Super-Tip!
Funktioniert hervorragend! Hat mir ganz entscheidend weitergeholfen!
Danke!

Anm.: es fehlt die Deklaration der Konstanten WM_WININICHANGE - aber die kann man sich ja ganz leicht aus der WIN32API.TXT ziehen!

Danke nochmals!

Siegfried