Autor |
Beitrag |
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Do 03.03.16 16:16
Ein freundliches Hallo an alle,
trotz aller Bemühungen ist es mir noch nicht gelungen herauszufinden, wie ich eine Datei in Delphi 4 drucken kann.
Folgendes habe ich vor: Ich möchte eine Datei erstellen, die entweder Text oder etwas für den Drucker verständliches (.prn, .ssf) enthält. Der Drucker soll entweder der Standarddrucker oder der Faxdrucker (aus INI) sein. Da kein Dialog benötigt wird, geht das warscheinlich mit "TPrinter". Mit ".Printers" finde ich dann warscheinlich den Drucker. Aber wie übergebe ich die zu druckenden Daten??
"BeginDoc" hat keine Parameter, "NewPage" ebensowenig. Die Hilfe verwendet Dialoge, doch auch mit den Beispielen komme ich nicht klar. Irgendwie finde ich den roten Faden nicht. Wo ist Ariadne, die mir den Faden zeigt?? Warscheinlich ist es ganz einfach, aber ich finde den Einstieg nicht.
Grüße von der Nordsee
Peter
|
|
jaenicke
Beiträge: 19288
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 03.03.16 17:10
Hier findest du ein (bis auf das with ) ganz gutes Beispiel:
www.delphibasics.co....&ExpandCode1=Yes
Essenz:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| Printer.BeginDoc; Printer.Canvas.Font.Size := 16; Printer.Canvas.TextOut(50, 50, 'Test'); Printer.NewPage; Printer.Canvas.TextOut(50, 50, 'Test'); Printer.EndDoc; | Druck beginnen, Text ausgeben, neue Seite, Druck fertigstellen.
|
|
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Do 03.03.16 17:46
Hallo Sebastian,
Dank Dir für den Einstieg!
Damit kann ich Text drucken, aber wie geht das mit einer Datei oder formatiertem Text (RTF)? Muss ich die Datei als Stream einlesen und weiterleiten? Wie geht das mit einer "*.PRN"- oder einer Fax-Datei?? Oder geht das nicht? Bei Canvas habe ich nichts gefunden, womit ich Daten z.B. Byte für Byte weiter geben kann.
Grüße von der Nordsee
Peter
|
|
jaenicke
Beiträge: 19288
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 03.03.16 18:14
Formatierungen musst du selber machen. Sprich Schriftart auf Fettdruck setzen usw.
Wenn du etwas Fertiges suchst um formatierten Text zu drucken, kannst du nur externe Lösungen (Reports, RTF-Druckfunktionen, ...) nutzen oder bei RTF kannst du z.B. glaube ich aus dem RTF Control heraus drucken.
Was da bei Delphi 4 geht weiß ich allerdings nicht.
|
|
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Sa 05.03.16 13:37
Hallo Sebastian,
Dank Dir nochmals. Werd mich dann wohl doch durch die Schnittstelle wühlen müssen.
Grüße von der verregneten Nordsee
Peter
|
|
Fiete
Beiträge: 611
Erhaltene Danke: 347
W7
Delphi 6 pro
|
Verfasst: Do 10.03.16 11:09
Moin Peter18,
hier habe ich ein Beispiel für den Druck des Inhaltes einer Listbox,
könnte vielleicht hilfreich sein
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76:
| procedure TSuchsel.DruckenSClick(Sender: TObject); const maxzeilen = 57; texthoehe = 40; linkerRand = 100; obererRand = 120; Leer=' '; var Zeile,K,x,y: Integer; Autor,Name,TextZeile:String; w,v:TSize; OUTDC:HDC; Heute:TDateTime; Jahr,Monat,Tag:Word; begin if SuchListe.Items.Count=0 then begin MessageDlg('Es gibt NICHTS zu drucken!!',mtError,[mbOk],0); exit; end; Heute:=Now; DecodeDate(Heute,Jahr,Monat,Tag); Autor:='Fiete '+IntToStr(Jahr); Name:='Suchsel'; if PrintDialog.Execute then begin Printer.BeginDoc; outDC:=Printer.Canvas.Handle; setmapmode(OutDC,mm_lometric); GetWindowExtEx(OutDC,w); GetViewportExtEx(OutDC,v); setmapmode(OutDC,MM_ANISOTROPIC); SetWindowExtEX(OutDC,w.cx,w.cy,nil); SetViewPortExtEx(OutDC,v.cx,-v.cy,nil); Printer.Canvas.Font.Name:='Courier New'; Printer.Canvas.Brush.Color:=clwhite; Printer.Canvas.Font.Height:=texthoehe; Printer.Canvas.Font.Style:=[fsbold]; Printer.Canvas.TextOut(linkerRand,obererRand,Name+' © by '+Autor); Printer.Canvas.Font.style:=[]; zeile:=0; for y:=0 to MaxY do begin TextZeile:=''; for x:=0 to MaxX do TextZeile:=TextZeile+Feld[x,y]+' '; inc(zeile); Printer.Canvas.TextOut(linkerRand,obererRand+Zeile*(texthoehe+3),TextZeile); end; TextZeile:=' '; for x:=1 to 3 do begin inc(Zeile); Printer.Canvas.TextOut(linkerRand,obererRand+Zeile*(texthoehe+3),TextZeile); end; inc(Zeile);TextZeile:='Deine Suchbegriffe:'; Printer.Canvas.TextOut(linkerRand,obererRand+Zeile*(texthoehe+3),TextZeile); inc(Zeile);TextZeile:=' '; Printer.Canvas.TextOut(linkerRand,obererRand+Zeile*(texthoehe+3),TextZeile); TextZeile:=''; For K:=0 to SuchListe.Items.Count-1 do Begin TextZeile:=TextZeile+SuchListe.Items[K]+ Copy(Leer,1,30-Length(SuchListe.Items[K])); if K mod 3=2 then begin inc(zeile); Printer.Canvas.TextOut(linkerRand,obererRand+Zeile*(texthoehe+3),TextZeile); TextZeile:=''; end; End; if TextZeile<>'' then begin inc(zeile); Printer.Canvas.TextOut(linkerRand,obererRand+Zeile*(texthoehe+3),TextZeile); end; Printer.EndDoc; end end; |
Gruß Fiete
_________________ Fietes Gesetz: use your brain (THINK)
|
|
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Do 10.03.16 17:52
Hallo Fiete,
Dank Dir für Dein Beispiel. Da sind garantiert einige Anregungen drin, vor allem, wenn es an den Ethikettdruck geht.
Hast Du denn auch ein Beispiel für den direkten Druck einer binären Datei (z.B. *.PRN)?
Grüße von der Nordsee
Peter
|
|
Narses
Beiträge: 10182
Erhaltene Danke: 1255
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 10.03.16 18:02
Moin!
Peter18 hat folgendes geschrieben : | Hast Du denn auch ein Beispiel für den direkten Druck einer binären Datei (z.B. *.PRN)? |
Für einen lokal angeschlossenen Drucker wird das sehr schwierig, weil Windows direkte binäre Kommunikation mit dem Drucker nicht mehr vorsieht. Wenn sowas nötig war, habe ich mir immer eine lokale Freigabe des Druckers auf LPT2: oder so gemapped, dann kann man an der Kommandozeile mit copy /b <datei.prn> LPT2: eben das gewünschte an den Drucker schicken. Hab ich aber schon länger nicht mehr gemacht (und auch nicht gebraucht ). Ich erinnere mich allerdings daran, dass es ein paar Haken hatte, das hing sich gelegentlich auch mal komisch auf und so...
Wenn es allerdings um einen Netzwerkdrucker (besser: Printserver) geht, dann könnte man - sofern dieser das RAW-Protokoll anbietet, ggfs. in der Konfig freischalten - einfach eine TCP-Verbindung auf Port 9100 aufbauen, die Bytes, die man dann in diese Verbindung "reinsteckt", gehen 1:1 so an den Drucker. Gedankenbeispiel: lokal die PRN-Datei öffnen, TCP-Verbindung zu Printserver:9100 aufbauen, FileStream in den TCP-Stream schreiben, Port schließen, Druck kommt aus dem Drucker.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Do 10.03.16 18:40
Hallo Narses,
Dank Dir für Deine Antwort! Mein Vorhaben ist so ähnlich. Ich möchte Faxe senden. Mein Rechner hat zwar ein Modem, aber aus einem unerfindlichen Grund kann ich "Windoof" nicht für die Nebenstellenanlage konfigurieren. Er wartet immer auf das Freizeichen. Daher wollte ich einen Rechner mit Fritzkarte nutzen. Da der Rechner etwas weiter weg ist, dachte ich an einen kleinen Server, der die zu sendende Datei genannt bekommt (z.B. ein Word-Dokument) und diese dann als Datei ausgibt. Die Faxnummer wird in der Registry eingetragen und die Datei wird dann an den Faxdrucker geschickt. So die Theorie, ob das funktioniert weiß ich noch nicht. Direkt aus Word wird immer die Faxnummer abgefragt.
Grüße von der Nordsee
Peter
|
|
Narses
Beiträge: 10182
Erhaltene Danke: 1255
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 10.03.16 19:59
Moin!
Peter18 hat folgendes geschrieben : | Daher wollte ich einen Rechner mit Fritzkarte nutzen. |
AFAIR können die FritzBoxen Netzwerk-FAX, also irgendsoein proprietäres Protokoll unten drunter, aber auf der API-Seite ist das dann auf dem Rechner, auf dem du es nutzen willst, "nur" ein bestimmer Drucker(treiber).
Es gibt aber auch Unified-Messaging-Angebote im Netz, da schickst du ein Dokument per Mail hin, und die FAXen das dann für dich raus. (ist aber idR mit einem kleinen Obulus verbunden )
(Wobei man sich ersthaft heutzutage die Frage stellen sollte, ob FAX das "richtige" Medium ist. Z.B. wird beim Mediakonverter auf SIP das analoge FAX-Protokoll zwangsweise auf 9k6 baud gedrosselt, weil das sonst an den DA-Wandlern zu katastrophalen Ergebnissen führt, kurz: FAX unter VoIP ist grottenlangsam... )
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
GuaAck
Beiträge: 378
Erhaltene Danke: 32
Windows 8.1
Delphi 10.4 Comm. Edition
|
Verfasst: Do 10.03.16 20:39
Hallo,
noch eine Anregung zum Drucken:
Warum nicht den Text über das COM-Interface an WORD (oder EXCEL o.ä.) schicken? Man könnte in Word eine Formatvorlage mit Briefkopf usw. vorbereiten. Über COM erzeugt man ein neues Dokument auf Basis dieser Vorlage, fügt über COM den Text ein und schickt alles zum Drucker. Textumbruch, Schriftart usw. macht dann WORD entsprechend der Vorlage. Leider insgesamt nur mäßige Geschwindigkeit.
Gruß
GuaAck
|
|
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Fr 11.03.16 13:37
Hallo Narses, hallo GuaAck,
Danke für Eure Antworten.
Auf diese Weise drucken ist kein Problem, GuaAck! Aber faxen klappt nicht, wie zuvor beschrieben. Daher hoffe ich über den Umweg die Rufnummernabfrage unterdrücken zu können.
"AFAIR" hört sich interessant an, gibt es dazu irgendwo eine Beschreibung? Warscheinlich wird das bei mir aber nicht funktionieren, weil da eine FritzCard drin steckt. Fax ist immer noch weit verbreitet und vergleichsweise sicher wegen der Punkt zu Punkt-Verbindung.
Grüße von der etwas sonnigen Nordsee
Peter
|
|
Nersgatt
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Mo 14.03.16 15:35
Da gibts wohl ein Missverständnis.
Peter18 hat folgendes geschrieben : | "AFAIR" hört sich interessant an, gibt es dazu irgendwo eine Beschreibung? |
AFAIR steht einfach für "As far as i remember".
Was Narses also ausdrücken wollte war "Soweit ich mich erinnere können die FritzBoxen Netzwerk-FAX, also irgendsoein proprietäres Protokoll unten drunter, aber auf der API-Seite ist das dann auf dem Rechner, auf dem du es nutzen willst, "nur" ein bestimmer Drucker(treiber)."
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Für diesen Beitrag haben gedankt: Narses
|
|
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Mo 21.03.16 17:11
Hallo Jens,
dank Dir für Deine Antwort. Das ist das Problem mit den Abkürzungen, wenn man nicht zu den Eingeweihten gehört, stellt man "dumme" Fragen.
Also doch durch die API wühlen, da es eine Fritzkarte ist, keine Fritzbox.
Grüße von der etwas sonnigen Nordsee
Peter
|
|
|