Autor Beitrag
Peter18
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Do 03.03.16 17: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 03.03.16 18:10 
Hier findest du ein (bis auf das with :puke:) ganz gutes Beispiel:
www.delphibasics.co....&ExpandCode1=Yes

Essenz:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  Printer.BeginDoc;
  Printer.Canvas.Font.Size := 16;
  Printer.Canvas.TextOut(5050'Test');
  Printer.NewPage;
  Printer.Canvas.TextOut(5050'Test');
  Printer.EndDoc;
Druck beginnen, Text ausgeben, neue Seite, Druck fertigstellen.
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Do 03.03.16 18: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 03.03.16 19: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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Sa 05.03.16 14: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 601
Erhaltene Danke: 339

W7
Delphi 6 pro
BeitragVerfasst: Do 10.03.16 12:09 
Moin Peter18,
hier habe ich ein Beispiel für den Druck des Inhaltes einer Listbox,
könnte vielleicht hilfreich sein :wink:
ausblenden volle Höhe Delphi-Quelltext
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;   //  4 mm
        linkerRand = 100;  // 10 mm
        obererRand = 120;  // 10 mm
        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);     // 1/10 mm aber Y geht nach oben
     GetWindowExtEx(OutDC,w);           // Auflösung ermitteln
     GetViewportExtEx(OutDC,v);
     setmapmode(OutDC,MM_ANISOTROPIC);         // neuer Abb.-Modus
     SetWindowExtEX(OutDC,w.cx,w.cy,nil);      // Skalierung ...
     SetViewPortExtEx(OutDC,v.cx,-v.cy,nil);
     Printer.Canvas.Font.Name:='Courier New';
     Printer.Canvas.Brush.Color:=clwhite;   // Hintergrundfarbe
     Printer.Canvas.Font.Height:=texthoehe;
     Printer.Canvas.Font.Style:=[fsbold];  // Kopfzeile
     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:=' '// Abstand zu Begriffen
     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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Do 10.03.16 18: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 10.03.16 19:02 
Moin!

user profile iconPeter18 hat folgendes geschrieben Zum zitierten Posting springen:
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 :nixweiss:). 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Do 10.03.16 19: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 10.03.16 20:59 
Moin!

user profile iconPeter18 hat folgendes geschrieben Zum zitierten Posting springen:
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... :roll:)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
GuaAck
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 376
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: Do 10.03.16 21: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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Fr 11.03.16 14: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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Mo 14.03.16 16:35 
Da gibts wohl ein Missverständnis.

user profile iconPeter18 hat folgendes geschrieben Zum zitierten Posting springen:
"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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Mo 21.03.16 18: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. :wink:

Also doch durch die API wühlen, da es eine Fritzkarte ist, keine Fritzbox.

Grüße von der etwas sonnigen Nordsee

Peter