+ Répondre à la discussion
Affichage des résultats 1 à 11 sur 11
  1. #1
    Membre habitué
    Homme Profil pro
    Retraité
    Inscrit en
    juillet 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : juillet 2008
    Messages : 286
    Points : 123
    Points
    123

    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 :
    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 :
    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é Sénior
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    avril 2002
    Messages
    1 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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 371
    Points : 4 067
    Points
    4 067

    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 :
    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 Expert
    Avatar de Dr.Who
    Inscrit en
    septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : septembre 2009
    Messages : 980
    Points : 1 299
    Points
    1 299

    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 habitué
    Homme Profil pro
    Retraité
    Inscrit en
    juillet 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : juillet 2008
    Messages : 286
    Points : 123
    Points
    123

    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 :
    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 :
    function TPrinter.GetPrinters: TStrings;
    de Printers avec un résultat de type TStrings
    dans l'autre cas l'appel est
    Code :
    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 Expert
    Avatar de Dr.Who
    Inscrit en
    septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : septembre 2009
    Messages : 980
    Points : 1 299
    Points
    1 299

    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 :
    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 habitué
    Homme Profil pro
    Retraité
    Inscrit en
    juillet 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : juillet 2008
    Messages : 286
    Points : 123
    Points
    123

    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 :
    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 Expert
    Avatar de Dr.Who
    Inscrit en
    septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : septembre 2009
    Messages : 980
    Points : 1 299
    Points
    1 299

    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 habitué
    Homme Profil pro
    Retraité
    Inscrit en
    juillet 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : juillet 2008
    Messages : 286
    Points : 123
    Points
    123

    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 expérimenté
    Homme Profil pro
    Inscrit en
    janvier 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : janvier 2010
    Messages : 235
    Points : 501
    Points
    501

    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 :
    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 habitué
    Homme Profil pro
    Retraité
    Inscrit en
    juillet 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : juillet 2008
    Messages : 286
    Points : 123
    Points
    123

    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 :
    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 habitué
    Homme Profil pro
    Retraité
    Inscrit en
    juillet 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : juillet 2008
    Messages : 286
    Points : 123
    Points
    123

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •