IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

EDI Delphi Discussion :

[D2010] Problème d'impression code-barre sur imprimantes TEC


Sujet :

EDI Delphi

  1. #1
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 682
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 682
    Points : 7 122
    Points
    7 122
    Par défaut [D2010] Problème d'impression code-barre sur imprimantes TEC
    Depuis que certaines applications ont été migrées de Delphi 6 à Delphi 2010, les impressions code-barre sur imprimantes TEC fonctionnent très mal, voire plus du tout (ce qui pose d'énormes problèmes auprès des utilisateurs).

    Voici le code utilisé pour lancer l'impression :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          Printer.BeginDoc;
             DirectPrint(szFichierInter);
          Printer.EndDoc;
    Et voici le reste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure DirectPrint(s: String);
    var
       PTBlock: TPassThroughData;
    begin
       PTBlock.nLen := Length(s)+ 2;
       StrPCopy(@PTBlock.Data, AnsiString(s));
       Escape(Printer.Handle, PASSTHROUGH, 0, @PTBlock, nil);
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       TPassThroughData = record
          nLen: Integer;
          Data: Array[0..65535] of AnsiChar;
       end;
    Le code n'a pas changé, et j'utilise des fonctions simples (Begindoc et Enddoc). La seule différence que je vois, c'est que Delphi 2010 est unicode.

    Quelqu'un a t'il déjà rencontré le problème ?
    Quelqu'un utilise t'il une autre façon d'imprimer sur des TEC ?


  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 840
    Points : 13 607
    Points
    13 607
    Par défaut
    A quoi sert ce +2 ? Ces deux caractères ne sont pas initialisés
    ZeroMemory au minimum si tu veux deux #0.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure DirectPrint(s: AnsiString);
    var
      PTBlock: TPassThroughData;
     
    begin
      ZeroMemory(@PTBlock, SizeOf(PTBlock));
     
      PTBlock.nLen := Length(s) +2;
      StrPCopy(PTBlock.Data, s);
      Escape(Printer.Handle, PASSTHROUGH, 0, @PTBlock, nil);
    end;

  3. #3
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 682
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 682
    Points : 7 122
    Points
    7 122
    Par défaut
    J'ai ajouté le ZeroMemory, sans changement.
    J'ai oublié de préciser que depuis mon poste (qui est un PC), je n'ai pas de problème d'impression. C'est seulement les utilisateurs dans une certaine configuration qu'on arrive pas a déterminer (on soupçonne les serveurs TSE, ou les serveurs d'impression).

    Par contre, si j'enlève le + 2, l'imprimante se plein qu'elle ne comprend plus ce qu'on lui envoit (parce qu'il manque un morceau d'instruction).

  4. #4
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 682
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 682
    Points : 7 122
    Points
    7 122
    Par défaut
    Bon, bin si personne n'a d'idée, je vais essayer de ré-écrire les instructions d'impression en Delphi 6 ...


  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 293
    Points : 41 763
    Points
    41 763
    Billets dans le blog
    65
    Par défaut
    ce serait pas du a la Size de l'integer ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     PTBlock.nLen := Length(s) + SizeOf(Integer);
    après tout , tu envoies un buffer contenant une taille et des caractères , c'est le +2 qui me suggère un problème .
    ou alors , il faut peut être changer le Integer en Word pour l'imprimante ?



    désolé d'avoir répondu un peu tard mais je ne connais pas l'imprimante cité

  6. #6
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    pas sûr:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    procedure DirectPrint(s: AnsiString);
    var
      PTBlock: TPassThroughData;
     
    begin
     // ZeroMemory(@PTBlock, SizeOf(PTBlock));
      setlength(s,length(s)+1);
      s[length(s)]:=#0;
     
      PTBlock.nLen := Length(s);
     
      with PTBlock do
      begin
        nLen := Length(s);
        CopyMemory(@data[1],@s[1],length(s));
     end;
      Escape(Printer.Handle, PASSTHROUGH, 0, @PTBlock, nil);
    end;

  7. #7
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 682
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 682
    Points : 7 122
    Points
    7 122
    Par défaut
    Un collègue m'a suggéré d'utiliser d'autres API (StartDocPrinter, StartPagePrinter, WritePrinter).
    Pour l'instant, ça semble mieux marcher.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    procedure DirectPrint(const szCB: String; const szTitre: String = '');
    var
       Device, Driver, Port: Array[0..255] of WideChar;
       hDeviceMode, hPrinter: THandle;
       pDefault: PPrinterDefaults;
       DocInfo: TDocInfo1;
       Buffer: Array[0..65535] of AnsiChar;
       nTaille, nTailleEcrite: Cardinal;
    begin
       nTaille := Length(szCB);
       StrPCopy(@Buffer, AnsiString(szCB));
     
       if(Printer.Printers.Count > 0) and (Printer.PrinterIndex > -1) then
       begin
          Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
          pDefault := AllocMem(SizeOf(pDefault^));
          try
             with pDefault^ do
             begin
                pDataType := nil;
                pDevMode := nil;
                DesiredAccess := PRINTER_ACCESS_USE;
             end;
     
             // Accès à l'imprimante.
             if OpenPrinter(@Device, hPrinter, pDefault) then
             begin
                try
                   DocInfo.pDocName := PWideChar(IfThen(szTitre = '', Printer.Title, szTitre));
                   DocInfo.pOutputFile := nil;
                   DocInfo.pDatatype := 'RAW';
     
                   // Début document.
                   if StartDocPrinter(hPrinter, 1, @DocInfo) <> 0 then
                   begin
                      try
                         // Début page.
                         if StartPagePrinter(hPrinter) then
                         begin
                            if not WritePrinter(hPrinter, @Buffer, nTaille, nTailleEcrite) then
                               AddLog('Erreur WritePrinter (' + Printer.Printers[Printer.PrinterIndex] + ') a échoué !' + #13#10 + SysErrorMessage(GetLastError));
                         end
                         else
                            AddLog('Erreur StartPagePrinter (' + Printer.Printers[Printer.PrinterIndex] + ') a échoué !' + #13#10 + SysErrorMessage(GetLastError));
                      finally
                         EndDocPrinter(hPrinter);
                      end;
                   end
                   else
                      AddLog('Erreur StartDocPrinter (' + Printer.Printers[Printer.PrinterIndex] + ') a échoué !' + #13#10 + SysErrorMessage(GetLastError));
                finally
                   ClosePrinter(hPrinter);
                end;
             end
             else
                AddLog('Erreur :  l''accès à l''imprimante (' + Printer.Printers[Printer.PrinterIndex] + ') a échoué !' + #13#10 + SysErrorMessage(GetLastError));
          finally
             FreeMem(pDefault);
          end;
       end
       else
          AddLog('Erreur :  pas d''imprimante sélectionnée !');
    end;

Discussions similaires

  1. impression codes barres
    Par Fabrice01 dans le forum 4D
    Réponses: 8
    Dernier message: 27/01/2015, 11h12
  2. Problème d'impression code à barre
    Par Techno_400 dans le forum AS/400
    Réponses: 6
    Dernier message: 13/01/2011, 19h28
  3. Réponses: 21
    Dernier message: 11/06/2007, 10h30
  4. [VB]Impression code barres
    Par tonin33 dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 09/06/2006, 16h25
  5. [CR 8.5] Impression Codes Barre
    Par Phy dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 14/10/2003, 13h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo