Caractères spéciaux

Résolu
cs_jacques13 Messages postés 252 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 29 juin 2013 - 15 mars 2007 à 18:45
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 - 19 mars 2007 à 20:56
Bonjour,
J'aimerais présenter des résultats imprimés sur une feuille dans un cadre.
Je souhaiterais ne pas dessiner ce cadre avec des Printer.Line... mais plutôt insérer les données dans un cadre tracé par des caractères spéciaux du genre:




+------------+¦ 456 ¦ 345  ¦

+------------+





au moyen d'instructions chr$().
Ce qui était très facile dans la programmation DOS avec l'instruction "lprint" me semble plus difficile en VB6 du fait que généralement (c'est du moins le cas avec la police Courier New) les codes ascii qui permettent ce genre d'impression sont supérieurs à 255.
Quelqu'un verrait-il une solution?

31 réponses

jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
19 mars 2007 à 10:53
Alors ?
Je viens de le faire chez moi.... et çà marche...je te signale
3
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
15 mars 2007 à 19:02
Bonjour,

Utilise l'objet Printer

Il s'utilise exactement comme une PictureBox.

Entraîne-toi donc avec une picturebox d'abord...

Montre-nous, au besoin, la partie du code où tu rencontres une difficulté

que tu imprimes en te référant à un caractère ou à chr(saçvaleur_ascii), c'est pareil ...

Mots à regarder dans ton aide en ligne :
CurrentX
CurrentY
Print
textwidth
TextHeight

Vas-y ...
0
cs_jacques13 Messages postés 252 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 29 juin 2013
15 mars 2007 à 20:26
Bonjour jmfmarques,
Tout d'abord mes excuses pour l'exemple que j'ai inséré dans mon texte, chez moi il était correct, mais mis en ligne, il ne ressemble plus à rien. J'avais représenté un beau cadre avec 2 valeurs numériques incluses.
En fait, j'aimerais utiliser des lignes de commande du genre:
'un coin supérieur gauche, une ligne horizontale et un coin supérieur droit
Printer.print chr$(167) & "String$(26,244) & chr$(168)
'une barre verticale, une valeur numérique, une barre verticale, ...
Printer.print chr$(189) & "456" & chr$(189) & "654" & chr$(189)

Bien sûr dans cet exemple les valeurs des chr$ sont fantaisistes puisque justement je recherche ces valeurs!
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
15 mars 2007 à 21:32
Bonsoir,
j'aomerais vraiment que tu t'entraînes dans une picturebox, avant de passer au printer !

Regarde un peu ta 1ère ligne, délà (et je ne veux pas aller plus loin, à ce stade...)

que t'afficherait :

Private Sub Command1_Click()
   Picture1.Print Chr$(167) & "String$(26,244) & chr$(168) "
End Sub
fais-le et regarde ...:
§String$(26,244) & chr$(168)    !!!!!

je te demande d'analyser et de comprendre pourquoi ...si tu veux bien...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_jacques13 Messages postés 252 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 29 juin 2013
15 mars 2007 à 22:55
D'accord, il y a un " en trop!
Mais le problème n'est pas là, as-tu compris que je cherche un moyen pour dessiner un cadre de tableau avec des chr$ dans un contexte de police Courier New?
D'autre part, je me répète, les valeurs des chr$ que j'expose dans mon exemple sont fictives puisque justement je cherche à obtenir ces valeurs.
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
15 mars 2007 à 23:26
J'ai parfaitement compris !
(pas toi)
Veux-tu bien, s'il te plait, t'exercer avec une picturebox d'abord ?
Tu n'as pas qu'un " en trop (ils marchent d'ailleurs par paires, non ?)
Veux-tu bien t'appliquer, en relisant (et appliquant) ma toute première réponse ?
J'attends.

ps : voilà ce que ce que tu as écrit donnerait sans les "" :
§ôôôôôôôôôôôôôôôôôôôôôôôôôô¨
"dans un contexte courrier New"
A ce propos : je te rappelle que tu dois également définir la font qu'utilisera ta picturebox...
mais tu liras celà dans la rubruqye textwidth et Textheight de ton aide en ligne.
Il est impensable de "peindre" (et le texte sera ici un dessin... forcément) dans une pictureBox ou Printer sans passer par ces deux méthodes conjuguées à l'objet Font (aide en ligne également), à apprendre nécessairement.
Jette-donc in petit coup d'oeil à lune de mes sources , celle-ci, par exemple :
http://www.vbfrance.com/codes/JUSTIFICATION-DANS-BOUTONS-COMMANDE-CHECBOXES-OPTIONBUTTONS-COMMANDBUTTONS-AVEC_41042.aspx
ou encore celle-là :
http://www.vbfrance.com/codes/CONTROLES-PERSONNALISES-DIVERS-DEGRADES-PARAMETRABLES-TOUCHE-RACCOURCI-COULEUR_41498.aspx

Une partie du code de chacune d'entre-elles devrait te suffire à comprendre comment ça marche...
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
15 mars 2007 à 23:29
Tout celà résulte de ton choix, je te le rappelle également, de dessiner avec des caractères et non des lignes...
Il te faut donc bûcher un peu, alors... (et ce n'est pas difficile du tout, pour peu que tu bûches ce que je t'ai demander de "bûcher")
0
cs_jacques13 Messages postés 252 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 29 juin 2013
16 mars 2007 à 18:40
Bonjour jmfmarques,
J'ai essayé de suivre ton conseil de passer par des tests avec une PictureBox plutôt que mon objet printer.
Dans l'exemple qui suit, je teste 2 méthodes, l'une avec une police bizarroïde 8514oem mais qui donne de bons résultats et l'autre avec une police plus classique pour laquelle je suis obligé de charger des valeurs ascii supérieures à 255 au moyen de l'instruction ChrW ... mais qui ne fonctionne pas!
Ceci dit, la première méthode qui marche avec le PictureBox me donne quand même des ???? quand je la transpose sur le Printer!

Private Sub Form_Load()
  aparc$ = "KH67TR978"
  SurfMaj = 1345
  Surface = 2404
  delta = Abs(SurfMaj - Surface)
  pourc = Int(delta / SurfMaj * 100)
  Picture1.AutoRedraw = True
  '1ère méthode avec la font 8514oem (pas présente sur toutes les machines!)
  Picture1.FontName = "8514oem"
  Picture1.FontSize = 10
  Picture1.Print Chr$(&HDA) + String$(11, &HC4) + Chr$(&HC2) + String$(9, &HC4) + Chr$(&HC2) + String$(9, &HC4) + Chr$(&HC2) + String$(8, &HC4) + Chr$(&HC2) + String$(4, &HC4) + Chr$(&HC2) + String$(6, &HC4) + Chr$(&HC2) + String$(13, &HC4) + Chr$(&HC2) + String$(10, &HC4) + Chr$(&HC2) + String$(10, &HC4) + Chr$(&HBF)
  Picture1.Print "|   Parc.   | S.Majic | S.Graph | delta  | %  | n§DA |  Anomalie   | Rect.Maj | Rect.PCI |"
  Picture1.Print Chr$(&HC3) + String$(11, &HC4) + Chr$(&HC5) + String$(9, &HC4) + Chr$(&HC5) + String$(9, &HC4) + Chr$(&HC5) + String$(8, &HC4) + Chr$(&HC5) + String$(4, &HC4) + Chr$(&HC5) + String$(6, &HC4) + Chr$(&HC5) + String$(13, &HC4) + Chr$(&HC5) + String$(10, &HC4) + Chr$(&HC5) + String$(10, &HC4) + Chr$(&HB4)
  Picture1.Print "| " + aparc$ + " | ";
  Picture1.Print Format$(SurfMaj, "0###### | ");
  Picture1.Print Format$(Surface, "0###### | ");
  Picture1.Print Format$(delta, "0##### | ");
  Picture1.Print Format$(pourc, "0# | ");
  Picture1.Print "     |             |          |          |"
  Picture1.Print Chr$(&HC3) + String$(11, &HC4) + Chr$(&HC5) + String$(9, &HC4) + Chr$(&HC5) + String$(9, &HC4) + Chr$(&HC5) + String$(8, &HC4) + Chr$(&HC5) + String$(4, &HC4) + Chr$(&HC5) + String$(6, &HC4) + Chr$(&HC5) + String$(13, &HC4) + Chr$(&HC5) + String$(10, &HC4) + Chr$(&HC5) + String$(10, &HC4) + Chr$(&HB4)
  Picture1.Print "| " + aparc$ + " | ";
  Picture1.Print Format$(SurfMaj, "0###### | ");
  Picture1.Print Format$(Surface, "0###### | ");
  Picture1.Print Format$(delta, "0##### | ");
  Picture1.Print Format$(pourc, "0# | ");
  Picture1.Print "     |             |          |          |"
  Picture1.Print Chr$(&HC0) + String$(11, &HC4) + Chr$(&HC1) + String$(9, &HC4) + Chr$(&HC1) + String$(9, &HC4) + Chr$(&HC1) + String$(8, &HC4) + Chr$(&HC1) + String$(4, &HC4) + Chr$(&HC1) + String$(6, &HC4) + Chr$(&HC1) + String$(13, &HC4) + Chr$(&HC1) + String$(10, &HC4) + Chr$(&HC1) + String$(10, &HC4) + Chr$(&HD9)
  '2ème méthode avec la font Courier New et la fonction chrw
  Picture1.FontName = "Courier New"
  Picture1.FontSize = 10
  Picture1.Print ChrW(&H250C) + String$(11, &H2500) + ChrW(&H252C) + String$(9, &H2500) + ChrW(&H252C) + String$(9, &H2500) + ChrW(&H252C) + String$(8, &H2500) + ChrW(&H252C) + String$(4, &H2500) + ChrW(&H252C) + String$(6, &H2500) + ChrW(&H252C) + String$(13, &H2500) + ChrW(&H252C) + String$(10, &H2500) + ChrW(&H252C) + String$(10, &H2500) + ChrW(&H2510)
  Picture1.Print "|   Parc.   | S.Majic | S.Graph | delta  | %  | n°DA |  Anomalie   | Rect.Maj | Rect.PCI |"
  Picture1.Print ChrW(&H251C) + String$(11, &H2500) + ChrW(&H253C) + String$(9, &H2500) + ChrW(&H253C) + String$(9, &H2500) + ChrW(&H253C) + String$(8, &H2500) + ChrW(&H253C) + String$(4, &H2500) + ChrW(&H252C) + String$(6, &H2500) + ChrW(&H253C) + String$(13, &H2500) + ChrW(&H253C) + String$(10, &H2500) + ChrW(&H253C) + String$(10, &H2500) + ChrW(&H2524)
  Picture1.Print "| " + aparc$ + " | ";
  Picture1.Print Format$(SurfMaj, "0###### | ");
  Picture1.Print Format$(Surface, "0###### | ");
  Picture1.Print Format$(delta, "0##### | ");
  Picture1.Print Format$(pourc, "0# | ");
  Picture1.Print "     |             |          |          |"
  Picture1.Print ChrW(&H2514) + String$(11, &H2500) + ChrW(&H2534) + String$(9, &H2500) + ChrW(&H2534) + String$(9, &H2500) + ChrW(&H2534) + String$(8, &H2500) + ChrW(&H2534) + String$(4, &H2500) + ChrW(&H2534) + String$(6, &H2500) + ChrW(&H2534) + String$(13, &H2500) + ChrW(&H2534) + String$(10, &H2500) + ChrW(&H2534) + String$(10, &H2500) + ChrW(&H2518)
End Sub
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
16 mars 2007 à 18:54
Je commencerais par regarder ce qu'accepte mon imprimante, avant de continuer plus loin, si j'étais toi.
A commencer par les polices et les jeux de caractères.....
Pourquoi tiens-tu tant à faire des "coins" aux 4 coins ?


En calculant bien, tu pourrais te servir de caractères plus orthodoxes, non ? le caractère 108 et le caractère 26, bien gérés, devraient te suffire largement pour faire un rectangle parfait.
0
cs_jacques13 Messages postés 252 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 29 juin 2013
16 mars 2007 à 19:04
Je tiens à mes coins, c'est quand même plus convenable. Une idée me vient: est-il possible de charger par VB une police telle que 8514oem.fon? A propos, as-tu testé mon exemple?
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
16 mars 2007 à 19:10
Tiens,

je viens de te bâcler" quelque chose, pour que tu voies....
Je dis bien "bâcler" (et c'est volontaire) car, pour te laisser la joie de certains calculs avec TextWidth et TextHeight, je me suis abstenu de mettre ces calculs dans ce petit bout de code et les ai remplacés par autre chose, en fonction d'une Police MS Sans Serif de taille 8

Private Sub Command1_Click()
  With Picture1.Font
    .Size = 8
    .Name = "MS Sans Serif"
  End With
  Picture1.ScaleMode = vbPixels
  Picture1.CurrentX = 10
  Picture1.Print String$(26, Chr$(95))
  For i = 1 To 5
    Picture1.CurrentY = (8 * i) + 3
    Picture1.CurrentX = 9
    Picture1.Print Chr$(108) & String$(51, Chr(32)) & Chr$(108)
  Next
  Picture1.CurrentX = 10
  Picture1.CurrentY = Picture1.CurrentY - 15
  Picture1.Print String$(26, Chr$(95))
End Sub

Il est clair qu'il faudrait remplacer certains chiffres en cas de police et de taille différentes (et c'est là que doivent être utilisés les fameux TextWidth et TextHeight). Je tiens à te laisser faire cet exercice, puisque c'est toi qui a décidé de t'y prendre ainsi plutôt que de façon plus classique (et plus rapide)...
0
cs_jacques13 Messages postés 252 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 29 juin 2013
16 mars 2007 à 19:25
Ta routine fait effectivement un beau rectangle, mais pour y insérer du texte ça va être coton!
Ma méthode semble plus adaptée à mon cas particulier (en tout cas, lorsqu'elle marchera!)
As-tu quand même testé ma routine?
Que penses-tu de l'idée de charger par programme une police?
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
16 mars 2007 à 19:50
Je n'ai pas testé ta routine, non ... et n'ai pas vraiment besoin de le faire...
Il y a déjà une bonne raison : je n'ai pas la police que tu utilises et n'ai pas vraiment l'intention de l'installer
Mais aussi et surtout :
1) je n'approuve absolument pas une telle dépendance relative à de trop nombreux aspects
2) l'épaisseur de ton trait va dépendre de la taille choisie; n'est-ce-pas ?
   - et dans ce cas, même si ta police était à espacement constant, tu serais condamné à donner au texte la même taille qu'aux traits (ou l'inverse, si tu voulais par exemple écrire plus gros mais avoir des traits fins...tinitn), sans quoi tout ton rectangle et son contenu seraient distordus...
  - tout celà parce que tu n'as pas utilisé TextWidth et TextHeight (il faut calculer, c'est vrai...), préférant y aller à grands renforts de compte de caractères ...
  - calculer pour calculer (avec TextWidth et TextHeight) le code que je t'ai montré te libèrerait au moins de ta dépendance à une police. Il te permettrait également de peindre comme tu l'entends, y compris dans des taolles différentes, ton rectangle et ton texte... en retombant toujours sur tes pieds.

  Que veux-tu que je fasse, là, te suivre vraiment sur un terrain que je réprouve ? Excuse-moi, mais... non.

  Bon... Pour en venir maintenant à ton intention d'installer ta police sur une machine cliente, il s'agit bien évidemment là d'un aspect à régler avec le vendeur de cette police.

  Peut-on savoir pourquoi tu tiens tant à procéder ainsi au lieu d'utiliser des méthodes plus simples, plus rapides, plus indépendantes et plus classoques ?
  S'il ne s'agit pas d'un exercice de type scolaire imposé : je ne comprends pas !
  S'il s'agit d'un exercice imposé, par contre : l'arrivée de ta police d'une part et la rigidité de l'ensemble, d'autre part, ne mettront pas de bon humeur ton notateur (pense alors, encore une fois, à utiliser des calculs par TextWidth et TextHeight car c'est ce qu'il attend de toi...)

Voilà.
0
cs_jacques13 Messages postés 252 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 29 juin 2013
16 mars 2007 à 20:59
Merci, grâce à tes observations, je me sens rajeunir!
Ma routine n'est pas une routine d'ordre général, elle est appliquée à un cas de formulaire bien précis et dont les données variables sont parfaitement formatées. Après avoir pesé le pour et le contre, j'ai opté pour cette solution qui me parait la plus adaptée à mes besoins et dont j'ai, par le passé, pu éprouver la fiabilité (programmation en DOS).
En résumé, mon problème, que je ne désespère pas de résoudre, est d'atteindre dans le tableau des caractères de la police Courier New (ou d'une autre police à taille constante) les symboles qui apparaissent au delà de la limite des 255.
Je me disais que si les traitements de texte basiques tels NotePad ou WordPad savent afficher ces fameux caractères, on devrait pouvoir le faire en VB!?
Bien sûr, je ne te demande pas d'adhérer à ma méthode, d'autant plus que je te suis très reconnaissant de tenter de m'aider, mais j'ai, malheureusement, passé l'âge de me faire sermonner.
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
16 mars 2007 à 21:34
Bon, ami,
Je te propose alors (je suis un vieux en ce qui me concerne) une réflexion à faire ensemble à haute voix, point par point, bien que je ne voulais absolument pas en arriver à cette "fausse solution fantaisiste" et m'en veuille donc de te permettre de t'en sortir ainsi.

Allons-y donc, si tu es prêt :

1) Je t'ai déjà exposé (plus haut) que l'objet printer se comportait très exactement comme un contrôle pictureBox
2) ce que tu as obtenu dans ta pictureBox n'est pas un ensemble de caractères mais purement et simplement leur dessin
3) ton imprimante est pointilleuse en matière d'impression de caractères dans une police et/ou un jeu de caractères qu'elle n'accepte pas, mais est soumise totalement à ta volonté pour l'impression de dessins (la "font", dans cette affaire n'existe plus)
4) tu me dis être satisfait de l'un de tes résultats dans la pictureBox mais pas dans le Printer
5) en sa qualité, l'objet printer, qui réagit comme une pictureBox, comprend et exécute sans problème du tout la méthode PaintPicture6) si tu donnes à ta picturebox les propriétés visible False, Autoredraw true et ScaleMode = vbPixels, tu n'auras aucine difficulté à utiliser ceci :
Picture1.Picture = Picture1.Image
Printer.paintpicture 0,0,printer.scalewidth,Printer.scaleHeight,0,0,picture1.scalewidth,Picture1.scaleheight

Il te suffira donc de dessiner la totalité de ton document dans la picturebox tremplin (au lieu de le faire directement dans l'objet printer, puis d'appliquer cette méthode pour l'impression.

Te voilà servi totalement, bien que je continue à ne pas être d'accord du tout avec tout celà !!!

Si toutefois, tu acceptais de voir comment on pourrait s'y prendre autrement et de façon plus rapide et plus orthodoxe, fais signe et je t'y guiderai avec plaisir.

PS : tu viens de me faire faire ce que je n'aime pas faire du tout...me faire le complice de méthodes contraires à l'esprit de développement...
Mais bon... C'était ton choix...
Je m'en veux quand même terriblement d'avoir ainsi faibli.
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
16 mars 2007 à 21:40
excuse (correction) !
Printer.paintpicture Picture1.picture, 0,0,printer.scalewidth,Printer.scaleHeight,0,0,picture1.scalewidth,Picture1.scaleheight
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
16 mars 2007 à 21:44
+---------------------------+

¦                           ¦

+---------------------------¦

¦                           ¦

+---------------------------+





Daniel
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
16 mars 2007 à 21:51
bah c'était un essai .... raté
ça marche dans la freebox pourtant
avec les caractères 218 196 191 195 180 192 217
ça marche aussi sous DOS



Daniel
0
cs_jacques13 Messages postés 252 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 29 juin 2013
16 mars 2007 à 21:53
Je te remercie pour cette solution qui peut me permettre de m'en sortir.
J'avoue que je ne comprends pas bien ta position quasi intégriste (excuses-moi du terme) sur une façon de traiter un problème dont, finalement, tu n'apréhendes pas tous les paramètres. Je ne pense pas qu'il y ait "un esprit de développement" mais différentes voies dont la seule raison d'être est le pragmatisme du résultat.
Alors, laisse-moi te poser le problème dans une forme plus académique: existe-t-il une manière d'obtenir au moyen de la commande Chr$() ou ChrW() des caractères d'une police donnée dont la valeur ascii est supérieure à 255.
La formulation est-elle correcte?
0
cs_jacques13 Messages postés 252 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 29 juin 2013
16 mars 2007 à 21:57
Merci pour le test, Gobillot, mais attention, tu te fais toi aussi le "complice" d'un programmation non-orthodoxe!
lol!
0
Rejoignez-nous