Voici le code de la classe qui
permet d’imprimer un arbre quelconque. Créez une classe et ses méthodes, copier
/ coller chaque partie dans la méthode
correspondante.
Pour imprimmer : Instanciez l'objet en lui
donnant le nom du Treeview et utiliser la méthode Imprime.
TreeImp est une
classe
// tableau pour
l'impression des décalages
Arbre
est un tableau fixe de 8000
entiers
// nom du
treeview
NomTreeview est une chaîne
// informations
sur la police de caractère
NoPolice
est un entier
NomPolice
est une chaîne
HauteurPolice est un
entier
AttributsPolice est un
entier
MargePolice
est un entier
PageEnCours
est un entier
// informations
sur la ligne à imprimer en mm
HauteurLigne est un entier
// Largeur d'un
niveau à imprimer en mm
LargeurNiveau est un
entier
// position
courante dans la page en mm
PosCourante est un entier
PosPrecedante est un
entier
// position de
départ en mm sur une page
PosDepart
est un entier
// position de
fin en mm sur une page
PosFin
est un entier
// marge droite
en mm
MargeDroite
est un entier
// couleur
magenta transparente
MagentaTransparent est un
booléen
CouleurCadreHautFinDocument est un entier
FIN
PROCEDURE
Constructeur(NomTreeview,CouleurCadre)
//Paramètres :
//- nomTreeView
: Nom complet du treeview (NomFenêtre.NomChampTreeView)
//- CouleurCadre
: Couleur du cadre haut et bas de document lors de
l'impression.
:NomTreeview = NomTreeview
// valeur par
défaut pour la police
:NoPolice = 999
:NomPolice = "Arial"
:HauteurPolice = 10
:AttributsPolice =
iNormal
:MargePolice = 1
// zone
d'impression
:PosDepart = 20
:PosFin = iHauteurPage()
:MargeDroite = 20
//
niveau
:LargeurNiveau = 10
// couleur
magenta transparente
:MagentaTransparent=Vrai
:CouleurCadreHautFinDocument = CouleurCadre
PROCEDURE
TreeImp::ChHauteurLigne()
// calcul la
hauteur d'une ligne en fonction de la police choisie
:HauteurLigne = iHauteurTexte(iPolice(:NoPolice)+"X") +
(2 *
:MargePolice)
PROCEDURE
TreeImp::ChLargeurNiveau(LargeurNiveau)
:LargeurNiveau = LargeurNiveau
PROCEDURE
TreeImp::ChMagentaTransp(MagentaTransparent)
SI MagentaTransparent = 1 ALORS
:MagentaTransparent =
Vrai
SINON
:MagentaTransparent =
Faux
FIN
PROCEDURE
TreeImp::ChMargeDroite(MargeDroite)
:MargeDroite = MargeDroite
PROCEDURE
TreeImp::ChPolice(Num, Nom, TaillePolice, Attributs)
:NoPolice = Num
:NomPolice = Nom
:HauteurPolice = TaillePolice
:AttributsPolice
= Attributs
PROCEDURE
TreeImp::ChPosDepart(PosDepart)
:PosDepart
= PosDepart
PROCEDURE
TreeImp::ChPosFin(PosFin)
:PosFin = PosFin
PROCEDURE
TreeImp::Imprime()
//initialise la
page en cours
:PageEnCours=iNumPage()
// création de
la police de caractère
iCréePolice(:NoPolice, :HauteurPolice, :AttributsPolice, :NomPolice)
//Calcul de la
hauteur d'une ligne
:ChHauteurLigne()
//Position
courante
:PosCourante = iPosY()+:PosDepart
:PosPrecedante=:PosCourante
// Liste les
fils du treeview à partir de la racine pour l'imprimer
ArbreListeFils(:NomTreeview, Null,
":ImprimeTreeView")
PROCEDURE
TreeImp::ImprimeElement(Element, Niveau, Identifiant)
Décalage est un entier
= 0
//Vérifie si
saut de page
//en cas de
nouvelle page, on change la position courante
:VerifiePosCourant()
// impression de
l'image
SI
:ImprimeImage(identifiant, Niveau)=Vrai
ALORS
Décalage =
:HauteurLigne
FIN
iImprime( iPolice(:NoPolice) +
iPosY(:PosCourante+:MargePolice)
+...
iPosX(:MargeDroite +
(Niveau*:LargeurNiveau) +
Décalage) +
Element)
:PosPrecedante=:PosCourante+:HauteurLigne
:PosCourante+=(:HauteurLigne*PartieEntière((iPosY()-(:PosCourante+:MargePolice))/:HauteurLigne))
FONCTION
TreeImp::ImprimeImage(Fichier, Niveau)
// renvoie vrai
si une image est imprimé
// vérification
de la validité du fichier image
SI ExtraitChaîne( InfoBitmap( Fichier ), 1)<>
"BAD"
ALORS
// si la couleur
magenta doit être transparente
SI
:MagentaTransparent=Vrai ALORS
iMagentaTransparent(Vrai)
// impression de
l'image
iImprimeImage(Fichier, :MargeDroite +
(Niveau*:LargeurNiveau),
:PosCourante,...
:MargeDroite +
(Niveau*:LargeurNiveau) +
:HauteurLigne, :PosCourante+:HauteurLigne)
iMagentaTransparent(Faux)
RENVOYER
Vrai
FIN
RENVOYER
Faux
PROCEDURE
TreeImp::ImprimeTrait(L1, C1, L2, C2)
Ligne2,Colonne2 sont des
entiers
//Vérifie si
saut de page
//en cas de
nouvelle page, on change la position courante
:VerifiePosCourant()
SI L2>iHauteurPage()
ALORS
Ligne2=iHauteurPage()
SINON
Ligne2=L2
FIN
SI C2>iLargeurPage()
ALORS
Colonne2=iHauteurPage()
SINON
Colonne2=C2
FIN
iTrait(C1,L1,Colonne2,Ligne2,1,iNoir,1)
PROCEDURE PRIVÉ
TreeImp::ImprimeTreeView(NomTV, Chemin, Element, Niveau, Pointeur)
// cette
procédure est appelée par la fonction ArbreListeFils() pour chaque
// élément du
treeview.
NomTV =
:NomTreeview
// déclaration
des variables
i est un
entier
Identifiant est une chaîne
// contient
l'identifiant du niveau en cours.
// si
l'identifiant contient une image elle est imprimée.
// on stocke le
nombre de fils de l'élément en cours
:Arbre[ Niveau ] =
ArbreOccurrence(NomTV, Chemin+Element,
aUnNiveau)
// si on est pas
à la racine, on décrémente le nombre de fils du pére
// Niveau est le
niveau du fils, (Niveau-1) celui du père
SI Niveau <>
1
ALORS
:Arbre[ Niveau - 1
]--
FIN
// récupération
de l'identifiant
Identifiant = ArbreRécupèreIdentifiant(NomTV, Chemin+Element)
// impression du
niveau
SI Niveau >
1
ALORS
POUR
i=1 A
(Niveau - 1)
//Vérifie si
saut de page
//en cas de
nouvelle page, on change la position courante
:VerifiePosCourant()
// impression du
trait pour le niveau en cours
SI (i =
(Niveau - 1) )
ALORS
SELON :Arbre[ i
]
CAS 0: // c'est le
dernier fils, on imprime un retour
:TraitRetour(i, Element, Identifiant)
AUTRE CAS: // il y a encore
des fils donc on imprime un croisement
:TraitCroisement(i, Element, Identifiant)
FIN
SINON
// impression du
trait pour un niveau quelconque
SELON :Arbre[ i
]
CAS 0: // plus de fils
pour ce niveau donc aucun trait à imprimer
AUTRE CAS: // il existe
encore des fils donc on imprime un trait vertical
:TraitVertical(i)
FIN
FIN
FIN
SINON
// cas
particulier pour la racine
:ImprimeElement(Element, 0, Identifiant)
FIN
// on augmente
la position courante d'une hauteur de ligne
:PosCourante +=
:HauteurLigne
// si on dépasse
le cadre d'impression on saute une page
SI
:PosCourante >
:PosFin
ALORS
iSautePage
:PosCourante =
:PosDepart
FIN
PROCEDURE
TreeImp::Initialisation(NomTreeview,CouleurCadre)
//Paramètres :
//- nomTreeView
: Nom complet du treeview (NomFenêtre.NomChampTreeView)
//- CouleurCadre
: Couleur du cadre haut et bas de document lors de
l'impression.
:NomTreeview = NomTreeview
// valeur par
défaut pour la police
:NoPolice = 999
:NomPolice = "Arial"
:HauteurPolice = 10
:AttributsPolice =
iNormal
:MargePolice = 1
// zone
d'impression
:PosDepart = 20
:PosFin = iHauteurPage()
:MargeDroite = 20
//
niveau
:LargeurNiveau = 10
// couleur
magenta transparente
:MagentaTransparent=Vrai
:CouleurCadreHautFinDocument = CouleurCadre
PROCEDURE
TreeImp::RecupLargeurNiveau()
RENVOYER
:LargeurNiveau
PROCEDURE
TreeImp::RecupMagentaTransp()
RENVOYER
:MagentaTransparent
PROCEDURE
TreeImp::RecupMargeDroite()
RENVOYER
:MargeDroite
PROCEDURE
TreeImp::RecupPolice()
RENVOYER
:NomPolice+TAB+:HauteurPolice+TAB+:AttributsPolice
PROCEDURE
TreeImp::RecupPosDepart()
RENVOYER
:PosDepart
PROCEDURE
TreeImp::RecupPosFin()
RENVOYER
:PosFin
PROCEDURE
TreeImp::TraitCroisement(Niveau, Element, Identifiant)
// on imprime
|
//:PosCourante
:ImprimeTrait(:PosPrecedante ,
:MargeDroite +
((Niveau-1)*:LargeurNiveau) +
(:LargeurNiveau/2),
...
:PosCourante +
:HauteurLigne ,
:MargeDroite +
((Niveau-1)*:LargeurNiveau) +
(:LargeurNiveau/2)
)
// on imprime le
retour
//:PosCourante
:ImprimeTrait(:PosCourante +
(:HauteurLigne/2) ,
:MargeDroite +
((Niveau-1)*:LargeurNiveau) +
(:LargeurNiveau/2),
...
:PosCourante +
(:HauteurLigne/2),
:MargeDroite +
((Niveau-1)*:LargeurNiveau) +
(:LargeurNiveau/2) +
(:LargeurNiveau/4)
)
// on imprime le
nom de l'élément
:ImprimeElement(Element, Niveau, Identifiant)
PROCEDURE
TreeImp::TraitRetour(Niveau, Element, Identifiant)
// on imprime
|
//:PosCourante
:ImprimeTrait(:PosPrecedante ,
:MargeDroite +
((Niveau-1)*:LargeurNiveau) +
(:LargeurNiveau/2),
...
:PosCourante + (:HauteurLigne/2),
:MargeDroite +
((Niveau-1)*:LargeurNiveau) +
(:LargeurNiveau/2)
)
// on imprime le
retour
//:PosCourante
:ImprimeTrait(:PosPrecedante +
(:HauteurLigne/2) ,
:MargeDroite +
((Niveau-1)*:LargeurNiveau) +
(:LargeurNiveau/2),
...
:PosPrecedante +
(:HauteurLigne/2),
:MargeDroite +
((Niveau-1)*:LargeurNiveau) +
(:LargeurNiveau/2) +
(:LargeurNiveau/4)
)
// on imprime le
nom de l'élément
:ImprimeElement(Element, Niveau, Identifiant)
PROCEDURE
TreeImp::TraitVertical(Niveau)
//Vérifie si
saut de page
//en cas de
nouvelle page, on change la position courante
:VerifiePosCourant()
// on imprime
|
:ImprimeTrait(:PosCourante ,
:MargeDroite +
((Niveau-1)*:LargeurNiveau) +
(:LargeurNiveau/2),
...
:PosCourante +
:HauteurLigne, :MargeDroite +
((Niveau-1)*:LargeurNiveau) +
(:LargeurNiveau/2)
)
PROCEDURE
TreeImp::VerifiePosCourant()
//Vérifie si
saut de page
//en cas de
nouvelle page, on change la position courante
//hauteur
suffisante pour imprimmer le prochaine niveau ?
SI
:HauteurLigne+iPosY()>iHauteurPage()
ALORS
iSautePage()
FIN
SI
:PageEnCours<>iNumPage()
ALORS
:PageEnCours=iNumPage()
:PosCourante=:PosDepart
FIN
PROCEDURE
ImprimeTitre(sTitre1="",sTitre2="")
//Impression du
titre du document :
//Création de
polices
iCréePolice(1, 20,
iGras, "Arial",iBlanc)
iCréePolice(2, 20,
iGras, "Arial",iJauneBulle)
//Impression
d'un cadre en haut du document
iCadre(0,17,iLargeurPage(),17+15,1,100,:CouleurCadreHautFinDocument)
//iPosY(iPosY()-17)
//RVB(127,157,185)
//iraz
//7F9DB9
iPosY(20)
iImprimeMot(iPolice(2)+iPosX(20)+sTitre1)
iImprimeMot(iPolice(1) +
sTitre2)
// Syntaxe
:
//iImprimeFinDocument
()
//Impression
d'une fin de document
// Paramètres
:
// Aucun
// Valeur de
retour :
// Aucune
PROCEDURE
iImprimeFinDocument()
iPosY(iPosY()+10)
iCadre(0,iPosY(),iLargeurPage(),iPosY()+10,1,100,:CouleurCadreHautFinDocument)