Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Drucken im Netzwerk (https://www.delphipraxis.net/35890-drucken-im-netzwerk.html)

_HAWK_ 13. Dez 2004 12:41


Drucken im Netzwerk
 
Hallo,

ich habe ein kleines Problem und hoffe das mir jemand helfen kann.
Ich will auf einem Drucker im Netzwerk drucken.
Ich habe es bereits mit dem Indy-Client IDLPR von Delphi 7 versucht jedoch bekomme ich immer beim IDLPR.connect einen Fehler 'Soket Fehler # 10061 Verbindung abgelehnt'
Kann mir bitte jemand sagen was ich falsch gemacht habe?

Schon mal danke im Vorraus!

mfg HAWK

Hansa 13. Dez 2004 12:45

Re: Drucken im Netzwerk
 
Wird der Netzwerkdrucker überhaupt in einem Print-Dialog angezeigt (z.B. auch in Word) ? Sind die Freigaben richtig ? Hat der eingeloggte User überhaupt das Recht auf den Drucker zu drucken ? Viele Fragen. 8)

fkerber 13. Dez 2004 12:46

Re: Drucken im Netzwerk
 
Hi!

Wie sieht denn dein Code bisher aus?


Ciao Frederic

DelphiFreund 13. Dez 2004 12:57

Re: Drucken im Netzwerk
 
Es kann nur über einen Drucker gedruckt werden der auch eingerichtet ist, zumindest hab ich es noch nicht anders gesehen, dann steht aber auch der Drucker im Pintdialog von Word, etc.


Gruß DelphiFreund

_HAWK_ 13. Dez 2004 14:15

Re: Drucken im Netzwerk
 
Ja der Drucker ist im Printdialog mit auf geführt
Reicht es denn nicht dass ich mit IDLPR.Host:='IP-Adresse' den Host angebe und mit IDLPR.connect schon mal ein Verbindung bekomme?

Marcel Gascoyne 13. Dez 2004 14:37

Re: Drucken im Netzwerk
 
LPR hat rein gar nichts mit Windows Freigaben (=SMB) zu tun. LPR ist ein auf TCP/IP basierendes Protokoll zur Druckersteuerung unter UNIX.

Wenn der entsprechende Netzwerkdrucker (=Drucker mit Printserver) kein LPR Protokoll unterstützt kannst Du mit Indy auch nicht darauf drucken. Ein Drucker an einem anderen Windows Rechner wird in der Regel nicht über LPR ansprechbar sein.

Bei LPR musst Du neben der IP-Adresse auch den Namen der Druckqueue auf dem Printserver angeben, bei HP JetDirect Interfaces z.b. raw1.

Gruß,
Marcel

_HAWK_ 13. Dez 2004 14:54

Re: Drucken im Netzwerk
 
hmm danke!
Gubts es denn noch ne andere Möglichkeit einen NW-Drucker anzusteuern?
mfg

Steve 13. Dez 2004 15:00

Re: Drucken im Netzwerk
 
Zitat:

Zitat von _HAWK_
Ja der Drucker ist im Printdialog mit auf geführt

Dann kannste auf den Drucker ganz normal wie auf jeden anderen beliebigen Drucker zugreifen (unit Delphi-Referenz durchsuchenPrinters)

Gruß
Stephan :dance: :xmas:

Marcel Gascoyne 13. Dez 2004 20:11

Re: Drucken im Netzwerk
 
Wie ist denn Dein Drucker an das Netzwerk angeschlossen ? Davon hängt es natürlich ab wie Du auf diesen Drucken kannst. Das einfachste wäre ein entsprechender Print Server...

Gruß,
Marcel

_HAWK_ 15. Dez 2004 08:15

Re: Drucken im Netzwerk
 
der Drucker ist einfach im netzwerk an nem hub dran und hat ne eigene IP.
Wäre es denn auch möglich zb
Code:
var Schnittestelle:text;
...
AssignFile(Schnittstelle,'IP-Adresse')
...
?
Weil mit normal LPT1 kann man ja auch drucken. Nur kann man hier auch ne IP angeben?

_HAWK_ 15. Dez 2004 15:36

Re: Drucken im Netzwerk
 
ich habs jetzt mal wie gesagt mit printer versucht
Code:
          printer.PrinterIndex:=-1;
          printer.BeginDoc;
          printer.Canvas.TextOut(0,0, 'test1' );
          printer.Canvas.TextOut(0,0, 'test2' );
          printer.EndDoc;
Das Problem ist nur, dass mir die zwei texte nebeneinander ausgedruckt werden und nicht, wie ich es eigentlich will, untereinander...
Gibt es da noch nen Befehl wie ln oder sowas?

_HAWK_ 16. Dez 2004 15:27

Re: Drucken im Netzwerk
 
hat denn nicht noch jemand ne idee?

mfg HAWK

_HAWK_ 17. Dez 2004 11:04

Re: Drucken im Netzwerk
 
Code:
var lst1:textfile;
begin
          AssignPRN(LST1);
          Rewrite( LST1);
          WriteLn( LST1, '; Chargen.FMT' );
          WriteLn( LST1, 'M l LBL;CHARGEN' );
          WriteLn( LST1, 'R VA;',sArtikelnummer );
          WriteLn( LST1, 'R VAB;',sABEZ );
          WriteLn( LST1, 'R VWE;',sWENR );
          WriteLn( LST1, 'R TWE;WE - Nummer' );
          WriteLn( LST1, 'R TH;CHARGEN - ETIKETT' );
          WriteLn( LST1, 'R TA;Artikelnummer' );
          WriteLn( LST1, 'R TAB;Artikelbez.' );
          WriteLn( LST1, 'R BWE;',sWENR );
          WriteLn( LST1, 'R BA;',sSAP );
          WriteLn( LST1, 'A',sMenge );

          System.CloseFile(LST1);
end;
So ich habe es jetzt mal auf diese weise probiert und funktioniert.
Das Problem ist nur ich habe ein Etikettendrucker und diese Befehler sind Druckerspezifisch. Der Drucker druckt mir das allerdings genauso aus wie es da steht. Er sollte aber diese Befehle umsetzen können.
Hat da vielleicht jemand ne ahnung ob man da noch was einstellen kann, dass der drucker das als befehl interpretiert und nicht als normalen text?

Bei dem code würde es funktionieren nur das ist dann kein nw-drucker sondern die parallele schnittstelle...

Code:
var lst1:text;
    begin
          AssignFile(LST1,'LPT1');
          Rewrite( LST1);
          WriteLn( LST1, '; Chargen.FMT' );
          WriteLn( LST1, 'M l LBL;CHARGEN' );
          WriteLn( LST1, 'R VA;',sArtikelnummer );
          WriteLn( LST1, 'R VAB;',sABEZ );
          WriteLn( LST1, 'R VWE;',sWENR );
          WriteLn( LST1, 'R TWE;WE - Nummer' );
          WriteLn( LST1, 'R TH;CHARGEN - ETIKETT' );
          WriteLn( LST1, 'R TA;Artikelnummer' );
          WriteLn( LST1, 'R TAB;Artikelbez.' );
          WriteLn( LST1, 'R BWE;',sWENR );
          WriteLn( LST1, 'R BA;',sSAP );
          WriteLn( LST1, 'A',sMenge );

          CloseFile(LST1);
end;
Danke schon mal im Vorraus!

mfg HAWK

Steve 17. Dez 2004 11:27

Re: Drucken im Netzwerk
 
Zitat:

Zitat von _HAWK_
ich habs jetzt mal wie gesagt mit printer versucht
Code:
          printer.PrinterIndex:=-1;
          printer.BeginDoc;
          printer.Canvas.TextOut(0,0, 'test1' );
          printer.Canvas.TextOut(0,0, 'test2' );
          printer.EndDoc;
Das Problem ist nur, dass mir die zwei texte ... nicht, wie ich es eigentlich will, untereinander

Hi,

die ersten beiden Parameter von TCanvas.TextOut geben den Anfangspunkt an. Wenn Du 2 Text an die gleiche Stelle schreibst, können sie wohl nicht untereinander sein :zwinker:

Über TCanvas.TextHeight erhälst Du die Zeilenhöhe des Textes, den Du ausgeben möchtest. Mit dieser Information kannst Du die Y-Position der nächsten Zeile bestimmen.
Hier mal ein kleines Beispiel:
Delphi-Quellcode:
VAR
  SL  : Tstringlist;
  i,dy : integer;
BEGIN
  Printer.BeginDoc;
  SL := TStringList.Create;
  sl.Add('Test 1');
  sl.Add('Test 2');
  sl.Add('Test 3');
  dy := round(Printer.Canvas.TextHeight(SL[0])*1.2); // Texthöhe + Zwischenraum
  FOR i:=0 TO SL.Count -1 DO
  BEGIN
    Printer.Canvas.TextOut(50,    // X: Linker Rand
                           i*dy,  // Y: Zeile*Zeilenhöhe
                           SL[i]); // Text
  END;
  FreeAndNil(SL);
  Printer.EndDoc;
END;
PS: Warum einfach wenns auch umständlich geht :zwinker: :mrgreen:

Gruß
Stephan :dance: :xmas:

_HAWK_ 17. Dez 2004 12:07

Re: Drucken im Netzwerk
 
ja mein problem ist nur dass der drucker das auch als kommando versteht und nicht einfach das kommando schreibt (siehe letzte beitrag von mir)
mfg HAWK

Hansa 17. Dez 2004 17:03

Re: Drucken im Netzwerk
 
Natürlich wird alles gedruckt, was zwischen '' steht ! Solche Sachen wie TAB sind nicht druckbare Steuerzeichen. Das ist der Name des Zeichens und nicht das Zeichen selber. Die anderen kommen mir aber sehr dubios vor. :shock: Für das Tab mußt du schreiben "chr (9)" und nicht 'TAB' :!: Und natürlich auch nicht "chr (9)" in die '' mit reinschreiben. :lol:

Außerdem fehlen vermutlich einige ESC. Das wäre dann "chr (27)". Ich empfehle dir dringend zuerst einmal mit einer besonderen Eigenschaft des Druckers, z.B. Breitschrift zu experimentieren und nicht gleich mit 10 Druckersequenzen. Sonst wird das nichts.

Skasch 11. Jun 2008 10:47

Re: Drucken im Netzwerk
 
Hi,

besser spät als nie.... ;)

Beispiel wie man druckt:
Delphi-Quellcode:
unit uFunctions;

interface

uses
  printers,

procedure PrintSomething(const aPrinterName:string);

implementation

procedure PrintSomething(const aPrinterName:string);
var
  idx: integer;
begin
  idx := Printers.Printer.Printers.IndexOf(aPrinterName);
  if (idx = -1) then
  begin
    // Der Printername existiert nicht!
    MessageBox(0, PChar(
       'Printername ' + aPrinterName + ' exisitiert nicht!'#13#10 +
       'Diese Printernamen sind möglich:'#13#10 +
       Printers.Printer.Printers.Text), 'Fehler!', 0);
    exit;
  end;
  Printers.Printer.PrinterIndex := idx;
  // Printer session öffnen
  Printers.Printer.BeginDoc();
  // Seite 1
  Printers.Printer.Canvas.TextOut(50, 50, 'Seite1');
  // Seite 2
  Printers.Printer.NewPage();
  Printers.Printer.Canvas.TextOut(50, 50, 'Seite2');
  // Seite 3
  Printers.Printer.NewPage();
  Printers.Printer.Canvas.TextOut(50, 50, 'Seite3');
  // Printer session schliessen
  Printers.Printer.EndDoc();
end;

end.
Das geht auch problemlos mit Netzwerkdrukkern die einen eigenen Printserver integeriert haben.

Wichtig ist hierbei Printers.Printer.PrinterIndex := idx;, da die Printers unit einen Fehler enthält und mit *.EndDoc() den DC des Druckers nicht freigiebt. Das führt mit Netzwerkdruckern regelmässig zu Problemen (speziell HP).
Wird jedoch Printers.Printer.PrinterIndex := idx; oder auch einfach Printers.Printer.PrinterIndex := Printers.Printer.PrinterIndex; vor *.BeginDoc(); ausgeführt ist das DC Handle freigegeben und alles geht ohne Probleme.

Hoffe das hilft euch weiter.

Gruss

O.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz