AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

QR-Code mit ESC-Commands

Ein Thema von Thomas Feichtner · begonnen am 20. Jul 2022 · letzter Beitrag vom 27. Jul 2022
Antwort Antwort
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.378 Beiträge
 
Delphi 12 Athens
 
#1

AW: QR-Code mit ESC-Commands

  Alt 27. Jul 2022, 16:47
die schon über 20 Jahre alt sind. ... Allerdings funktioniert es nicht mehr so richtig
Deswegen verwendet man niemals dynamische Typen für statische Daten.

PChar, vor Delphi 2009, war PAnsiChar aber nun ist es PWideChar.
Ebenso auch für Char und String.
Binär wird so jetzt also etwas Anderes verwendet. (2 Byte pro Char)

Selbst dein Length(TextToPrint) oder 2 stimmt somit nicht mehr, da PChar(TextToPrint) doppelt so viele Bytes enthält.
Bzw. für PAnsiChar würde Length aber wieder passen.

Auch in Bezug auf Unicode-Strings, und Konvertierungen durch CodesPages, sollte man passendere Typen verwenden, nicht dass irgendwo Bytes verändert werden, beim Konvertieren/Zuweisen zwischen String/AnsiString/PChar/usw.
Früher missbrauchte man gern mal AnsiString, für "binäre" Daten.
Wenn, dann aber jetzt besser RawByteString (quasi ein AnsiString ohne CodePage) oder besser TBytes (ein ByteArray) für binäre Daten verwenden.




raise Exception.Create(SysErrorMessage(GetLastError)); = Delphi-Referenz durchsuchenRaiseLastOSError (früher Delphi-Referenz durchsuchenRaiseWin32Error)

und fällt dir auf, dass dein halber Code praktisch aus Duplikaten besteht?
Delphi-Quellcode:
procedure TForm5.TextToPrinter(Drucker: string; TextToPrint: RawByteString);
var
  pHandle: THandle;
  DocInfo1: TDocInfo1;
  N: DWORD;
begin
  DocInfo1.pDocName := PChar('MeinDokumentname');
  DocInfo1.pOutputFile := nil;
  DocInfo1.pDataType := 'RAW';
  if not OpenPrinter(PChar(Drucker), pHandle, nil)
    or (StartDocPrinter(pHandle, 1, @DocInfo1) = 0)
    or not StartPagePrinter(pHandle)
    or not WritePrinter(pHandle, PAnsiChar(TextToPrint), Length(TextToPrint), N)
    or not WritePrinter(pHandle, PAnsiChar(#12#13), 2, N)
    or not EndPagePrinter(pHandle)
    or not EndDocPrinter(pHandle)
    or not ClosePrinter(pHandle)
  then
    RaiseLastOSError;
end;
Aber eigentlich war falsch, dass ClosePrinter unter Umständen garnicht aufgerufen wird?
Und wenn man ganz genau seind will, könnte man auch noch prüfen, ob WritePrinter wirklich Alles gesendet hat.
Delphi-Quellcode:
procedure TForm5.TextToPrinter(Drucker: string; TextToPrint: RawByteString);
var
  pHandle: THandle;
  DocInfo1: TDocInfo1;
  N: DWORD;
begin
  DocInfo1.pDocName := PChar('MeinDokumentname');
  DocInfo1.pOutputFile := nil;
  DocInfo1.pDataType := 'RAW';
  if not OpenPrinter(PChar(Drucker), pHandle, nil) then
    RaiseLastOSError;
  try
    if (StartDocPrinter(pHandle, 1, @DocInfo1) = 0)
      or not StartPagePrinter(pHandle)
      or not WritePrinter(pHandle, PAnsiChar(TextToPrint), Length(TextToPrint), N) or (N <> Length(TextToPrint))
      or not WritePrinter(pHandle, PAnsiChar(#12#13), 2, N) or (N <> 2)
      or not EndPagePrinter(pHandle)
      or not EndDocPrinter(pHandle)
    then
      RaiseLastOSError;
  finally
    ClosePrinter(pHandle); // ja, hier die Fehlerbehandlung "vergessen" ... ist eh alles egal und wir wollen doch vorherige Fehlermeldungen nicht "überschreiben".
  end;
end;
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (27. Jul 2022 um 16:53 Uhr)
  Mit Zitat antworten Zitat
Papaschlumpf73

Registriert seit: 3. Mär 2014
Ort: Berlin
462 Beiträge
 
Delphi 12 Athens
 
#2

AW: QR-Code mit ESC-Commands

  Alt 27. Jul 2022, 17:55
Hey himitsu, was machst du mit meinem schönen alten Code? Damals war ich jung und dumm. Heute älter, aber kein bißchen...
Das war doch nur ein Denkanstoß, damit er nicht mit Printer.Canvas.Textout oder so herum probiert.
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:23 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