Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Textdatei mit vorangestellten Steuercodes (https://www.delphipraxis.net/185816-textdatei-mit-vorangestellten-steuercodes.html)

waldforest 8. Jul 2015 16:11

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:
shelltext :='COPY '+Edit_Outfile.text+' LPT1';
ShellExecute(handle, 'open', PWideChar('cmd.exe'),PWideChar('/C"'+shelltext+'"'),'', SW_SHOW)
zum Druck auf LPT1.
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

p80286 8. Jul 2015 18:11

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

waldforest 8. Jul 2015 18:14

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.

hathor 8. Jul 2015 20:07

AW: Textdatei mit vorangestellten Steuercodes
 
Schon mal BINÄR versucht? 'COPY /B'...

waldforest 8. Jul 2015 20:47

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:
outStream.WriteBuffer(s[1], Length(s));
ändern muss damit die Leerzeichen weg bleiben.:oops:

hathor 8. Jul 2015 21:35

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);

BadenPower 8. Jul 2015 21:37

AW: Textdatei mit vorangestellten Steuercodes
 
Zitat:

Zitat von waldforest (Beitrag 1308099)
Woran könnte dies liegen ?

Einmal ganz plump, hätte ich zuerst an unterschiedliche Druckereinstellungen gedacht.

Der gleiche Drucker heisst ja noch lange nicht, dass er gleich druckt, wenn die Standard-Druck-Einstellungen des jeweiligen Treibers anderst eingestellt sind.

waldforest 8. Jul 2015 21:47

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:
outstream.WriteBuffer(PString(s)^, Length(s)) ;
oder
Code:
outstream.WriteBuffer(PAnsichar(s)^, Length(s)) ;
habe ich probiert, die Umstellung des Procedure auf

Code:
Procedure AppendStringToFile(const s:ANSIstring; const filename:WIDEstring; const prnfile:WIDEstring);
hat die Lösung gebracht.
Vielen Dank

Sir Rufo 8. Jul 2015 22:01

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.

p80286 8. Jul 2015 22:14

AW: Textdatei mit vorangestellten Steuercodes
 
Zitat:

Zitat von Sir Rufo (Beitrag 1308132)
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.

Könntest Du das ein wenig konkretisieren?
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:
Array of AnsiChar
oder einem
Delphi-Quellcode:
AnsiString
ausgelesen werden.

Gruß
K-H

Sir Rufo 8. Jul 2015 22:24

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.

waldforest 9. Jul 2015 06:46

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).

Dejan Vu 9. Jul 2015 07:03

AW: Textdatei mit vorangestellten Steuercodes
 
Zitat:

Zitat von Sir Rufo (Beitrag 1308140)
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.

Das ist mal eine schöne Metapher für Kodierungen. :thumb:

Union 9. Jul 2015 07:16

AW: Textdatei mit vorangestellten Steuercodes
 
Zitat:

Zitat von Dejan Vu (Beitrag 1308166)
Das ist mal eine schöne Metapher für Kodierungen. :thumb:

Und nennt sich treffend falscher Freund.

Sir Rufo 9. Jul 2015 10:33

AW: Textdatei mit vorangestellten Steuercodes
 
Zitat:

Zitat von waldforest (Beitrag 1308165)
Hallo,
und wie wäre dies #9 umzusetzen ?

Denn vielleicht ist dieses das eigentliche Problem zwischen Windows XP (treiber) und Win 7 (treiber).

Eine Möglichkeit ist die Verwendung von einem StringStream:
Delphi-Quellcode:
var
  MeinTollertext : string;

TStringStream.Create( MeinTollerText, TEncoding.ANSI, False );
oder man holt sich die Bytes vom Encoding
Delphi-Quellcode:
var
  MeinTollerText : string;

TEncoding.ANSI.GetBytes( MeinTollerText );
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:
Delphi-Quellcode:
// Statt
AppendStringToFile( Chr(27)+'(s18H'+CHR(27)+'(s8V', ... );
// viel besser nachvollziehbar, was hier passieren soll
AppendStringToFile(
  TPCLCodes.PrimaryPitch( 18 ) +
  TPCLCodes.PrimaryHeight( 8 ),
  ... );
und diese Unit würde dann am Anfang so aussehen:
Delphi-Quellcode:
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.
Ach ja, die Prozedur/Methode würde ich etwas anders benennen:
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;

waldforest 9. Jul 2015 14:16

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