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

Langage Delphi Discussion :

XE7 - AssignPrn VCL et FMX différents ?


Sujet :

Langage Delphi

  1. #1
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut XE7 - AssignPrn VCL et FMX différents ?
    Bonjour

    Petit exercice sous XE7 !

    Créer une nouvelle application VCL !
    Coder comme suit

    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
     
    uses printers;
     
    procedure TForm4.Button1Click(Sender: TObject);
    var
      PrinterFile: TextFile;
    begin
      Printer.PrinterIndex := 7; // le 7 correspond chez moi à une imprimante virtuelle PDF mais ça fonctionne pas mieux sur une imprimante réelle.
      AssignPrn(PrinterFile);
      Rewrite(PrinterFile);
      Write(PrinterFile, 'Bonjour le monde', sLineBreak);
      Write(PrinterFile, 'Bonjour le monde', sLineBreak);
      Write(PrinterFile, 'Bonjour le monde', sLineBreak);
      CloseFile(PrinterFile);
    end;
    Tester ...

    Puis ...

    Créer une nouvelle application multi-périphériques !
    Coder comme suit

    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
     
    uses FMX.Printer;
     
    procedure TForm5.Button1Click(Sender: TObject);
    var
      PrinterFile: TextFile;
    begin
      Printer.ActivePrinter := Printer.Printers[7]; // le 7 correspond chez moi à une imprimante virtuelle PDF mais ça fonctionne pas mieux sur une imprimante réelle.
      AssignPrn(PrinterFile);
      Rewrite(PrinterFile);
      Write(PrinterFile, 'Bonjour le monde', sLineBreak);
      Write(PrinterFile, 'Bonjour le monde', sLineBreak);
      Write(PrinterFile, 'Bonjour le monde', sLineBreak);
      CloseFile(PrinterFile);
    end;
    Tester ...

    Puis ... chercher l'erreur

  2. #2
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    Me dites pas que la sortie imprimée est correcte chez vous sur FMX, je n'y croirais pas

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Oui mais ...

    Puis ... que dit cette erreur

  4. #4
    Membre émérite
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Points : 2 529
    Points
    2 529
    Par défaut
    Bonsoir,

    Je suppose que l'erreur à montrer est qu'il imprime seulement une ligne puis passe à la page suivante et ainsi de suite. Donc on se retrouve avec 3 pages avec 1 ligne au lieu d'une page avec 3 Lignes, c'est ça ?
    Donc attention, car comme précisé dans la doc sur la fonction AssignPrn de FMX :

    http://docwiki.embarcadero.com/Libra...nter.AssignPrn

    On peut voir cette partie là :

    Une nouvelle page est automatiquement démarrée si un retour chariot (CR) est rencontré
    Mais ceci dit, première remarque, pourquoi ne pas utiliser le canvas comme c'est préconisé sur l'objet Printer ?
    Et l'on aurait donc un code comme celui-ci :

    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
    var
      PrinterText: TStringList;
      RectPage:TrectF;
    begin
      Printer.ActivePrinter := Printer.Printers[7]; // le 7 correspond chez moi à une imprimante virtuelle PDF mais ça fonctionne pas mieux sur une imprimante réelle.
      Printer.Title:='Impression Test';
     
      RectPage:=RectF(0,0,Printer.PageWidth,Printer.PageHeight);
     
      PrinterText:=TStringList.Create;
      PrinterText.Add('Bonjour le monde');
      PrinterText.Add('Bonjour le monde');
      PrinterText.Add('Bonjour le monde');
     
      Printer.BeginDoc;
      Printer.Canvas.FillText(RectPage,PrinterText.Text,False,1,[TFillTextFlag.RightToLeft],TTextAlign.Trailing,TTextAlign.Leading);
      Printer.EndDoc;
     
      PrinterText.Free;
    Au passage je précise que je rajoute un titre sur le document à Imprimer avec la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Printer.Title:='Impression Test';
    Car certaines imprimantes n'apprécient pas quand il n'y a pas de titre sur les impressions (C'est le cas chez moi).

    Et deuxième remarque pourquoi ne pas plutôt utiliser FastReport pour FMX qui offre beaucoup plus de fonctionnalités que l'objet Printer ?

  5. #5
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    Bonjour Thierry,

    Effectivement, j'ai 3 pages au lieu d'une. Mais aussi, la première ligne est imprimée en dehors de la surface d'impression. Je ne vois que le bas de la ligne.

    Pour l'utilisation du canvas, je dois en fait créer plusieurs manières d'imprimer, dont une avec le canvas (ce que j'ai déjà codé), puis une version par Esc/pos, puis une impression par transfert de fichiers, etc.
    Comme j'avais quelques soucis de positionnement en Y , j'ai voulu faire un essai avec assignprn et c'est là que je suis "tombé" sur ce problème.

    Et pour FastReport, je l'ai envisagé mais en fait, je pars à chaque fois d'un fichier XML qui décrit la sortie à imprimer. Ce sont des tickets de caisse. ET avec FastReport ça aurait été plus compliqué à gérer.

  6. #6
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Bonjour Thierry,

    Effectivement, j'ai 3 pages au lieu d'une. Mais aussi, la première ligne est imprimée en dehors de la surface d'impression. Je ne vois que le bas de la ligne.

    Pour l'utilisation du canvas, je dois en fait créer plusieurs manières d'imprimer, dont une avec le canvas (ce que j'ai déjà codé), puis une version par Esc/pos, puis une impression par transfert de fichiers, etc.
    Comme j'avais quelques soucis de positionnement en Y , j'ai voulu faire un essai avec assignprn et c'est là que je suis "tombé" sur ce problème.

    Et pour FastReport, je l'ai envisagé mais en fait, je pars à chaque fois d'un fichier XML qui décrit la sortie à imprimer. Ce sont des tickets de caisse. ET avec FastReport ça aurait été plus compliqué à gérer.
    dans un produit de caisse, je suis arrivé aux meilleurs résultats en générant un bitmap monochrome que j'envoie directement à l'imprimante (Epson TM-T88V) soit avec le mode passthrough du driver, soit directement sur le port USB ou Ethernet

    l'impression texte ne me permettait pas d'avoir le logo, et passer par le driver de l'imprimante donnait des temps d'impression pas terrible, sur un ticket classique l'impression est facilement 2 fois plus rapide comme ça.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    Cette Epson TM-T88V , c'est justement le modèle que j'ai ici pour le développement. ça doit vraiment être le mode standard.

    Mais générer le bitmap pour l'envoyer à l'imprimante, ou écrire directement sur le canvas de l'imprimante, ça revient un peu au même non ?? ça reste un canvas. Dans le cas ou je n'utilise pas assignprn bien sûr.

    Pour le temps d'impression, l'impression sur canvas est quand même rapide. Pas instantanée mais presque.

  8. #8
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Cette Epson TM-T88V , c'est justement le modèle que j'ai ici pour le développement. ça doit vraiment être le mode standard.

    Mais générer le bitmap pour l'envoyer à l'imprimante, ou écrire directement sur le canvas de l'imprimante, ça revient un peu au même non ?? ça reste un canvas. Dans le cas ou je n'utilise pas assignprn bien sûr.

    Pour le temps d'impression, l'impression sur canvas est quand même rapide. Pas instantanée mais presque.
    non, le Canvas est une abstraction Windows (ou autre système) qui fait appel aux fonctions du driver d'impression pour écrire du texte, dessiner des bitmaps, etc...j'ai utilisé l'option permettant d'enregistrer la sortie dans un fichier pour voir ce que le driver générait au final, et en fait c'est un bitmap monochrome (avec quelques caractères de contrôle).

    du coup, mon application crée ce bitmap et l'envoie directement à l'imprimante avec "Escape(Printer.Handle, PASSTHROUGH, 0, @Str[1], nil);" où Str est un string (sous Delphi 6, donc pas Unicode) qui contient le bitmap (plus quelques caractères de contrôle)

    ce même bitmap peut être envoyé sur le port 9100 de l'imprimante si elle est en réseau ou directement au driver USB sans qu'il soit nécessaire que l'imprimante soit déclarée dans Windows.

    je me suis d'ailleurs amusé à détecter la présence de l'imprimante USB d'après son ID (USB\VID_04B8&PID_0202) et invite l'utilisateur à télécharger le driver s'il n'est pas présent
    je détecte aussi les imprimantes en réseau avec le "EPSON Network Peripheral Control Protocol" (non documenté)

    Le seul truc que je n'ai pas trouvé, mais je ne sais pas si c'est possible, c'est de changer l'adresse IP en direct...car il est possible de la configurée si elle est sur le réseau local, changer son nom par exemple...mais par défaut elle est livrée avec une adresse statiques 192.168.192.168 que je détecte bien par un broadcast UDP mais elle ne me permet pas d'y accéder....remarque il faudrait que je teste car l'ENPCP c'est du broadcast UDP...donc ça devrait pouvoir le faire...par contre je n'ai plus d'imprimante sous la main, elles sont restées à la Réunion ^^
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    La commande Escape pourrait être une solution en VCL mais là, avec FMX, j'ai beau fouiner dans le code, je ne vois pas comment récupérer un HDC sur l'imprimante en cours.

  10. #10
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    en FMX, mais sous Windows, tu peux retrouver ce Handle dans l'unité FMX.Printer.Win ou TPrinterWin déclare Handle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    uses
      FMX.Printer.Win;
    begin
      TPrinterWin(Printer).Handle;
    end;
    tu peux aussi taper directement dans l'API Windows, j'avais fait cela il y a fort longtemps avec TDXPrinter
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  11. #11
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    Merci grand chef !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. XE7 [VCL-FMX] Fermeture d'une fenêtre
    Par Invité dans le forum Delphi
    Réponses: 1
    Dernier message: 29/11/2014, 13h02
  2. XE7 - VCL et FMX : réaliser un paquet
    Par Invité dans le forum Delphi
    Réponses: 6
    Dernier message: 10/11/2014, 19h11
  3. Réponses: 0
    Dernier message: 17/04/2013, 20h21
  4. Composants pour VCL et FMX
    Par cadetill dans le forum Composants VCL
    Réponses: 1
    Dernier message: 07/01/2013, 09h52
  5. Equivalent TPenMode VCL-->FMX
    Par curt25 dans le forum Composants FMX
    Réponses: 4
    Dernier message: 06/06/2012, 11h33

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