Précédent   Forum du club des développeurs et IT Pro > Autres langages > Pascal > Lazarus
Lazarus Forum d'entraide sur Lazarus, l'EDI RAD multiplateforme basé sur Free Pascal
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 26/11/2012, 17h44   #1
ovni76
Membre régulier
 
Homme Jean
Retraité
Inscription : juillet 2008
Messages : 222
Détails du profil
Informations personnelles :
Nom : Homme Jean
Localisation : France, Seine Maritime (Haute Normandie)

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : juillet 2008
Messages : 222
Points : 97
Points : 97
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
ovni76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2012, 19h44   #2
Ph. B.
Expert Confirmé
 
Avatar de Ph. B.
 
Homme Philippe
Inscription : avril 2002
Messages : 1 032
Détails du profil
Informations personnelles :
Nom : Homme Philippe
Âge : 46
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2002
Messages : 1 032
Points : 2 665
Points : 2 665
Envoyer un message via ICQ à Ph. B. Envoyer un message via Skype™ à Ph. B.
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.
Ph. B. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2012, 22h16   #3
Dr.Who
Membre Expert
 
Avatar de Dr.Who
 
Inscription : septembre 2009
Messages : 980
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : septembre 2009
Messages : 980
Points : 1 175
Points : 1 175
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!
Dr.Who est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2012, 22h25   #4
ovni76
Membre régulier
 
Homme Jean
Retraité
Inscription : juillet 2008
Messages : 222
Détails du profil
Informations personnelles :
Nom : Homme Jean
Localisation : France, Seine Maritime (Haute Normandie)

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : juillet 2008
Messages : 222
Points : 97
Points : 97
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+
ovni76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2012, 22h45   #5
Dr.Who
Membre Expert
 
Avatar de Dr.Who
 
Inscription : septembre 2009
Messages : 980
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : septembre 2009
Messages : 980
Points : 1 175
Points : 1 175
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!
Dr.Who est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2012, 00h14   #6
ovni76
Membre régulier
 
Homme Jean
Retraité
Inscription : juillet 2008
Messages : 222
Détails du profil
Informations personnelles :
Nom : Homme Jean
Localisation : France, Seine Maritime (Haute Normandie)

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : juillet 2008
Messages : 222
Points : 97
Points : 97
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+
ovni76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2012, 21h44   #7
Dr.Who
Membre Expert
 
Avatar de Dr.Who
 
Inscription : septembre 2009
Messages : 980
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : septembre 2009
Messages : 980
Points : 1 175
Points : 1 175
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!
Dr.Who est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/11/2012, 22h10   #8
ovni76
Membre régulier
 
Homme Jean
Retraité
Inscription : juillet 2008
Messages : 222
Détails du profil
Informations personnelles :
Nom : Homme Jean
Localisation : France, Seine Maritime (Haute Normandie)

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : juillet 2008
Messages : 222
Points : 97
Points : 97
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 ?
ovni76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2012, 08h28   #9
batyann811
Membre éprouvé
 
Homme
Inscription : janvier 2010
Messages : 223
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 40
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : janvier 2010
Messages : 223
Points : 451
Points : 451
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;
batyann811 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2012, 12h21   #10
ovni76
Membre régulier
 
Homme Jean
Retraité
Inscription : juillet 2008
Messages : 222
Détails du profil
Informations personnelles :
Nom : Homme Jean
Localisation : France, Seine Maritime (Haute Normandie)

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : juillet 2008
Messages : 222
Points : 97
Points : 97
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+
ovni76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2012, 19h00   #11
ovni76
Membre régulier
 
Homme Jean
Retraité
Inscription : juillet 2008
Messages : 222
Détails du profil
Informations personnelles :
Nom : Homme Jean
Localisation : France, Seine Maritime (Haute Normandie)

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : juillet 2008
Messages : 222
Points : 97
Points : 97
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+
ovni76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 21h05.


 
 
 
 
Partenaires

Hébergement Web