![]() |
Textdatei mit vorangestellten Steuercodes
Hallo,
ich habe nach Umstellung eines Rechners von XP auf WIN 7 mit einer kleinen Anwendung ein Problem, welches ich mir nicht erklären kann. Das Programm setzt zu beginn einer Textdatei den ESC-Steuercode für Condensdruck und gibt diese im Anschluss über
Code:
zum Druck auf LPT1.
shelltext :='COPY '+Edit_Outfile.text+' LPT1';
ShellExecute(handle, 'open', PWideChar('cmd.exe'),PWideChar('/C"'+shelltext+'"'),'', SW_SHOW) Auf einem Rechner mit Win XP wird die Datei in Condensed wie gewünscht übers Netzwerk am Drucker ausgedruckt, die gleiche Anwendung am gleichem Drucker unter Win 7 (32 Bit) nicht, hier erfolgt der Druck in den am Drucker eingestellten Standard, Ich denke, die Steuercodes werden nicht richtig übertragen. Woran könnte dies liegen ? Wie kann ich dies beseitigen ? mfg |
AW: Textdatei mit vorangestellten Steuercodes
Hat Dein Drucker einen "ControlModus"?
Nutz ihn und Du siehst was beim Drucker ankommt. ein Netzdrucker mit dem Namen "LPT1"? nicht alltäglich. Gruß K-H |
AW: Textdatei mit vorangestellten Steuercodes
Hallo,
ich leite den Druck über Net use LPT .. auf den Netzwerkdrucker um. Brauche LPT für alte DOS Anwendungen. Wie geschrieben, von den Rechnern im Netz mit XP läufts. ControlModus, kenne ich noch nicht. |
AW: Textdatei mit vorangestellten Steuercodes
Schon mal BINÄR versucht? 'COPY /B'...
|
AW: Textdatei mit vorangestellten Steuercodes
Hallo,
danke, hat aber nichts gebracht. Aber ich denke einen Schritt weiter zu sein, sicher ein Programmierfehler, welcher sich erst ab win7 auswirkt. Folgende Codes sollen an den Beginn einer Textdatei geschrieben werden Chr(27)+'(s18H'+CHR(27)+'(s8V') Dies erfolgt mit folgendem Code
Code:
procedure AppendStringToFile(const s:string; const filename:string; const prnfile:string);
var stream : TStream; outstream : TStream; const SO_END=2; begin ShowMessage(s); if FileExists(filename) then begin stream := TFileStream.Create(filename, fmOpenReadWrite or fmShareDenyWrite); // stream.Seek(0, soFromBeginning); stream.Seek(0, SO_END); end else stream := TFileStream.Create(filename, fmCreate or fmShareDenyWrite); outstream := TFileStream.Create(prnfile, fmCreate or fmShareDenyWrite); try outStream.WriteBuffer(s[1], Length(s)); outstream.CopyFrom(stream, 0); finally stream.Free; outstream.Free; end; end; In der Datei erscheinen aber jeweils noch ein Leerzeichen also Chr(27)+'( s 1 8 H '+CHR(27)+'( s 8 V ') Hier scheint die Ursache zu liegen, verstehe aber noch nicht was ich da in der Zeile
Code:
ändern muss damit die Leerzeichen weg bleiben.:oops:
outStream.WriteBuffer(s[1], Length(s));
|
AW: Textdatei mit vorangestellten Steuercodes
Dann würde ich statt PWideChar PANSIChar bzw. statt String ANSIString versuchen.
Ausserdem: procedure AppendStringToFile(const s:string; const filename:string; const prnfile:string); Besser: procedure AppendStringToFile(const s:ANSIstring; const filename:WIDEstring; const prnfile:WIDEstring); |
AW: Textdatei mit vorangestellten Steuercodes
Zitat:
Der gleiche Drucker heisst ja noch lange nicht, dass er gleich druckt, wenn die Standard-Druck-Einstellungen des jeweiligen Treibers anderst eingestellt sind. |
AW: Textdatei mit vorangestellten Steuercodes
Hallo,
die Druckereinstellungen im Treiber sind die gleichen, wenn ich die Leerzeichen aus den geschriebenen Steuercodes manuell im File lösche wird er auch wie bei XP gedruckt. Den Vorschlag mit
Code:
oder
outstream.WriteBuffer(PString(s)^, Length(s)) ;
Code:
habe ich probiert, die Umstellung des Procedure auf
outstream.WriteBuffer(PAnsichar(s)^, Length(s)) ;
Code:
hat die Lösung gebracht.
Procedure AppendStringToFile(const s:ANSIstring; const filename:WIDEstring; const prnfile:WIDEstring);
Vielen Dank |
AW: Textdatei mit vorangestellten Steuercodes
Das ist wieder eine von diesen Zufallslösungen - zufällig richtig.
Korrekt wäre es aus dem String die Bytefolge in der richtigen Kodierung zu erzeugen und genau diese Bytefolge an den Anfang der Datei zu schreiben. |
AW: Textdatei mit vorangestellten Steuercodes
Zitat:
Nachdem Hathors Hinweis den Erfolg nach sich gezogen hat, sollte klar sein, daß der Drucker (ohne weitere Einstellungen) Ansi-Zeichenfolgen versteht, also sollte die Steuersequenz tunlichst aus einem
Delphi-Quellcode:
oder einem
Array of AnsiChar
Delphi-Quellcode:
ausgelesen werden.
AnsiString
Gruß K-H |
AW: Textdatei mit vorangestellten Steuercodes
Es gibt Zeichen, die in fast allen Codepages durch gleiche Byte-Werte repräsentiert werden. Wenn man nur diese Zeichen verwendet, dann ist die Lösung zwar nicht wirklich korrekt, sie funktioniert einfach nur (für diesen speziellen Fall) zufällig.
Nur weil ich fehlerfrei "Status" lesen, schreiben und sprechen kann heisst es eben nicht, dass ich jetzt Latein oder Esperanto kann, sondern nur dass es dieses Wort eben auch in den beiden Sprachen gibt und sogar das Gleiche bedeutet. |
AW: Textdatei mit vorangestellten Steuercodes
Hallo,
und wie wäre dies #9 umzusetzen ? Denn vielleicht ist dieses das eigentliche Problem zwischen Windows XP (treiber) und Win 7 (treiber). |
AW: Textdatei mit vorangestellten Steuercodes
Zitat:
|
AW: Textdatei mit vorangestellten Steuercodes
Zitat:
![]() |
AW: Textdatei mit vorangestellten Steuercodes
Zitat:
Delphi-Quellcode:
oder man holt sich die Bytes vom Encoding
var
MeinTollertext : string; TStringStream.Create( MeinTollerText, TEncoding.ANSI, False );
Delphi-Quellcode:
Und für die Escape-Sequenzen würde ich mir eine kleine Unit schreiben und diese auch nach Bedarf erweitern. Der Code wird dadurch ungemein verständlicher:
var
MeinTollerText : string; TEncoding.ANSI.GetBytes( MeinTollerText );
Delphi-Quellcode:
und diese Unit würde dann am Anfang so aussehen:
// Statt
AppendStringToFile( Chr(27)+'(s18H'+CHR(27)+'(s8V', ... ); // viel besser nachvollziehbar, was hier passieren soll AppendStringToFile( TPCLCodes.PrimaryPitch( 18 ) + TPCLCodes.PrimaryHeight( 8 ), ... );
Delphi-Quellcode:
Ach ja, die Prozedur/Methode würde ich etwas anders benennen:
unit PclCodes;
interface type TPCLCodes = class public type TPrimarySpacing = ( Fixed, Proportional ); private const ESC = #27; public const PrimarySpacing_Fixed = ESC + '(s0P'; PrimarySpacing_Proportional = ESC + '(s1P'; PrimarySmbolSet_ASCII = ESC + '(0U'; PrimarySmbolSet_Legal = ESC + '(1U'; PrimarySymbolSet_Win_3_1_Latin1 = ESC + '(9U'; PrimarySymbolSet_PC_8 = ESC + '(10U'; PrimarySymbolSet_PC_8_DN = ESC + '(11U'; PrimarySymbolSet_PC_850 = ESC + '(12U'; PrimarySymbolSet_Pi_FONT = ESC + '(15U'; PrimarySymbolSet_PC_852 = ESC + '(17U'; PrimarySymbolSet_ANSI = ESC + '(19U'; PrimarySymbolSet_ISO_80 = ESC + '(0D'; PrimarySmbolSet_ISO_8859_1 = ESC + '(0N'; PrimarySmbolSet_ISO_8859_2 = ESC + '(2N'; PrimarySmbolSet_ISO_8859_9 = ESC + '(5N'; PrimarySymbolSet_Latin1 = PrimarySmbolSet_ISO_8859_1; PrimarySymbolSet_Latin2 = PrimarySmbolSet_ISO_8859_2; PrimarySymbolSet_Latin5 = PrimarySmbolSet_ISO_8859_9; PrimarySymbolSet_Latin1_ANSI = PrimarySymbolSet_ANSI; private const PrimaryPitchFormat = ESC + '(s%dH'; PrimaryHeightFormat = ESC + '(s%dV'; PrimarySpacingValues: array [ TPrimarySpacing ] of string = ( PrimarySpacing_Fixed, PrimarySpacing_Proportional ); public class function PrimarySpacing( Value: TPrimarySpacing ): string; class function PrimaryPitch( CharactersPerInch: Integer ): string; class function PrimaryHeight( Points: Integer ): string; end; implementation uses System.SysUtils; { TPCLCodes } class function TPCLCodes.PrimaryHeight( Points: Integer ): string; begin Result := Format( PrimaryHeightFormat, [ Points ] ); end; class function TPCLCodes.PrimaryPitch( CharactersPerInch: Integer ): string; begin Result := Format( PrimaryPitchFormat, [ CharactersPerInch ] ); end; class function TPCLCodes.PrimarySpacing( Value: TPrimarySpacing ): string; begin Result := PrimarySpacingValues[ Value ]; end; end.
Delphi-Quellcode:
procedure CombineStreams( ASource1, ASource2, ATarget: TStream );
begin ATarget.CopyFrom( ASource1, ASource1.Size ); ATarget.CopyFrom( ASource2, ASource2.Size ); end; procedure PrepareFileToPrint( ASourceFileName, ATargetFileName, APrefixStr: string ); var LSource1, LSource2, LTarget: TStream; begin LSource1 := nil; LSource2 := nil; LTarget := nil; try LSource1 := TStringStream.Create( APrefixStr, TEncoding.ANSI, False ); LSource2 := TFileStream.Create( ASourceFileName, fmOpenRead or fmShareDenyWrite ); LTarget := TFileStream.Create( ATargetFileName, fmCreate or fmShareDenyRead ); CombineStreams( LSource1, LSource2, LTarget ); finally LSource1.Free; LSource2.Free; LTarget.Free; end; end; procedure TForm1.Button3Click( Sender: TObject ); begin PrepareFileToPrint( {} 'test.txt', {} 'print.txt', {} TPCLCodes.PrimaryPitch( 18 ) + TPCLCodes.PrimaryHeight( 8 ) ); end; |
AW: Textdatei mit vorangestellten Steuercodes
Hallo,
vielen Dank, Das bringt mich weiter, werde ich mir in Ruhe ansehen und verstehen wollen/müssen. :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:21 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