| 
				
					|  | 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, 08: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, 17: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: 2530
 Wohnort: Hofen SH (Schweiz)
 
 | 
			
				|  Verfasst am: 10.06.2006, 19: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, 20: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, 14: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, 15: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, 15: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, 21: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, 22: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, 15: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, 15: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, 16: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, 19: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, 07: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, 08: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, 19: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, 19: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, 11: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, 19: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.
 
 |  |