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

Lazarus Pascal Discussion :

Dialogue avec une imprimante [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre actif
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 385
    Points : 223
    Points
    223
    Par défaut Dialogue avec une imprimante
    Bonjour,
    Je suis sous linux fedora 16 et cherche à comprendre comment dialoguer dans une application avec une imprimante pour cela, je cherche à comprendre comment fonctionne l'exemple du composant printers/samples/dialog/selectprinter.lpi et son unité frmselprinter.pas dont ci-dessous la partie que je cherche à analyser.

    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
    procedure TForm1.UpdatePrinterInfo;
    begin
      try
        ck := SGrid.FixedRows;
        SGrid.Clean;
        with Printer do
        begin
          if Printers.Count=0 then
          begin
            AddInfo('printer', 'pas d''imprimante installée');
            exit;
          end;
          AddInfo('Printer',Printers[PrinterIndex]);
          case Orientation of
            poPortrait : AddInfo('Orientation','Portrait');
            poLandscape : AddInfo('Orientation','Landscape');
            poReverseLandscape : AddInfo('Orientation','ReverseLandscape');
            poReversePortrait  :AddInfo('Orientation','ReversePortrait');
          end;
          case PrinterType of
            ptLocal: AddInfo('PrinterType','Local');
            ptNetWork: AddInfo('PrinterType','Network');
          end;
          case PrinterState of
            psNoDefine: AddInfo('PrinterState','Undefined');
            psReady:AddInfo('PrinterState','Ready');
            psPrinting:AddInfo('PrinterState','Printing');
            psStopped:AddInfo('PrinterState','Stopped');
          end;
          AddInfo('Resolution X,Y',IntToStr(XDPI)+','+IntToStr(YDPI)+' dpi');
          AddInfo('PaperSize',PaperSize.PaperName);
          with Printer.PaperSize.PaperRect.PhysicalRect do
          begin
            AddInfo('Page Width', FormatDots(Right-Left));
            AddInfo('Page Height', FormatDots(Bottom-Top));
          end;
          AddInfo('Printable Width',FormatDots(PageWidth));
          AddInfo('Printable Height',FormatDots(PageHeight));
          AddInfo('Copies',IntToStr(Copies));
          if CanRenderCopies then
            AddInfo('CanRenderCopies','true')
          else
            AddInfo('CanRenderCopies','false');
     
          if not CanPrint then
            Application.MessageBox('Selected printer cannot print currently!',
              'Warning',mb_iconexclamation);
        end;
      except on E:Exception do
          Application.MessageBox(PChar(e.message),'Error',mb_iconhand);
      end;
    end;
    et plus particulièrement la partie extraite ci-dessous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    AddInfo('Printer',Printers[PrinterIndex]);
          case Orientation of
            poPortrait : AddInfo('Orientation','Portrait');
            poLandscape : AddInfo('Orientation','Landscape');
            poReverseLandscape : AddInfo('Orientation','ReverseLandscape');
            poReversePortrait  :AddInfo('Orientation','ReversePortrait');
          end;
    Cette section fait appel en premier à l'unité Printers pour la première ligne j'arrive à afficher dans un Edit.Text sur l'unité appelante la valeur du résultat de Printers[PrinterIndex] qui est une variable de type Stringm.
    Mais si j'ai compris que la ligne Case Orientation of appel aussi l'unité Printers je n'arrive
    pas à lire la valeur de résultat dans l'unité appelante sauf erreur celle-ci est de type TPrinterOrientation.
    Comment afficher de résultat dans un Edit.Text
    et autre question en cherchant les info de l'unité TPrinter je trouve un type déclaré en virtual comment lire ou afficher ce type de données dans une fiche.
    Merci d'avane

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par ovni76 Voir le message
    ...Comment afficher de résultat dans un Edit.Text
    Comme ceci, je dirais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
          case Printer.Orientation of
            poPortrait : Edit1.Text := 'Portrait';
            poLandscape : Edit1.Text := 'Landscape';
            poReverseLandscape : Edit1.Text := 'ReverseLandscape';
            poReversePortrait  : Edit1.Text := 'ReversePortrait';
          end;
    Attention, s'assurer que la variable Printer est initialisée...
    Citation Envoyé par ovni76 Voir le message
    et autre question en cherchant les info de l'unité TPrinter je trouve un type déclaré en virtual comment lire ou afficher ce type de données dans une fiche.
    Vous voulez parler des méthodes (procédures ou fonctions) de la classe TPrinter qui sont marquées virtual ?
    C'est une notion de la programmation orientée objet. Le sujet étant vaste, je vous renvoie aux explications proposées par Frédéric Beaulieu dans son Guide Pascal et Delphi : Surcharge et redéfinition des méthodes d'une classe sur ce site même.
    Philippe.

  3. #3
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    Printer est un objet qui permet de piloter l'imprimante par défaut ou séléctionnée actuellement dans ... Printer.

    donc

    Printer = imprimante par défaut ou séléctionnée.

    Printer est un objet créé automatiquement par l'utilisation de l'unité d'impression.



    Printers (with sur Printer) est la liste des imprimantes installées sur le système.

    Printers = Printer.Printers (liste)

    Orientation c'est l'orientation de la page (paysage, portrait par exemple) c'est une propriété qui appartient a Printer (Printer.Orientation) donc renverra l'orientation par défaut de l'imprimante en cour d'utilisation.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  4. #4
    Membre actif
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 385
    Points : 223
    Points
    223
    Par défaut
    Merci Philippe,
    Pour la seconde partie de la réponse je vais lire le sujet proposé.
    Mais pour la première partie la réponse est semblable à celle de l'exemple, selon la réponse la boucle case donne un résultat déjà préparé ce que je voudrais c'est pouvoir lire la réponse et la mettre en forme pour l'afficher comme je peux le faire avec le nom de l'imprimante, donc depuis l'unité d'appel lire la valeur Result de la function de l'unité Printers et être capable si nécessaire de la convertir comme j'ai réussi à le faire avec le nom de l'imprimante comme ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     MNAME:=Printers[PrinterIndex];
           Edit1.Text:=MNAME;
    avec MNAME déclaré en String
    Dans ce cas MNAME est le résultat de l'appel de la function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function TPrinter.GetPrinters: TStrings;
    de Printers avec un résultat de type TStrings
    dans l'autre cas l'appel est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function TPrinter.GetOrientation: TPrinterOrientation;
    la réponse est de type TPrinterOrientation et je en sais pas la lire depuis l'unité appelante.
    J'espère avoir été plus clair.
    A+

  5. #5
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    TPrinterOrientation et un ensemble (SET)

    pour pouvoir le lire, contrairement a TPrinters qui est un TStrings (liste de string) il faut une table de convertion de nom :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const
      POtoSTR = array[TPrinterOrientation] of string = ('Paysage', 'Portrait', 'Paysage inversé', 'Portrait inversé');
    begin
      Edit1.Text := POtoSTR[ Printer.Orientation ];
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  6. #6
    Membre actif
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 385
    Points : 223
    Points
    223
    Par défaut
    Merci Dr Who pour cette explication mais ce qui me dérange c'est que si je fait un pas avec la touche F7 j'arrive sur la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function TPrinter.GetOrientation: TPrinterOrientation;
    begin
      Result:=DoGetOrientation;
    end;
    que j'avance avec F8 pour exécuter l'appel à DoGetOrientation et que je lis la valeur de Result avec l'évaluation Crt F7 j'obtiens POPORTRAIT et me dis que je devrais pouvoir lire cette valeur de Result depuis l'unité d'appel.
    Mauvais raisonnement ?
    A+

  7. #7
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    non parce que DoGetOrientation doit être Protected et GetOrientation doit être private.

    Donc tu ne peux pas les avoir tout les deux, en publique, tu doit utiliser la propriété Orientation.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  8. #8
    Membre actif
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 385
    Points : 223
    Points
    223
    Par défaut
    Bonsoir Dr Who,
    Si j'ai bien compris il faut connaître les réponses possibles pour pouvoir créer la liste qui servira ensuite au transcodage des réponses de la fonction pour les afficher ou les utiliser dans l'unité d'appel, ce n'est pas comme l'interrogation du champ du base de données ?

  9. #9
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Points : 506
    Points
    506
    Par défaut
    Si le but est d'obtenir une représentation sous forme de chaîne d'une valeur d'un type énuméré il est aussi possible d'utiliser WriteStr.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var
      O : TPrinterOrientation;
      S : String;
    begin
      O := poPortrait;
      WriteStr(S, O);  // Maintenant S = 'poPortrait'
    end;

  10. #10
    Membre actif
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 385
    Points : 223
    Points
    223
    Par défaut
    Merci pour vos réponses qui m'ont permis d'enrichir mes informations de petit programmeur, mais je crois avoir chercher à compliquer mon besoin d'information.
    Je m'explique
    Dans une séquence
    Case toto of
    1: instructions1
    2: instructions2
    end;
    la variable toto doit être déclarée avant et sauf erreur doit être de type ordinal et surtout pas string
    prenons un exemple où toto est déclaré en type integer, si aprés la séquence case on cherche à connaître la valeur de toto il suffit d'utiliser une conversion de toto pour la rendre affichable dans un edit ou label, etc.

    Dans le cas qui m'occupe la séquence case appelle une fonction dans une autre unité et celle-ci pour ce que j'ai compris répond par la valeur Result de issue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function TPrinter.GetOrientation: TPrinterOrientation;
    begin
      Result:=DoGetOrientation;
    end;
    Ce que je voudrais pouvoir réaliser c'est la lecture de Result comme je peux le faire de toto
    A+

  11. #11
    Membre actif
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 385
    Points : 223
    Points
    223
    Par défaut
    Merci pour vos réponses qui m'ont aiguillés pour rechercher différentes solutions et je suis retourné vers ma documentation Delphi 4.
    Le résultat de mes recherches c'est que la solution proposée par Dr Who suppose de connaître les réponses attendues et leur ordre de classement, une petite remarque pour les novices comme moi le premier signe égal ' = ' doit être remplacé par 2 points ' : '.
    Donc je vais clôturer ce post.
    Merci A+

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

Discussions similaires

  1. Dialoguer avec une imprimante réseau
    Par samsooo dans le forum Développement
    Réponses: 0
    Dernier message: 18/11/2011, 01h03
  2. Dialogue avec une DLL
    Par scoulet dans le forum MFC
    Réponses: 2
    Dernier message: 11/05/2006, 12h08
  3. Problème avec une imprimante ZEBRA TLP2844
    Par burkan dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 07/08/2005, 21h49
  4. Dialoguer avec une BDD MySQL en language C
    Par veridik dans le forum Requêtes
    Réponses: 2
    Dernier message: 11/07/2005, 12h58
  5. [C#] Lancer et dialoguer avec une console ?
    Par Selenite dans le forum Windows Forms
    Réponses: 4
    Dernier message: 12/09/2004, 20h48

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