Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Drucken mit oder durch Freebasic?

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 10.02.2019, 20:08    Titel: Drucken mit oder durch Freebasic? Antworten mit Zitat

Welche Möglichkeiten habe ich, durch ein selbstgeschriebenes Programm den Drucker anzusteuern bzw. zu drucken? Das Beispiel was es im Internet auf Freebasic-Portal.de gibt, funktioniert bei mir nicht. Den Drucker muss man durch ein Fenster auswählen können! Entweder soll eine Datei (.txt, .doc, .xls, ...) ausgedruckt werden, oder der Inhalt einer bzw. mehreren Variablen. Viel habe ich bisher nicht gefunden.

Bei dem Beispiel aus dem Internet, druckt der gar nichts. Es kommt immer nur ein leeres Blatt Papier raus.

Bedanke mich im Voraus für die Hilfe!

Gruß
ALWIM
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
RockTheSchock



Anmeldungsdatum: 04.04.2007
Beiträge: 138

BeitragVerfasst am: 01.06.2019, 15:44    Titel: PDF erzeugen als Zwischenschritt zum Drucken Antworten mit Zitat

Du könntest eine PDF Datei als Zwischenschritt erzeugen. Da gibt es z.B. libHaru

https://www.freebasic.net/forum/viewtopic.php?t=9009
https://www.freebasic.net/forum/viewtopic.php?f=14&t=9014&p=77375&hilit=haru#p77375
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 28.03.2020, 03:50    Titel: Antworten mit Zitat

Ich hole das Thema noch einmal hoch, da ich es jetzt geschafft habe, etwas zu drucken! Habe mich heute nochmal mit dem Thema drucken befasst. Das hat mich einfach keine Ruhe gelassen. Mit dem untenstehenden Beispiel, kann ich drucken und es kann vorher auch ein Drucker ausgewählt werden. So weit so gut! Aber das ist jetzt nur eine Zeile. Wie drucke ich jetzt da mehrere Zeilen nacheinander? Quasi als Schleife von 1 bis xx???

Stelle mir das so vor:
Ich habe ein oder zwei Strings mit mehreren Inhalten.
Zum Beispiel: Zahl(i) oder Geld(i)
i geht von 1 bis 20.

Ich wähle den Drucker aus anschließend druckt der Zeile für Zeile, alle Inhalte der Variable Zahl von 1 bis 20. Immer schön untereinander.

Habe noch keine Idee, wie ich das mit dem geposteten Quellcode hinkriege?

Code:
'Dieses Beispielprogramm soll die Verwendung des Print-Dialogs zeigen und
 'ein Beispiel für das Schreiben in einen Drucker-DC sein.
 'Der Autor, Dominik Schäffner, übernimmt keine Haftung für irgendwelche
 'Schäden, die durch den Gebrauch des Programmes entstanden sind.
 'Dieses Beispielprogramm darf ohne jegliche Einschränkungen
 'meinerseits frei verwendet werden.
 
 'Modifikation durch Michael Frey 16.06.2006
 '(Entfernung der Fenster)
 '(PrintMyText)
 
 ' DefInt A-Z
 ' Option Explicit
 ' Option Private
 
 
 SCREENRES 640, 320, 32
 
 #define WIN_INCLUDEALL
 #include once "windows.bi"
 
 Declare Function GetPrinterFromUser(hWnd As HWND) As PRINTDLG
 Declare Function PrintMyText(text AS zstring ptr, lang as uinteger,gross as uinteger) As BOOL
 
 Dim SHARED PrintStatus As String
 Dim Shared hWnd As HWND
 Dim SHARED ps As PAINTSTRUCT
 Dim SHARED hDC As HDC
 Dim SHARED AS STRING text
 dim SHARED AS UINTEGER gross
 
 
 'Hier bitte Programmieren ;-)   
 
 
 ' input Text
 ' input gross
 
 text = "Dies ist ein Test!"
 gross = 160
 
 SLEEP

 IF PrintMyText(strptr(Text),len(Text),gross) = FALSE Then
     PRINT "Ausdrucken fehlgeschlagen."
 Else
     PRINT "Daten an Drucker geschickt."
 End IF
 '/
 
 SLEEP
 END
 
 
 
 Function GetPrinterFromUser(hWnd As HWND) As PRINTDLG
     Dim pd As PRINTDLG
   
     With pd
         .lStructSize    = SizeOf(PRINTDLG)
         .hwndOwner      = hWnd
         .Flags          = PD_ALLPAGES Or PD_COLLATE Or PD_RETURNDC Or PD_NOSELECTION
     End With
   
     PrintDlg(@pd)
   
     Return pd
 End Function
 
 Function PrintMyText(text AS zstring ptr, lang as uinteger,gross as uinteger) As BOOL
     Dim Printer As PRINTDLG
     Dim di As DOCINFO
     Dim hfMyFont As HFONT = CreateFont(gross, 0, 0, 0, 0, 0, 0, 0,_
        DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY,_
        DEFAULT_PITCH, "Times New Roman")
   
     'Printer-Dialog anzeigen
     Printer = GetPrinterFromUser(hWnd)
   
     With di
         .cbSize         = SizeOf(DOCINFO)
         .lpszDocName    = StrPtr("DruckerTest")
     End With
   
     'Ausdrucken
     If StartDoc(Printer.hDC, @di) <= 0 Then Return FALSE
     If StartPage(Printer.hDC) <= 0 Then Return FALSE
 
     SetMapMode(Printer.hDC, MM_TEXT)
     SetBkMode(Printer.hDC, TRANSPARENT)
     SelectObject(Printer.hDC, hfMyFont)
     SetTextColor(Printer.hDC, Rgb(0, 0, 0))
     TextOut(Printer.hDC, 30, 40, text, lang)
     If EndPage(Printer.hDC) <= 0 Then Return FALSE
     If EndDoc(Printer.hDC) <= 0 Then Return FALSE
   
     'Aufräumen
     DeleteDC(Printer.hDC)
     DeleteObject(hfMyFont)
   
     Return TRUE
 End FUNCTION

_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 28.03.2020, 17:55    Titel: Antworten mit Zitat

Hallo ALWIM lächeln

Ich schlage vor, den Text als Array zu übergeben:
Code:
'Dieses Beispielprogramm soll die Verwendung des Print-Dialogs zeigen und
'ein Beispiel für das Schreiben in einen Drucker-DC sein.
'Der Autor, Dominik Schäffner, übernimmt keine Haftung für irgendwelche
'Schäden, die durch den Gebrauch des Programmes entstanden sind.
'Dieses Beispielprogramm darf ohne jegliche Einschränkungen
'meinerseits frei verwendet werden.

'Modifikation durch Michael Frey 16.06.2006
'(Entfernung der Fenster)
'(PrintMyText)

' DefInt A-Z
' Option Explicit
' Option Private


ScreenRes 640, 320, 32

#define WIN_INCLUDEALL
#Include Once "windows.bi"

Declare Function GetPrinterFromUser(hWnd As HWND) As PRINTDLG
Declare Function PrintMyText(text() As String, gross As UInteger) As BOOL

Dim Shared PrintStatus As String
Dim Shared hWnd As HWND
Dim Shared ps As PAINTSTRUCT
Dim Shared hDC As HDC
ReDim As String text(Any)
Dim Shared As UInteger gross


'Hier bitte Programmieren ;-)


' input Text
' input gross

'text = "Dies ist ein Test!"
ReDim text(4)
text(0) = "Dies ist Zeile 1"
text(1) = "Dies ist Zeile 2"
text(2) = "Dies ist Zeile 3"
text(3) = "Dies ist Zeile 4"
gross = 160

SLEEP

If PrintMyText(Text(),gross) = FALSE Then
   Print "Ausdrucken fehlgeschlagen."
Else
   Print "Daten an Drucker geschickt."
End If
'/

Sleep
End



Function GetPrinterFromUser(hWnd As HWND) As PRINTDLG
   Dim pd As PRINTDLG

   With pd
      .lStructSize    = SizeOf(PRINTDLG)
      .hwndOwner      = hWnd
      .Flags          = PD_ALLPAGES Or PD_COLLATE Or PD_RETURNDC Or PD_NOSELECTION
   End With

   PrintDlg(@pd)

   Return pd
End Function

Function PrintMyText(txt() As String, gross As UInteger) As BOOL
   Dim Printer As PRINTDLG
   Dim di As DOCINFO
   Dim hfMyFont As HFONT = CreateFont(gross, 0, 0, 0, 0, 0, 0, 0,_
   DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY,_
   DEFAULT_PITCH, "Times New Roman")

   'Printer-Dialog anzeigen
   Printer = GetPrinterFromUser(hWnd)

   With di
      .cbSize         = SizeOf(DOCINFO)
      .lpszDocName    = StrPtr("DruckerTest")
   End With

   'Ausdrucken
   If StartDoc(Printer.hDC, @di) <= 0 Then Return FALSE
   If StartPage(Printer.hDC) <= 0 Then Return FALSE

   SetMapMode(Printer.hDC, MM_TEXT)
   SetBkMode(Printer.hDC, TRANSPARENT)
   SelectObject(Printer.hDC, hfMyFont)
   SetTextColor(Printer.hDC, RGB(0, 0, 0))
   For x As Integer = 0 To UBound(txt)
      TextOut(Printer.hDC, 30, gross * x + 40, StrPtr(txt(x)), Len(txt(x)))
   Next
   If EndPage(Printer.hDC) <= 0 Then Return FALSE
   If EndDoc(Printer.hDC) <= 0 Then Return FALSE

   'Aufräumen
   DeleteDC(Printer.hDC)
   DeleteObject(hfMyFont)

   Return TRUE
End Function


Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 28.03.2020, 18:20    Titel: Antworten mit Zitat

Genau das will ich tun. Den Text als Array übergeben! Habe es nur noch nicht hinbekommen. Bin die ganze Zeit schon am testen. Bekomme immer Fehlermeldungen. Erkennt der automatisch das Ende eines Papiers? Wenn ich jetzt 500 Zeilen drucken will und dann eine Zeile nicht mehr ganz auf dem Papier drauf ist? Sicherlich kann man auch mehrere Arrays in einer Zeile drucken oder? Auch das versuche ich die ganze Zeit schon zu realisieren! Das "+" zwischen den Arrays schluckt der irgendwie nicht?

Code:
i + " " + Diridari(i)


Irgendwas muss ich übersehen haben. Werde gleich nochmals testen...

Wenn das Beispiel von grindstone funktioniert, ist das nicht schlecht. Immerhin ein Anfang. Vielen herzlichen Dank für die Hilfe!

Edit: Kennt einer von euch auch die Befehle für die Druckvorschau? Ist aber jetzt keine Bedingung bzw. muss.

Edit2: Das Beispiel von grindstone funktioniert nicht! Der Drucker druckt wieder nichts. Es kommt immer die Meldung "Ausdrucken fehlgeschlagen."
_________________
SHELL SHUTDOWN -s -t 05


Zuletzt bearbeitet von ALWIM am 28.03.2020, 20:05, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 28.03.2020, 20:02    Titel: Antworten mit Zitat

Ich fürchte, du hast da etwas falsch verstanden. Du mußt Text (und nur Text) an den Drucker schicken. Dein
Code:
i + " " + Diridari(i)
müsste korrekt lauten:
Code:
text(0) = Str(i) + " " + Str(Diridari(i))


Und das wird dann an den in TextOut angegebenen Koordinaten aufs Papier gebracht, wobei TextOut bei jedem Aufruf nur eine Zeile druckt, bei den entsprechenden Koordinaten auch überlappend. Um das korrekte Seitenlayout mußt du dich also selber kümmern.

Was beim Überschreiten der Papiergrenzen passiert, dürfte vom Drucker abhängen. Sowohl mein Deskjet 690 (Tinte) als auch mein QMS 860 (Laser) schneiden die überstehenden Teile einfach ab (sowohl vertikal als auch horizontal).

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 28.03.2020, 20:16    Titel: Antworten mit Zitat

grindstone hat Folgendes geschrieben:
Ich fürchte, du hast da etwas falsch verstanden. Du mußt Text (und nur Text) an den Drucker schicken. Dein
Code:
i + " " + Diridari(i)
müsste korrekt lauten:
Code:
text(0) = Str(i) + " " + Str(Diridari(i))


Und das wird dann an den in TextOut angegebenen Koordinaten aufs Papier gebracht, wobei TextOut bei jedem Aufruf nur eine Zeile druckt, bei den entsprechenden Koordinaten auch überlappend. Um das korrekte Seitenlayout mußt du dich also selber kümmern.

Was beim Überschreiten der Papiergrenzen passiert, dürfte vom Drucker abhängen. Sowohl mein Deskjet 690 (Tinte) als auch mein QMS 860 (Laser) schneiden die überstehenden Teile einfach ab (sowohl vertikal als auch horizontal).

Gruß
grindstone


Bei deinem Beispiel wird nichts gedruckt! Zumindest bei mir. Es kommt immer die Meldung "Ausdrucken fehlgeschlagen."
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 28.03.2020, 21:34    Titel: Antworten mit Zitat

Also das ganze nochmal komplett:
Code:
'Dieses Beispielprogramm soll die Verwendung des Print-Dialogs zeigen und
'ein Beispiel für das Schreiben in einen Drucker-DC sein.
'Der Autor, Dominik Schäffner, übernimmt keine Haftung für irgendwelche
'Schäden, die durch den Gebrauch des Programmes entstanden sind.
'Dieses Beispielprogramm darf ohne jegliche Einschränkungen
'meinerseits frei verwendet werden.

'Modifikation durch Michael Frey 16.06.2006
'(Entfernung der Fenster)
'(PrintMyText)

' DefInt A-Z
' Option Explicit
' Option Private


ScreenRes 640, 320, 32

#define WIN_INCLUDEALL
#Include Once "windows.bi"

Declare Function GetPrinterFromUser(hWnd As HWND) As PRINTDLG
Declare Function PrintMyText(text() As String, gross As UInteger) As BOOL

Dim Shared PrintStatus As String
Dim Shared hWnd As HWND
Dim Shared ps As PAINTSTRUCT
Dim Shared hDC As HDC
ReDim As String text(Any)
Dim Shared As UInteger gross


'Hier bitte Programmieren ;-)


' input Text
' input gross
Dim As Integer diridari(5)
diridari(1) = 100
diridari(2) = 200
diridari(3) = 300
diridari(4) = 400
diridari(5) = 500

Dim As Integer i

ReDim text(0)

i = 3
text(0) = Str(i) + " " + Str(Diridari(i))

gross = 160

SLEEP

If PrintMyText(Text(),gross) = FALSE Then
   Print "Ausdrucken fehlgeschlagen."
Else
   Print "Daten an Drucker geschickt."
End If
'/

Sleep
End



Function GetPrinterFromUser(hWnd As HWND) As PRINTDLG
   Dim pd As PRINTDLG

   With pd
      .lStructSize    = SizeOf(PRINTDLG)
      .hwndOwner      = hWnd
      .Flags          = PD_ALLPAGES Or PD_COLLATE Or PD_RETURNDC Or PD_NOSELECTION
   End With

   PrintDlg(@pd)

   Return pd
End Function

Function PrintMyText(txt() As String, gross As UInteger) As BOOL
   Dim Printer As PRINTDLG
   Dim di As DOCINFO
   Dim hfMyFont As HFONT = CreateFont(gross, 0, 0, 0, 0, 0, 0, 0,_
   DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY,_
   DEFAULT_PITCH, "Times New Roman")

   'Printer-Dialog anzeigen
   Printer = GetPrinterFromUser(hWnd)

   With di
      .cbSize         = SizeOf(DOCINFO)
      .lpszDocName    = StrPtr("DruckerTest")
   End With

   'Ausdrucken
   If StartDoc(Printer.hDC, @di) <= 0 Then Return FALSE
   If StartPage(Printer.hDC) <= 0 Then Return FALSE

   SetMapMode(Printer.hDC, MM_TEXT)
   SetBkMode(Printer.hDC, TRANSPARENT)
   SelectObject(Printer.hDC, hfMyFont)
   SetTextColor(Printer.hDC, RGB(0, 0, 0))
   For x As Integer = 0 To UBound(txt)
      TextOut(Printer.hDC, 30, gross * x + 40, StrPtr(txt(x)), Len(txt(x)))
   Next
   If EndPage(Printer.hDC) <= 0 Then Return FALSE
   If EndDoc(Printer.hDC) <= 0 Then Return FALSE

   'Aufräumen
   DeleteDC(Printer.hDC)
   DeleteObject(hfMyFont)

   Return TRUE
End Function


Es müsste
    3 300
ausdrucken. Bei mir funktioniert es.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 29.03.2020, 03:21    Titel: Antworten mit Zitat

Bei mir funktioniert es nicht! Egal was ich versuche. Keine Ahnung warum? Ich brauche zu 100% was funktionsfähiges, sonst kann ich das ganze vergessen...
Sollte auch zur Not 2 oder gar 3 Seiten drucken, wenn eine Seite nicht ausreicht. Ich dachte echt, ich hatte es. mit dem Kopf durch die Mauer wollen Stehe eigentlich kurz davor. So nah und doch so weit entfernt! lachen
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 29.03.2020, 17:21    Titel: Antworten mit Zitat

Jetzt muss ich mich nochmals mit neuen Infos melden!

Also:
Es geht doch! Kann etwas ausdrucken. Allerding momentan nicht auf dem Rechner, den ich fürs Internet und alles andere benutze! Auf einem Uralt-Laptop mit Win XP habe ich nun meinen Drucker-Treiber installiert und konnte somit etwas ausdrucken. Auch so wie ich es haben will! Siehe Quellcode...

Code:
'Dieses Beispielprogramm soll die Verwendung des Print-Dialogs zeigen und
 'ein Beispiel für das Schreiben in einen Drucker-DC sein.
 'Der Autor, Dominik Schäffner, übernimmt keine Haftung für irgendwelche
 'Schäden, die durch den Gebrauch des Programmes entstanden sind.
 'Dieses Beispielprogramm darf ohne jegliche Einschränkungen
 'meinerseits frei verwendet werden.
 
 'Modifikation durch Michael Frey 16.06.2006
 '(Entfernung der Fenster)
 '(PrintMyText)
 
 ' DefInt A-Z
 ' Option Explicit
 ' Option Private
 
 
 SCREENRES 640, 320, 32
 
 #define WIN_INCLUDEALL
 #include once "windows.bi"
 
 Declare Function GetPrinterFromUser(hWnd As HWND) As PRINTDLG
 Declare Function PrintMyText() As BOOL
 
 Dim SHARED PrintStatus As String
 Dim Shared hWnd As HWND
 Dim SHARED ps As PAINTSTRUCT
 Dim SHARED hDC As HDC
 Dim SHARED AS STRING text, Namen(20)
 dim SHARED AS UINTEGER gross
 
 
 'Hier bitte Programmieren ;-)   
 
 
 ' input Text
 ' input gross
 
 text = "Dies ist ein Test!"
 gross = 160
 
 Namen(1) = "Bauer Mark"
 Namen(2) = "Schneider Jochen"
 Namen(3) = "Schuster Erwin"
 Namen(4) = "Becker Bernd"
 Namen(5) = "Lummer Karl"
 Namen(6) = "Seifert Hans"
 Namen(7) = "Kolb Andreas"
 Namen(8) = "Merz Franz"
 Namen(9) = "Schneider Winfried"
 Namen(10) = "Holzer Richard"
 Namen(11) = "Kaufmann Sandra"
 Namen(12) = "Denk Doris"
 Namen(13) = "Bauer Markus"
 Namen(14) = "Werner Werner"
 Namen(15) = "Rindfleisch Dietmar"
 Namen(16) = "Winter Karina"
 Namen(17) = "Stadler Nepomuk"
 Namen(18) = "Krauße Anton"
 Namen(19) = "Fink Hubert"
 Namen(20) = "Zimmermann Ralf"
 
 SLEEP

 IF PrintMyText() = FALSE Then
     PRINT "Ausdrucken fehlgeschlagen."
 Else
     PRINT "Daten an Drucker geschickt."
 End IF
 '/
 
 SLEEP
 END
 
 
 
 Function GetPrinterFromUser(hWnd As HWND) As PRINTDLG
     Dim pd As PRINTDLG
   
     With pd
         .lStructSize    = SizeOf(PRINTDLG)
         .hwndOwner      = hWnd
         .Flags          = PD_ALLPAGES Or PD_COLLATE Or PD_RETURNDC Or PD_NOSELECTION
     End With
   
     PrintDlg(@pd)
   
     Return pd
 End Function
 
 Function PrintMyText() As BOOL
     Dim Printer As PRINTDLG
     Dim di As DOCINFO
     Dim hfMyFont As HFONT = CreateFont(gross, 0, 0, 0, 0, 0, 0, 0,_
        DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY,_
        DEFAULT_PITCH, "Times New Roman")
   
     'Printer-Dialog anzeigen
     Printer = GetPrinterFromUser(hWnd)
   
     With di
         .cbSize         = SizeOf(DOCINFO)
         .lpszDocName    = StrPtr("DruckerTest")
     End WITH
   
     'Ausdrucken
     If StartDoc(Printer.hDC, @di) <= 0 Then Return FALSE
     If StartPage(Printer.hDC) <= 0 Then Return FALSE
 
     SetMapMode(Printer.hDC, MM_TEXT)
     SetBkMode(Printer.hDC, TRANSPARENT)
     SelectObject(Printer.hDC, hfMyFont)
     SetTextColor(Printer.hDC, Rgb(0, 0, 0))
     
     FOR x AS INTEGER = 1 TO 20
     ' Text = STR(x) + " " + Namen(x)
     TextOut(Printer.hDC, 30, 160 * x + 40, STR(x) + " " + Namen(x), LEN(Namen(x)))
     NEXT
     
     
     If EndPage(Printer.hDC) <= 0 Then Return FALSE
     If EndDoc(Printer.hDC) <= 0 Then Return FALSE
   
     'Aufräumen
     DeleteDC(Printer.hDC)
     DeleteObject(hfMyFont)
   
     Return TRUE
 End FUNCTION
Nun zu einem anderen Problem. Eigentlich nur eine Verständnisfrage: Beim Ausdruck, werden die Namen nicht ganz ausgedruckt! Es fehlen bei jedem Namen, ein paar Buchstaben. Was habe ich übersehen? Meine Vermutung ist, dass ich die Länge nicht beachtet habe? Der Verdacht liegt sehr nahe! Muss ich nochmal testen. Glaube, dass ich richtig liege. Wenn ich jetzt 100 Namen ausdrucken will, ist ja irgendwann das Blatt Papier zu ende. Wie bestimme ich, oder weiß mein Programm wann ein neues Blatt Papier anfängt? Ich muss meinem Programm irgendwie mitteilen, dass jetzt ein neues Papier anfängt. Ich werde auf meinem Rechner meinen Drucker-Treiber nochmal neu installieren. Vielleicht funktioniert mein Drucker dann wieder. Am Layout vom ausgedruckten muss ich auch noch etwas feilen. Sicherlich kann man da auch Linien zwischen den Namen mit einbauen, die dann mit ausgedruckt werden oder? Sonst aber funktioniert das ganze schon mal!
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 29.03.2020, 19:20    Titel: Antworten mit Zitat

Die Buchstaben werden verschluckt, weil du eine falsche Zeilenlänge angibst. Ein Seitenwechsel erfolgt mit EndPage, wann die Seite voll ist, mußt du allerdings selber berechnen.

Mit diesen Modifikationen druckt dein Programm die kompletten Zelen und beginnt alle 8 Zeilen eine neue Seite:
Code:
...
   SelectObject(Printer.hDC, hfMyFont)
   SetTextColor(Printer.hDC, RGB(0, 0, 0))

   Dim As String g
   Dim As Integer y
   For x As Integer = 1 To UBound(Namen)
      g = Str(x) + " " + Namen(x) 'zu druckende zeile
      y += gross + 40 'vertikale position der zeile
      TextOut(Printer.hDC, 30, y, StrPtr(g), Len(g))
      If x Mod 8 = 0 Then 'seitenwechsel alle 8 zeilen
         If EndPage(Printer.hDC) <= 0 Then Return FALSE 'seitenwechsel
         y = 0 'positionszähler zurücksetzen
      EndIf
   Next

   If EndPage(Printer.hDC) <= 0 Then Return FALSE
   If EndDoc(Printer.hDC) <= 0 Then Return FALSE

   'Aufräumen
   DeleteDC(Printer.hDC)
...


Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 29.03.2020, 20:12    Titel: Antworten mit Zitat

grindstone hat Folgendes geschrieben:
Die Buchstaben werden verschluckt, weil du eine falsche Zeilenlänge angibst. Ein Seitenwechsel erfolgt mit EndPage, wann die Seite voll ist, mußt du allerdings selber berechnen.

Mit diesen Modifikationen druckt dein Programm die kompletten Zelen und beginnt alle 8 Zeilen eine neue Seite:
Code:
...
   SelectObject(Printer.hDC, hfMyFont)
   SetTextColor(Printer.hDC, RGB(0, 0, 0))

   Dim As String g
   Dim As Integer y
   For x As Integer = 1 To UBound(Namen)
      g = Str(x) + " " + Namen(x) 'zu druckende zeile
      y += gross + 40 'vertikale position der zeile
      TextOut(Printer.hDC, 30, y, StrPtr(g), Len(g))
      If x Mod 8 = 0 Then 'seitenwechsel alle 8 zeilen
         If EndPage(Printer.hDC) <= 0 Then Return FALSE 'seitenwechsel
         y = 0 'positionszähler zurücksetzen
      EndIf
   Next

   If EndPage(Printer.hDC) <= 0 Then Return FALSE
   If EndDoc(Printer.hDC) <= 0 Then Return FALSE

   'Aufräumen
   DeleteDC(Printer.hDC)
...


Gruß
grindstone

Das mit der Länge habe ich mir schon gedacht! War auch meine Vermutung zu Beginn. Kaum geändert und schon sind alle Buchstaben da.

Code:
Ein Seitenwechsel erfolgt mit EndPage, wann die Seite voll ist, mußt du allerdings selber berechnen.
Jetzt wäre eine Druckvorschau nicht schlecht! Sonst muss ich jedes Mal etwas ausdrucken. Mal schauen, wie ich das löse?

Ich danke vielmals für die Hilfe! Habe es aber zum großen Teil selber hinbekommen. lächeln
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 29.03.2020, 20:42    Titel: PDF-Drucker zum Testen der Druckausgabe Antworten mit Zitat

ALWIM hat Folgendes geschrieben:
Jetzt wäre eine Druckvorschau nicht schlecht! Sonst muss ich jedes Mal etwas ausdrucken.

Du könntest für Tests auch einfach einen PDF-Drucker wie z. B. PDFCreator nutzen.
_________________

Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 31.03.2020, 18:52    Titel: Re: PDF-Drucker zum Testen der Druckausgabe Antworten mit Zitat

Sebastian hat Folgendes geschrieben:
ALWIM hat Folgendes geschrieben:
Jetzt wäre eine Druckvorschau nicht schlecht! Sonst muss ich jedes Mal etwas ausdrucken.

Du könntest für Tests auch einfach einen PDF-Drucker wie z. B. PDFCreator nutzen.
Nicht nötig, da ich beim Drucker einfach die Druckvorschau aktivieren kann! Funktioniert. Somit wird vor dem Drucken eine Vorschau auf dem Bildschirm angezeigt. Ich brauche dann lediglich auf abbrechen klicken. Jetzt muss ich nur noch am Design etwas machen. Aber ich muss auf meinem Rechner irgendwie (durch mein Programm) den Drucker abgeschossen haben? Kann seit Samstag nichts mehr drucken. Drucker schon mehrfach neu installiert. Treiber ist installiert, aber es kann kein Druckauftrag gestartet werden. Am Freitag habe ich noch durch einen Test etwas drucken können. Seitdem ging nichts mehr. Immer wenn ich auf drucken klicke, kommt die Meldung: Der Druckvorgang konnte nicht gestartet werden. Drucker wird ordnungsgemäß erkannt. Auch die Füllstände werden korrekt angezeigt. Auch im Gerätemanager wird der Drucker (korrekt) angezeigt. Schon seltsam? Schon mal einer ein solches Problem gehabt? Will den Rechner jetzt nicht unbedingt neu installieren.

Wie gut, dass ich einen zweiten Rechner habe! Man sollte Altertümer nicht gleich entsorgen. Sind immer für irgendwas gut. grinsen
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz