 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
c.m.obrecht

Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 10.06.2006, 09:37 Titel: Drucken |
|
|
Hallo,
es gab einmal ein Thema übers Drucken; ich finde es jedoch nicht mehr und die dort genannte Methode funktionierte soviel ich weiss damals nicht.
Ich suche eine Alternative zu LPRINT; entweder über Windows, mit Druckerauswahl oder eine andere Alternative.
Danke  |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
Dominik
Anmeldungsdatum: 22.12.2004 Beiträge: 172
|
Verfasst am: 10.06.2006, 18:40 Titel: |
|
|
Hallo,
Zitat: | Ich suche eine Alternative zu LPRINT; entweder über Windows, mit Druckerauswahl oder eine andere Alternative. |
LPRINT bietet ja nur die Möglichkeit, einfachen Text in primitiver Schrift auszugeben. Gefällt mir persönlich garnicht. Eine Alternative wäre es über die WinAPI und Drucker DCs zu drucken. Diese ist meiner Meinung nach die beste aber auch die aufwendigste Art. Ich mach mich heute mal an die Arbeit, ein Beispielprogramm zu schreiben, damit das mit dem Drucken ein für alle Mal geklärt ist.  |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 10.06.2006, 20:34 Titel: |
|
|
LPRINT passt rein konzeptionell eigentlich gar nicht mehr in die heutige Betriebssystemlandschaft. Damals anfangs 80er-Jahre, als LPRINT "erfunden" wurde, arbeitete man noch ausschliesslich mit Single Task-MS-DOS, d.h. GW-BASIC/QBASIC verfügte über die gesamte Maschine. Ferner waren Matrixdrucker üblich, die eine Zeile einfach sofort auf dem damals üblichen Endlospapier mit abtrennbarem Lochrand für den Stachelwalzen-Vorwärtstransport ausgaben.
Seit Windows haben sich die Konzepte fundamental geändert. Mehrere gleichzeitig laufende Prozesse im Arbeitsspeicher bedeutet, dass auch ein Druckerverwaltungsmechanismus geschaffen werden musste, der sicherstellt, dass wenn zwei im Multitasking laufende Anwendungen gerade ihren Druckauftrag abschicken, auf dem Papier kein Mix aus Zeilen der beiden Druckjobs der nachfolgenden Art entsteht:
Mischmasch hat Folgendes geschrieben: | 10 PRINT "Hallo Welt"
Sehr geehrter Herr Müller
Ich beziehe mich auf Ihr Schreiben vom 19.05.2006. Leider
20 IF a% = 27 THEN GOTO 100
30 SCREEN 7
bin ich der verfügten Beitragkürzung überhaupt nicht
40 LINE (10, 10)-(200, 10)
einverstanden |
Windows hat dafür sinnvollerweise das Konzept der Druckerwarteschlange erhalten. Programme müssen dort ihre Ausdrucke immer als Druckjob aufgeben. Windows stellt dann sicher, dass Druckjobs immer als zusammenhängende Einheit ausgeführt werden. Dies bedingt für den Programmierer ein klarer Mechanismus, um dem Betriebssystem sagen zu können, wann der Druckauftrag beginnt, und wann er komplett ist, so dass er ausgeführt werden darf.
Aus diesen Grund gehört meiner Meinung nach LPRINT definitiv aus dem Befehlssatz abgeschafft, oder es müssten zwei neue Anweisungen
Code: | LPRINT BEGIN
LPRINT END |
in den Befehlssatz hineingenommen werden, damit man als Programmierer dem Betriebssystem klar mitteilen kann, wann der Druckauftrag für die Ausführung komplett ist.
Vielleicht müsste man dieses Problem den FreeBasic-Entwickler weiterleiten. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
Dominik
Anmeldungsdatum: 22.12.2004 Beiträge: 172
|
Verfasst am: 10.06.2006, 21:32 Titel: |
|
|
So, fertig.
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.
DefInt A-Z
Option Explicit
Option Private
#define WIN_INCLUDEALL
#include once "windows.bi"
Dim Shared szAppName As String
'Im Programm verwendete Fenster
Dim Shared hWnd As HWND
'
Declare Function WinMain(ByVal hInstance As HINSTANCE, _
ByVal hPrevInstance As HINSTANCE, _
szCmdLine As PSTR, _
ByVal iCmdShow As Integer)
End WinMain(GetModuleHandle(NULL), NULL, Command$, SW_NORMAL)
Declare Function WndProc(ByVal hWnd As HWND, _
ByVal message As UINT, _
ByVal wParam As WPARAM, _
ByVal lParam As LPARAM ) As LRESULT
Declare Function GetPrinterFromUser(hWnd As HWND) As PRINTDLG
Declare Function PrintMyPage() As BOOL
Declare Sub ZeichneFarbverlauf(ByVal hDC As HDC, Laenge As Integer, Breite As Integer)
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 PrintMyPage() As BOOL
Dim Printer As PRINTDLG
Dim di As DOCINFO
Dim hfMyFont As HFONT = CreateFont(200, 0, 0, 0, FW_ULTRABOLD, 0, True, 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
ZeichneFarbverlauf(Printer.hDC, 600, 300)
SetBkMode(Printer.hDC, TRANSPARENT)
SelectObject(Printer.hDC, hfMyFont)
SetTextColor(Printer.hDC, Rgb(255, 255, 255))
TextOut(Printer.hDC, 30, 40, StrPtr("Hallo"), 5)
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
Sub ZeichneFarbverlauf(ByVal hDC As HDC, Laenge As Integer, Breite As Integer)
Dim A As Integer
Dim B As Integer
For A = 0 To Laenge
For B = 0 To Breite
SetPixel(hDC, A, B, Rgb(B * (255 / Breite), B * (255 / Laenge), B * (255 / Laenge)))
Next B
Next A
End Sub
Function WndProc(ByVal hWnd As HWND, _
ByVal message As UINT, _
ByVal wParam As WPARAM, _
ByVal lParam As LPARAM) As LRESULT
Static PrintStatus As String
Dim ps As PAINTSTRUCT
Dim hDC As HDC
WndProc = 0
Select Case(message)
Case WM_CREATE
If PrintMyPage() = FALSE Then
PrintStatus = "Ausdrucken fehlgeschlagen."
Else
PrintStatus = "Daten an Drucker geschickt."
End If
Case WM_PAINT
hDC = BeginPaint(hWnd, @ps)
SetBkMode(hDC, TRANSPARENT)
TextOut(hDC, 0, 0, StrPtr(PrintStatus), Len(PrintStatus))
EndPaint(hWnd, @ps)
Case WM_DESTROY
PostQuitMessage(0)
Exit Function
End Select
WndProc = DefWindowProc(hWnd, message, wParam, lParam)
End Function
Function WinMain(ByVal hInstance As HINSTANCE, _
ByVal hPrevInstance As HINSTANCE, _
szCmdLine As PSTR, _
ByVal iCmdShow As Integer)
Dim wMsg As MSG
Dim wcls As WNDCLASS
szAppName = "Drucker Beispiel"
WinMain = 0
'Fensterklasse erstellen
With wcls
.style = CS_HREDRAW or CS_VREDRAW
.lpfnWndProc = @WndProc
.cbClsExtra = 0
.cbWndExtra = 0
.hInstance = hInstance
.hIcon = LoadIcon(NULL, ByVal IDI_APPLICATION)
.hCursor = LoadCursor(NULL, ByVal IDC_ARROW)
.hbrBackground = GetStockObject(ByVal COLOR_BACKGROUND)
.lpszMenuName = NULL
.lpszClassName = StrPtr(szAppName)
End With
'Registrieren der Fensterklasse
If (RegisterClass(@wcls) = False) Then
MessageBox NULL, "Dieses Programm benötigt Windows NT!", szAppName, MB_ICONERROR
Exit Function
End If
hWnd = CreateWindowEx(0, _
szAppName, _
szAppName, _
WS_OVERLAPPED + WS_SYSMENU + WS_MINIMIZEBOX, _
CW_USEDEFAULT, _
CW_USEDEFAULT, _
220, _
70, _
NULL, _
NULL, _
hInstance, _
NULL)
ShowWindow(hWnd, iCmdShow)
UpdateWindow(hWnd)
'Verwalten der Fensternachrichten
While(GetMessage(@wMsg, NULL, 0, 0 ) <> False)
TranslateMessage(@wMsg)
DispatchMessage(@wMsg)
Wend
WinMain = wMsg.wParam
End Function
|
Solltest du noch fragen haben, immer her damit.  |
|
Nach oben |
|
 |
c.m.obrecht

Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 11.06.2006, 15:41 Titel: |
|
|
Leider gehen beide Beispiele (der Link in der ersten Antwort und das Beispiel hier) bei mir nicht. "Expected Identifier: found "HWND" (dim shared hWnd as HWND)
Wegen meiner Freebasic-Version habe ich windows.bi durch win/user32.bi ersetzt |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 11.06.2006, 16:17 Titel: |
|
|
Zitat: | Leider gehen beide Beispiele (der Link in der ersten Antwort und das Beispiel hier) bei mir nicht. "Expected Identifier: found "HWND" (dim shared hWnd as HWND) |
Bei mir geht es.
Zitat: | Wegen meiner Freebasic-Version habe ich windows.bi durch win/user32.bi ersetzt |
Lade dir entweder Freebasic 0.15 oder Freebasic 0.16 runter.
Solche Workarounds werden halt in der Regel nicht unterstütz und bei der WinAPI gibt es halt grosse änderungen zwischen den Versionen. _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
Dominik
Anmeldungsdatum: 22.12.2004 Beiträge: 172
|
Verfasst am: 11.06.2006, 16:20 Titel: |
|
|
c.m.obrecht hat Folgendes geschrieben: | Leider gehen beide Beispiele (der Link in der ersten Antwort und das Beispiel hier) bei mir nicht |
Dann ist es höchste Eisenbahn die neuste FB-Version herunterzuladen.
c.m.obrecht hat Folgendes geschrieben: | Wegen meiner Freebasic-Version habe ich windows.bi durch win/user32.bi ersetzt |
Das geht nicht. Du musst nicht nur "user32.bi" sondern auch kernel und gdi includieren.
Aber lad dir einfach den neusten Compiler runter. Dann hast du solche Probleme nicht mehr.
//EDIT:
Michael Frey war schneller  |
|
Nach oben |
|
 |
c.m.obrecht

Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 14.06.2006, 22:30 Titel: |
|
|
Ich habe die Version 0.15b einmal heruntergeladen; doch wie muss ich dies installieren? Ich habe nur den Compiler und die IDE dazu nicht; muss ich einfach die Dateien im Ordner ersetzen? Die Beispiele gehen dann aber auch nicht mehr |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 14.06.2006, 23:31 Titel: |
|
|
alles löschen und alles neu draufinstallieren is am einfachsten, die IDE nich unbedingt aber beim compiler sollte man das immer machen (es sei denn du installierst ne testing version die die letzte stable braucht) _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
c.m.obrecht

Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 15.06.2006, 16:17 Titel: |
|
|
Ja die neue Version habe ich installiert; das ist nun alles in einem Ordner aber ohne die IDE eben. Wenn ich die alte Version deinstalliere ist ja die IDE weg... |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 15.06.2006, 16:49 Titel: |
|
|
die kannst du einfach separat installieren oO ansonsten lösch einfach alle dateien die nicht zur IDE gehören raus bevor du den neuen compiler installierst, die IDE läuft ja unabhängig vom compiler.. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
c.m.obrecht

Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 15.06.2006, 17:33 Titel: |
|
|
Jetzt ist mir gerade eine (hoffentlich) gute Idee gekommen! Man könnte ja den Compiler Path auf den neuen Compiler im alten Verzeichnis setzen; und dann kann ich den alten auch wieder benützen falls ein Programm mit dem neuen nicht klarkommt  |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 15.06.2006, 20:02 Titel: |
|
|
klar du kannst auch deine verzeichnisse ordnen
c:\programme\freebasic\IDE
c:\programme\freebasic\fb015stable
c:\programme\freebasic\fb016testing
c:\programme\freebasic\fb016stable
kannste alle compiler jeder version benutzen wenn du das nie löschst  _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
c.m.obrecht

Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 16.06.2006, 08:29 Titel: |
|
|
Super! Es funktioniert. Nun, wo muss ich z.B. Variablen, die ausgedruckt werden eingeben? Das ist natürlich etwas komplizierter als mit LPRINT. |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 16.06.2006, 09:03 Titel: |
|
|
Ich hab diese Zeile im Verdacht:
Code: | TextOut(Printer.hDC, 30, 40, StrPtr("Hallo"), 5) |
Wichtig ist einfach, das zu einen ZString beziehungsweise den Pointer darauf überigbst.
Siehe http://zstring.freebasic.de.
Ich bastle den Code gleich etwas um.
Edit:
Siehe http://freebasic.de/fbnp/index.php?view=431.
Es ist ziemlich Trickreich, weil im gleichen Code auch noch ein Fenster verwendet wird.
Ich versuche es zu vereinfachen.
Edit 2:
So, das sollte doch jetzt gehen: Wikibooks "Drucken".
(Ich habe mir erlaubt es auf Wikibooks hochzuladen, im Kommentar Oben ist ja schön beschrieben das Public Domain ist) _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
c.m.obrecht

Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 16.06.2006, 20:28 Titel: |
|
|
Die neue Version geht nicht (illegal outside a sub or function, found "static".
Die vorherige funktioniert. Mit Grafik ist ja schön, da ich mir WinAPI nicht so gewohnt bin ist es aber relativ schwer Werde einmal die 1. Version etwas zu ändern versuchen |
|
Nach oben |
|
 |
c.m.obrecht

Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 16.06.2006, 20:33 Titel: |
|
|
..bin schon näher dran Jetzt ist es einfach noch etwas gross und unterstrichen geschrieben, das werd eich auch noch herausfinden.
Wenn man mehrere Textvariablen usw. drucken möchte kann man diese einfach hinzufügen? |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 17.06.2006, 12:18 Titel: |
|
|
Die Schrift kannst du hier verstellen:
Code: | Dim hfMyFont As HFONT = CreateFont(200, 0, 0, 0, FW_ULTRABOLD, 0, True, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH, "Times New Roman") |
Zitat: | Wenn man mehrere Textvariablen usw. drucken möchte kann man diese einfach hinzufügen? |
Du musst einfach die beiden Strings mit + Zusammenhängen.
z.B.
a$=b$+c$
Willst du einen Zeilen Umbruch dazwischen, dann mach das:
a$=b$+chr(10)+chr(13)+c$
So gut erklärt?
Sonst einfach nach fragen.
Zitat: | Die neue Version geht nicht (illegal outside a sub or function, found "static" |
Achso, stimmt static ist unnötig, gefixed.
Link: http://de.wikibooks.org/wiki/FreeBasic:_Drucken.
Danke für den Hinweis! _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 17.06.2006, 20:05 Titel: |
|
|
statt chr(13)+chr(10) kann man in FB auch einfach chr(13,10) schreiben.. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
|
|
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.
|
|