vb-Zentrum
Verschiedenes
http://www.vb-zentrum.de/tip_diverse.html

© 2023 vb-Zentrum

0001 Drucken im Blocksatz

Ausgeben von längeren Texten auf dem Drucker kann so einfach sein, wenn man die API-Funktion DrawText kennt! Die unten aufgeführte Funktion print_out gibt einen Text mittig zentriert als Blocksatz an der aktuellen Druckposition aus.
Private Declare Function DrawText Lib "user32" Alias "DrawTextA" _
    (ByVal hdc As Long,  ByVal lpStr As String, ByVal nCount As Long, _
    lpRect As RECT, ByVal wFormat As Long) As Long
Public Type RECT
  Left As Long
  Top As Long
  Right As Long
  Bottom As Long
End Type

Const DT_LEFT = &H0
Const DT_CENTER = &H1
Const DT_RIGHT = &H2
Const DT_TOP = &H0
Const DT_VCENTER = &H4
Const DT_BOTTOM = &H8
Const DT_WORDBREAK = &H10
Const DT_CALCRECT = &H400
Const DT_EDITCONTROL = &H2000
Const DT_NOCLIP = &H100


' Funktion:
' Gibt einen längeren Text als Block mit Zeilenumbruch
' auf dem Drucker an der aktuellen Druckposition aus
Public Sub print_out(ByVal text As String)
  Dim Mode As Integer, ret As Integer
  Dim R As RECT
   
  With Printer
    .FontName = "Arial"
    .Font.Size = 10
    Mode = .ScaleMode
    .ScaleMode = vbPixels
    R.Left = .CurrentX
    R.Top = .CurrentY
    R.Right = .ScaleWidth - (.CurrentX / 2)
    R.Bottom = .ScaleHeight
    ret = DrawText(.hdc, text, Len(text), R, DT_LEFT Or DT_WORDBREAK)
    .ScaleMode = Mode
  End With
End Sub

Autor: ralf schlegel
Stand: 08/2003

Nach oben

0002 Starten von MS-Word

Die folgende Funktion startet eine Instanz von Microsoft Word und lädt die in docFile angegebenen Datei. Je nach Dateiendung wird das Dokument selbst (.doc .rtf .txt) oder eine Instanz der Vorlage (.dot) in die Anwendung geladen. Übergeben Sie keinen Dateinamen, so startet Word mit einem neuen, leeren Dokument. Um die Funktion nutzen zu können, muss auf Ihrem System natürlich MS-Word installiert sein. Ferner müssen Sie in Ihrem Projekt unter Verweise die "Microsoft Word x.x Objekt Context.Scope.Library" einbinden, wobei 'x.x' für die jeweilige Version steht.

' Funktion:
Public Function word_open(ByVal docFile As String, ByVal vis As Boolean) As Object
  Dim typ As String

  On Local Error GoTo suberror

  Set word_open = GetObject(, "word.Application")
  If word_open.Documents.Count = 0 Then
    word_open.Visible = vis
  End If
 
  typ = LCase(Right(docFile, 3))
  Select Case typ
    Case "dot"  ' Vorlage
      word_open.Documents.Add Template:=docFile
    Case "doc", "rtf", "txt"  ' Text-Dokument
      word_open.Documents.Open filename:=docFile
    Case Else
      ' neues leeres Blatt:
      word_open.Documents.Add
  End Select
  Exit Function
suberror:
  Select Case Err
    Case 429                        ' Word vorhanden, aber nicht offen
      Set word_open = CreateObject("word.Application") ' dann erstellen
    Case 5174
      MsgBox docFile & " nicht gefunden!" & vbCr & _
             "Word wird geschlossen.", vbCritical + vbOKOnly
      word_open.Application.Quit
    Case Else
      MsgBox Err.Description, vbCritical + vbOKOnly, "Fehler: " & Err
  End Select
  Resume Next                       ' weiter geht´s
End Function

Die folgende Funktion beendet MS-Word, wenn das letzte Dokument geschlossen wurde (Word.Documents.Close).

' Funktion:
Public Sub word_close(ByVal Word As Object, ByVal docFile As String)
  If Word.Documents.Count = 0 Then Word.Application.Quit
End Sub

Autor: ralf schlegel
Stand: 09/2004

Nach oben

0003 Printer.Objekt vs Systemdrucker - Drucken für Fortgeschrittene

Um in VB-Anwendungen zu drucken benutzen wird standardmäßig das Printer-Objekt. Die Auswahl und Einstellung des Drucker erfolgt hierbei wahlweise über das CommonDialog OCX (ComDlg32.ocx) oder - bei fortgeschrittenen Programmierern - über eine entsprechende Klasse, die die Funktionalität des o.g. OCX bereitstellt!

Wie auch immer: hierbei wird nur das VB-interne Printer-Objekt eingestellt und/oder manipuliert. Die im OCX bereitgestellt Eigenschaft 'PrinterDefault' ist nicht zu empfehlen, da jede Einstellungsänderung auch am Standard-Drucker des Systems vorgenommen wird und somit das Druckverhalten anderer Anwendungen beeinflußt.

Was aber, wenn wir über eine API-Funktion einen Druck anstoßen? Dann nützt uns die Einstellung des Printer-Objekts überhaupt nichts, da diese ja nicht auf unser Printer-Objekt schaut! In diesem Fall müssen die aktuelle Einstellungen temporär auf den Standarddrucker gesetzt werden.
So zum Beispiel bei der API-Funktion:
ShellExecute(hWnd, "print", [Dateiname], vbNullString, [Pfad], vbHide)

Dies erreichen wir durch zwei relativ unbekannte API-Funktionen 'GetDefaultPrinter' und 'SetDefaultPrinter'

Im hier bereitgestellten Beispiel sehen Sie wie das Ganze funktioniert. Es ist nur eine Demo zur Anregung, aber - programmieren wollen Sie ja sicher selber, oder? ...

   0003_vbzprinter.zip

Autor: ralf schlegel
Stand: 01/2009

Nach oben

0004 Collection-Objekt komfortabel löschen

Das Collection-Objekt kann sehr nützlich sein, um Listen zur Laufzeit im Speicher zu verwalten.
Muß die Liste wieder entfernt werden, so wird oft das folgende Beispiel präsentiert:

  For i = 1 To myCollection.Count   ' Da Auflistungen automatisch neu
    MyCollection.Remove 1           ' indiziert werden, jeweils das erste
                                    ' Element bei jeder Iteration entfernen
  Next

Gut - wenn sie Ihre CPU gerne im Kreis rotieren lassen und Zeit und Leistung für Sie keine Rolle spielen!
Schneller geht es als Einzeiler fogendermaßen:

  Set myCollection = New Collection ' alte Collection löschen

Autor: ralf schlegel
Stand: 01/2010

Nach oben