Report Writer V 1.6

TBPrinter.DLL V2.10


Support technique : 


Important: Dé-installer la version précédente avant d'installer celle ci

Quoi de neuf en V1.4 de Report Writer:

Possibilité d'intégrer des images et des lignes de séparation

Gestion des polices sous forme de liste déroulante

Gestion de l'alignement dans les tables

Gestion de la couleur pour tous les objets

Gestion des marges

Possibilité de masquer/démasquer les objets

Menu de listage de tous les objets connus dans le report

Quoi de neuf en V1.5

Correction bug d'impression des lignes dans un report

Ajouts des "shape" dans un report

Quoi de neuf en V1.6

Report Designer:

Ajout d'un menu affichant les marges physiques de l'imprimante actuelle.

Contrôle du dépassement de marge en mode dessin avec mise automatique des marges minimum possibles.

Menu de transposition des "reports" existants vers la nouvelle version (marges fixées à 10 m/m)

Liste des objets: Correction d'un bug d'affichage des coordonnées de l'objet et passage en simple clic pour sélectionner l'objet.

Interface de programmation (TBPrinter.dll)

Quatre nouvelles primitives permettant de récupérer les marges physiques de l'imprimante.

Correction bug dans la gestion de marges (Les marges sont maintenant fixées relativement au papier et en tenant compte des marges physiques réelles de l'imprimante)

Historique

Cet outil est issu du développement d'autres produits pour lesquels il m'était nécessaire d'effectuer des éditions.

De nature radine (d'aucuns diraient économique ...), je ne voulais pas à avoir à utiliser Crystal Report ou d'autres outils de repporting, car d'une part ils sont coûteux (Crack et autres bannis pour ces développements), et d'autre part ils font beaucoup plus de choses que ce dont j'avais besoin (et de plus, ils sont lourds à installer ...)

J'ai donc décidé de développer un outil simple d'édition. De fil en aiguille, cet outil est devenu ce qu'il est aujourd'hui.

Considérant que d'autres que moi avaient forcément le même problème, j'ai mis cet outil disponible sur le Net, en freeware, ceci afin de faciliter la vie des autres, et aussi de profiter de son utilisation plus importante pour le corriger et l'améliorer.

IL y reste donc forcément des bugs et autres problèmes, je compte sur votre indulgence, et si vous en avez le courage, à vous de me faire part de vos remarques et aide éventuelle en à mailto://tbertrand@wanadoo.fr

Cet outil comprend un exécutable (reportdesigner.exe) permettant de créer des fichiers de description de report, et une interface de programmation sous la forme d'une DLL activeX (TBPrinter.dll) utilisable sous VB6.

L'interface de programmation est utilisable sans l'exécutable (l'inverse n'aurait pas beaucoup d'intérêt mais bon sait-on jamais ...).

Diffusion :

Les développements éventuels utilisant cet outil que vous serez amenés (je l'espère bien) à diffuser devront simplement mentionner la référence suivante : Outil de reporting Ó TBESoft - TBertrand@wanadoo.fr dans leur "A propos". Merci (de toutes façons, j'irai pas voir dans tous vos machins, hein ?)

De plus, la diffusion de ce source html et des quelques images associées avec ce contrôle sera la bienvenue.

Concernant la Dll activeX, seul un regsvr32 sera nécessaire lors du déploiement de vos super trucs si celui ci est manuel (mais si ce sont des super trucs, c'est impossible n'est ce pas ...).




  • Report Designer - ReportDesigner.exe
  • Interface de programmation - DLL ActiveX TBPrinter.DLL
  • Exemple Source de programmation


  • ReportDesigner.exe

    Cet outil est relativement intuitif d'utilisation aussi je sera bref.

    Menu Principal :

    Fichier

    Nouveau : Efface l'environnement de travail et permet de définir un nouveau report.   

    Ouvrir: Comme pour tout produit Windows, il sert à ouvrir un fichier de description de report.

    Enregistrer et Enregistrer Sous: Permet de sauvegarder votre oeuvre.

    Traduire de V1.4 vers V1.6: Permet de récupérer les reports créés avec une version antérieure à V1.6

    Imprimante: Permet de choisir l'imprimante sur laquelle vous éditerez votre oeuvre.

    Aperçu avant impression: Pour ne pas gaspiller du papier et des arbres

    Impression: Si vous voulez vraiment vérifier que ça imprime comme on le voit à l'écran (pas inutile ...)

    Marges Physiques de l'imprimante actuelle: Permet d'avoir les valeurs de marges physiques de l'imprimante en pouce ou en millimètres (2 décimales)

    Quitter: Ciao, Adios, Godbye, Aufwiedersehn, au revoir.

    Objets:

    Lister: Permet de lister l'ensemble des objets présents dans le report. Cela est très utile quand des objets se superposent ou se situent en dehors de la feuille. La liste présentée alors permet, en cliquant sur le nom de l'objet, de le repositionner manuellement, ainsi que de les masquer ou de le démasquer individuellement.

    Tout afficher: Démasque l'ensemble des objets du report.

    Masquer: Masque l'objet sélectionné. En édition réelle, aucun objet n'est masqué.

    Marges: Permet de fixer les marges pour le report courant. Les marges devront être indiquées en 10eme de millimètre.

    Supprimer: Pour supprimer l'objet sélectionné (à utiliser avec précaution car pas de réchap ...)

    Contrôler: Le seul menu vraiment utile (!). Il vérifie que les noms utilisés comme variables dans l'état ne sont pas en double et donc que l'état est entièrement utilisable en programmation.

    Choix Paysage: C'est pour ceux qui ont la tête penchée sur le coté. ce choix sera enregistré dans le fichier report.

    Outils de dessin:

        : Définit une zone de texte fixe. On pourra modifier la police, la taille, l'alignement.

        : Définit une zone d'édition variable. On pourra modifier en plus le nom, le type, et le format

        : Définit une zone de tableau. Au départ, un tableau contient 2 colonnes de 5 lignes. On pourra modifier le  nombre de colonnes, de lignes, les titres des colonnes, les polices, taille et alignement des titres et des données, ainsi que leur type et leur format.

        : Définit un "shape". Seuls les "shape" rectangle, carré, rond ou ovale sont pris en compte. Les "shape" avec bords arrondis ne sont pas gérés dans cette version.

        : Définit une ligne de séparation dont on pourra choisir la couleur et la largeur.

    Pour créer un élément dans l'espace de travail, on sélectionne l'outil, puis à l'aide de la souris on appuie sur le bouton gauche, on reste appuyé le temps de tracer un rectangle, puis on relâche le bouton. Et voilà, l'élément est placé.

    Il se met à la taille adéquate correspondant à ses propriétés.

    On peut le déplacer dans l'espace de travail en positionnant la souris dessus, puis en appuyant sur le bouton gauche, toujours sans relâcher. On déplace alors la souris où bon nous semble, puis on relâche, et hop, l'élément est déplacé. On peut aussi modifier ses propriétés Left, Top dans la fenêtre de propriétés.

    On accède aux propriétés des éléments disposés sur l'espace de travail en cliquant dessus. Le rythme de clic n'est pas paramétrable et il est de 1/10e de sec.

    Les propriétés sont intuitives en général.

    Les propriétés particulières sont les suivantes.

    Propriété "Type" : Chaîne de caractère, numérique, date. Pour ces deux derniers, on aura intérêt à préciser les formats. ceux ci sont normalement les standards de windows (ceux reconnus par VB6), donc attention aux paramètres régionaux ...

    Propriété "Format": Classique windows: masque sous forme d'une chaîne de caractères indiquant la manière d'éditer.

    Exemples de format:

    #,###.00 € pour une zone numérique, correspond à un format "comptable" 1 645 678.12 €

    # correspondra à un format "entier" 1645678

    DDDD DD/MM/YYYY pour une zone date donnera : Mercredi 15/11/2003

    DD/MM/YY HH:MM:SS donnera 15/11/03 14:25:43

    etc ...

    Beaucoup de possibilités existent, donc beaucoup de possibilités de bug ... En tout état de cause, cette propriété est ensuite utilisée sous la forme "Format Valeur, Prop_Format" donc l'effet est prévisible (...???...)

    On peut toujours laisser une zone de type chaîne dans le report et formater dans le programme.

    Propriété "Length": Nombre de "digit" (tu me reconnais digicode ?) de la zone.

    Une zone variable possède une longueur (propriété "Length"). Pour une zone date, cela ne correspond pas à grand chose, aussi laisser 10. Pour une zone de type texte, c'est le nombre maximum de caractères. Pour une zone numérique, c'est le nombre maximum de chiffres significatifs (avant la virgule).

    L'aperçu avant impression et l'impression du report remplira toutes les zones variables avec des X pour les zones texte, des 9 pour les zones numériques et la date/heure du jour pour les zones dates.

    Propriété "Alignement":

    Une zone variable, un titre de colonne ou une zone variable de tableau possède la propriété d'alignement. Par défaut elle est à gauche, mais peut être "Droite" ou "Centre". Les zones seront tronquées à droite pour une zone alignée à gauche ou au centre, et à gauche pour une zone alignée à droite.

    Principe de base: Les zones variables d'édition, les tableaux et les zones variables de tableau sont identifiées par un nom. ce nom doit être unique pour toutes les zones variables entre elles, pour tous les tableaux entre eux, et pour toutes les zones variable de tableau à l'intérieur du tableau. Ce qui signifie qu'un tableau peut très bien avoir le même nom qu'une zone variable, ou qu'une variable dans un tableau peut avoir le même nom qu'une variable dans un autre tableau, mais à l'usage, faut voir.

    Utilisation des tableaux:

    Les propriétés spécifiques dans un tableau sont

    Pour le tableau lui même:

    NbCol: Nombre de colonnes. Vaut 2 à la construction. La modification de cette valeur se traduit par le phénomène suivant: Si la nouvelle valeur est supérieure à l'ancienne, le nombre de colonnes adéquat est ajouté à la droite de la dernière colonne. Si la nouvelle valeur est inférieure, alors le nombre de colonne adéquat est supprimé par la droite.

    NbLigne: Nombre de lignes. Vaut 5 à la construction. Cette valeur influe directement sur l'encombrement du tableau dans le report. A l'utilisation, si la ligne à éditer dans le tableau dépasse cette valeur, cela provoquera un saut de page.

    Pour les cellules du tableau (Ces propriétés sont accessibles si on clique dans la zone variable et non dans la zone titre)

    RelativeWidth: Largeur relative de la colonne. La somme des valeurs correspond à la largeur totale du tableau.

    C'est tout pour le moment. Tout sera plus clair (?...) dans le chapitre "Interface de programmation"

    Retour en haut ???


    Interface de programmation TBPrinter.DLL

    L'utilisation sous VB est comme pour toutes les autres DLL: ajouter là référence à TBPrinter.dll à l'aide de la commande "Projet" - "Référence".

    Pour son utilisation, vous pouvez vous référer à l'exemple VB6 fourni (en mettant à jour la référence à la DLL qui sera sans doute invalide après installation dans la mesure où le chemin ne sera pas identique).

    L'objet à définir sera du type "THEPrinter". (Dim GPrinter as new THEPrinter)

    Cette interface peut être utilisée de deux manières :

    Libre: Créer un état comme le ferait un traitement de texte. On peut définir des tableaux en mode libre.

    Report: Utiliser un report prédéfini à l'aide de l'outil "ReportDesigner". Tous les objets utilisés dans l'édition sont définis dans un fichier de description report

    Ces deux modes sont utilisables simultanément, mais attention au mélange ...

    Constantes utilisables en utilisation "libre":

    THEPrinter_Align : Constantes d'alignement gauche - centre - droite - justifié
    THEPrinter_Orientation :  Portrait - Paysage
    THEPrinter_PaperSize : Format de papier (A4, B5, etc...)
    THEPrinter_Scale : Echelle de manipulation (pixel, point etc...)

    Constantes utilisables en utilisation "Report"

    THEPrinter_Error : Permet de récupérer une erreur (en utilisation de report uniquement )
     

    D'autres constantes sont visibles dans l'explorateur d'objet, mais sont à usage interne, aussi je ne les documenterait pas ici.

     

    Propriétés:

    Nom Usage Type VB (R)ead / (W)rite
    AvailableHeight

    Hauteur de la feuille moins les marges physiques

    Integer R
    AvailableWidth Largeur de la feuille moins les marges physiques Integer R
           
    Bold Gras - applicable au texte "libre" Boolean W
    Italic Italique - applicable au texte "libre" Boolean W
    UnderLine Souligné - applicable au texte "libre" Boolean W
    StrikeThru Barré - applicable au texte "libre" Boolean W
           
    BottomMargin Marge Basse - à n'utiliser qu'en mode "libre" Long R/W
    RightMargin Marge Droite - à n'utiliser qu'en mode "libre" Long R/W
    LeftMargin Marge Gauche - à n'utiliser qu'en mode "libre" Long R/W
    TopMargin Marge Haute - à n'utiliser qu'en mode "libre" Long R/W
           
    Font Police à utiliser String W
    Size Taille de la police Integer W
    CurOrient Orientation actuelle THEPrinter_Orientation R
    CurX et CurY Position de la tête d'écriture - <-X->   Y: hauteur Long R/W
    scaleheight Hauteur du papier en unité "ScaleMode" Long R
    ScaleWidth Largeur du papier en unité "ScaleMode" Long R
    ScaleMode Mode de gestion de l'échelle THEPrinter_Scale W
    PageSize Format de papier THEPrinter_PaperSize R
           
    Error Dernière erreur de l'interface THEPrinter_Error R
           
    Depuis V2.10      
    PhysicalLeftMargin Marge physique gauche (en unité indiquée par ScaleMode) Double R
    PhysicalRightMargin Idem marge droite Double R
    PhysicalTopMargin Idem Marge Haute Double R
    PhysicalBottomMargin Idem Marge Basse Double R

     

    Les méthodes sont présentées regroupées par type d'utilisation.

    Usage général: Choix d'imprimante, Notification de début de travail, Notification de fin de travail.

    Edition de texte: Impression de texte directement sur le printer.

    Impression d'une table: Impression de données en mode table (mode "libre")

    Impression graphique: Impression d'image, de cadre, de rectangle et encadrement de texte.

    Utilisation des reports: Impression de données via un report

     

    En mode "Libre", le texte est édité par paragraphe. Les caractéristiques d'édition sont fixées à l'aide de la méthode SetTextStyle. Toutefois, le texte édité peut contenir des commandes spécifiques d'édition, à l'instar du texte HTML. Les balises reconnues dans la version actuelle sont les suivantes :

    <B> et </B>: bascule en gras et non gras

    <I> et </I>: bascule en italique et non italique

    <U> et </U>: bascule en souligné et non souligné

    <FONT [NAME=" .. nom police .."] [SIZE=num] [COUL=num] >: Permet de changer dynamiquement de police. Le changement sera effectif jusqu'au prochain paragraphe, ou jusqu'à la prochaine commande "FONT" trouvée dans le texte. Chaque paramètre de cette commande est optionnel, on peut ne changer que la taille, la font ou la couleur.


    Méthodes de sélection, d'initialisation et de terminaison

    SelectPrinter () :

    Permet d'ouvrir la fenêtre de sélection de l'imprimante



    Init (Preview As Boolean,
            [FontName As String = "Arial"],
            [FontSize As Integer = 12],
            [Orientation As THEPrinter_Orientation = THEPrinter_Portrait])

    Demande au système d'initialiser un printer.

    Le paramètre "Preview" indique s'il doit être en "aperçu avant impression (Vrai)" ou en impression sur le périphérique (Faux)


    UseReport (FileName As String,
                      [Version As Integer = 1],
                      [Preview As Boolean = Faux])

    Demande au système d'initialiser un printer en mode "report".

    Le paramètre "FileName" contient le nom du fichier de report.

    Le paramètre Version est pour documentation, il faut impérativement le laisser à 1.

    Le paramètre Preview indique un "aperçu avant impression" (Vrai) ou une impression (Faux)

     

    On utilisera soit Init, soit UseReport, pour démarrer un printer.
     

    Cancel (): Annule l'édition en cours.


    CloseReport () as Boolean: Indique au système que l'utilisation du report est terminée. Le système libère l'ensemble des variables utilisées.

    Termine (): Indique au système que la constitution de l'état est terminée et qu'il peut procéder soit à l'affichage en visualisation, soit à l'impression, suivant le paramètre "Preview" utilisée lors de l'initialisation.


    Impression des entêtes et gestion du texte.

    NewLine (): Permet de sauter à la ligne suivante avec retour en début de ligne. Inutile en mode "Report"


    NewPage ([ByPassHeaderTable As Boolean = Faux])

    Permet de demander à faire un saut de page. Le système effectue les sauts de page automatiquement en fonction de l'endroit où la tête d'édition est positionnée. On peut forcer un saut de page à l'aide de cette méthode. Le paramètre permet d'indiquer au système que dans le cas où on était en train d'éditer un tableau, alors il faut éditer les titres de ce tableau en haut de page après le saut.

    Lorsque le système effectue un saut de page en mode "libre", l'entête haute et basse, qui ont éventuellement été définies sont éditées automatiquement. En mode "Report", il n'y a pas d'entête (dans cette version).

    SetFooter (sText As String,
                    [FontName As String = "Arial"],
                    [FontSize As Long = 12],
                    [Fontbold As Boolean = Faux],
                    [Fontitalic As Boolean = Faux],
                    [FontUnderline As Boolean = Faux],
                    [Fontstrikethru As Boolean = Faux],
                    [Align As THEPrinter_Align = THEPrinter_Right])

    Définit l'entête de bas de page. Les entêtes sont constitués de la chaîne fournie en paramètre. Cette chaîne peut contenir des "CRLF" (constante vbCrLf). Elle peut aussi contenir des variables d'édition. Seuls les entêtes peuvent contenir ces variables. Une variable d'édition est un mot  "#nom variable#". Les variables reconnues sont les suivantes:

    #numpage#: Numéro de la page en cours

    #longdate#: Date du jour au format long (dddd dd/mm/yyyy)

    #shortdate#: Date du jour au format court (dd/mm/yy)

    #longtime#: Heure du jour au format long (hh:mm:ss)

    #shorttime#: Heure du jour au format court (hh:mm)


    SetHeader (sText As String,
                    [FontName As String = "Arial"],
                    [FontSize As Long = 14],
                    [Fontbold As Boolean = Faux],
                    [Fontitalic As Boolean = Faux],
                    [FontUnderline As Boolean = Faux],
                    [Fontstrikethru As Boolean = Faux],
                    [Align As THEPrinter_Align = THEPrinter_Centre])

    Définit l'entête de haut de page. (cf SetFooter)


    SettextStyle ([FontName As String = "Arial"],
                    [FontSize As Long = 10],
                    [Fontbold As Boolean = Faux],
                    [Fontitalic As Boolean = Faux],
                    [FontUnderline As Boolean = Faux],
                    [Fontstrikethru As Boolean = Faux],
                    [Align As THEPrinter_Align = THEPrinter_Left],
                    [ForeColor As Long]

    Définit le style courant d'édition. Ce style sera valable pour tous les paragraphes à venir tant qu'un autre appel à SetTextStyle n'aura pas été effectué, ou tant qu'une commande dynamique n'aura pas modifié le style courant.

    PrintText (sText as string,
                    [Keep as boolean=Faux])

    Imprime un paragraphe. Le paramètre "Keep" permet d'indiquer au système de conserver la tête d'écriture à l'endroit atteint à l'issue de l'édition du paragraphe. (paramètre à utiliser avec circonspection car risque de perturber le système d'alignement des paragraphes)



    Impression de tables


    CreateTable (NbCol As Long,
                        ParamArray WidthRatios() As Variant

    Définit une table en édition "libre". Cette méthode ne fait que prévenir le système qu'il doit gérer l'existence d'une table. Cette table sera ultérieurement éditée en utilisant les paramètres d'édition qui seront définis à ce moment là (notamment les marges gauche et droite).

    NbCol: Indique le nombre de colonnes de la table.

    WidthRatios: Liste de nombre indiquant la largeur relative des colonnes. La largeur de la table sera de toute façon égale à la largeur de la feuille moins les marges gauche et droite lors de l'édition de la table.


    SetColTableStyle (Index As Long,
                    [FontName As String = "Arial"],
                    [FontSize As Long = 10],
                    [Fontbold As Boolean = Vrai],
                    [Fontitalic As Boolean = Faux],
                    [FontUnderline As Boolean = Faux],
                    [Fontstrikethru As Boolean = Faux],
                    [Align As THEPrinter_Align = THEPrinter_Centre])

    Définit les caractéristiques d'édition du titre de la colonne de la table courante.

    Index: Indice de la colonne. Cet indice varie de 1 à NbCol.


    SetDatasTableStyle(Index As Long,
                    [FontName As String = "Arial"],
                    [FontSize As Long = 8],
                    [Fontbold As Boolean = Faux],
                    [Fontitalic As Boolean = Faux],
                    [FontUnderline As Boolean = Faux],
                    [Fontstrikethru As Boolean = Faux],
                    [Align As THEPrinter_Align = THEPrinter_Left])

    Similaire à SetColTableStyle pour les données de la table.
     

    SetTableTitres (ParamArray Titres() As Variant)

    Définit les titres qui seront mis dans chaque colonne. Si ceux ci sont trop longs, ils seront tronqués suivant les règles générales de troncature. La liste fournie en paramètre doit contenir "NbCol" valeurs si on ne veut pas avoir de soucis.

    exemple: SetTableTitres "Titre col1", "Colonne 2", "Dernière colonne"
     

    PrintTableTitle ()

    Permet de forcer l'édition des titres de la table courante. En effet, ceux ci ne seront pas édités si la table ne contient pas de ligne. Cette méthode permet aussi de gérer plus finement le moment où l'édition des titres de la table s'effectue.

    Attention, les titres seront vraiment édités, donc si on se trouve déjà en train d'éditer une table, on risque de trouver des titres au milieu des données ...
     

    PrintTableLine (ParamArray Datas() as Variant)

    Indique au système qu'il doit éditer une ligne de la table en utilisant la liste de valeurs fournie en paramètre. Si c'est la première ligne qui est éditée, alors les titres seront aussi édités. Si l'édition de la ligne provoque un saut de page, alors la ligne de titre de la table sera également automatiquement éditée en début de page suivante (ainsi que les entêtes haut et bas).

    GetTableCoord () As Long()

    Permet de récupérer les coordonnées vraies des colonnes de la table courante dans un tableau de "longs".

    Le tableau à pour bornes (0, NbCol + 2) et est constitué ainsi:

    Indice 0: X gauche de la première case de la ligne courante (début de la colonne 1).

    Indice 1: X gauche de la deuxième case de la ligne courante(c'est donc la fin de la colonne 1 et aussi le début de la colonne 2).

    ...

    Indice n-1:X gauche de la N ième case

    Indice n:X droit de la fin de la N ième case. C'est aussi la limite droite de la table.

    Indice n+1:Y du haut de la ligne courante.

    Indice n+2:Y du bas de la ligne courante.

    Cette méthode est utile si on veut revenir sur les cases de la table ci pour les colorier par exemple. On prendra soin de travailler en mode "Twips".

    exemple d'utilisation:

    On suppose que Gprinter est du type THEPrinter, et qu'une table a été définie et contient 5 colonnes.

     Dim TableCoord() As Long

    TableCoord = Gprinter.GetTableCoord
    Gprinter.PrintTableLine "", "", "", "", ""
    Gprinter.ScaleMode = THEPrinter_eTwips
    For J = 0 To UBound(TableCoord) - 3

    Gprinter.PrintRectangle TableCoord(J),

    TableCoord(UBound(TableCoord) - 1),

    TableCoord(J + 1),

    TableCoord(UBound(TableCoord)),

    QBColor(2 * J), 1, True, True

    Next J
    Gprinter.ScaleMode = THEPrinter_eMillimetre
     

    les cases de la ligne en cours seront colorées en noir, vert, rouge, jaune et gris.

    Bien évidemment, dans cet exemple, on édite des cases vides, avant de colorer les cases pour pouvoir récupérer les coordonnées courantes de la table. Suivant l'ordre de l'édition et les couleurs choisies, le résultat pourra être différent car la couleur se superposera au texte. On pourrait alors se repositionner sur la ligne courante à l'aide des propriétés CurX et CurY pour éditer un autre texte par dessus la couleur. 


    Impression de graphismes


    PrintCadre (X1 As Long, Y1 As Long,
                      X2 As Long, Y2 As Long,
                      ForeColor As Long,
                      [DrawWidth As Integer],
                      [Filled As Boolean = Faux],
                      [BackColor As Long],
                      [Ombre As Boolean = Faux],
                      [CoordonneesLocales As Boolean = Faux])

    Imprime un cadre. C'est à dire un rectangle avec une bordure, et éventuellement une couleur de fond. A ne pas confondre avec PrintRectangle qui imprime une figure rectangulaire, n'ayant pas de bordure.

    ForeColor représente la couleur de la bordure.

    DrawWidth représente la largeur de la bordure, exprimée en unité ScaleMode.

    Filled indique si l'intérieur doit être rempli. Si c'est le cas, la couleur utilisée sera BackColor.

    Ombre indique si on désire porter une ombre au cadre. Cette ombre sera située en bas et à gauche.

    CoordonnéesLocales permet d'indiquer au système que les valeurs Xi et Yi fournies sont les valeurs vraies (Cf exemple sur GetTableCoord). Il n'y aura pas de correction dû aux marges physiques. En effet, suivant les imprimantes, et les polices, il peut y avoir un décalage entre la visualisation et l'impression. Ce paramètre permet de s'affranchir de quelques uns de ces problèmes.


    PrintRectangle (X1 As Long,
                            Y1 As Long,
                            X2 As Long,
                            Y2 As Long,
                            ForeColor As Long,
                            [DrawWidth As Integer],
                            [Filled As Boolean = Faux],
                            [CoordonneesLocales As Boolean = Faux]

    Similaire à PrintCadre, mais sans ombre ni bordure. Correspondrait à l'intérieur du cadre défini précédemment.

    PrintImage (Image As Object,
                       X As Long, Y As Long,
                       [CoordonneesLocales As Boolean = Faux])

    Edition d'une image. Le paramètre doit être un contrôle, dont la propriété "Image" contient l'image à éditer (Ouf, si avec toutes ces images on s'y retrouve....)


    En V 1.6 (TBPrinter.dll en V2.10)

    PhysicalRightMargin() as double

    PhysicalLeftMargin() as double

    PhysicalTopMargin as double

    PhysicalBottomMargin() as double

    Ces quatre primitives sont similaires et permettent de récupérer la valeur des différentes marges en unité sélectionnée (Cf THEPrinter_Scale). En pratique, ces valeurs ne sont réellement significatives en mode millimètre ou pouce.



    Utilisation des reports

    Ces méthodes ne s'utiliseront qu'avec un report. On évitera de mélanger l'utilisation d'une méthode précédente avec celles qui suivent.

    Avant d'utiliser ces méthode, il aura fallut appeler la méthode UseReport.


    SetVariable (VarName As String, Value as variant)

    Affecte la valeur "Value" à la variable d'édition "VarName". Ce n'est qu'une affectation, l'édition n'est pas effective à l'issue de cette méthode.

    La propriété erreur est positionnée au retour de cette méthode.


    PrintVarContent (VarName as string)

    Edite la variable d'édition dont le nom est donné en paramètre.

    La propriété erreur est positionnée au retour de cette méthode.


    PrintVariable (VarName as string, Value as variant)

    Cette méthode regroupe les deux en une seule. Elle affecte la valeur et édite la variable dans le report.

    La propriété erreur est positionnée au retour de cette méthode.

     

    SetArrayVar (ArrayName As String,
                          VarName As String,
                          Value as variant)

    Affecte la valeur value à la variable "VarName" du tableau "ArrayName" . De même, le tableau n'est pas édité à cet instant.

    La propriété erreur est positionnée au retour de cette méthode.


    PrintArrayLine (ArrayName as String)

    Edite la ligne courante du tableau ArrayName. Les valeurs des variables de tableaux utilisées seront les valeurs courantes. Si un saut de page est nécessaire pour éditer cette ligne, l'ensemble des variables du report seront éditées avant d'effectuer ce saut de page.

    La propriété erreur est positionnée au retour de cette méthode.


    PrintVarArrayLine (ArrayName as string, Values() as variant)

    Cette méthode regroupe les deux autres en une seule.

    La propriété erreur est positionnée au retour de cette méthode.

     

    En résumé:

    On appelle la méthode Init ou UsePrinter pour commencer.

    Ensuite on utilisera les méthodes PrintText ou PrintVariable pour imprimer quelque chose.

    Enfin, on appellera la méthode Termine pour juger du résultat.

     


    Les exemples sont constitués de deux fichiers ".frm" et d'un fichier report "sample.rep". Les fichiers ".frm" sont simplement à intégrer dans un projet VB afin de les utiliser comme bon vous semble.

     

    frmTest.frm: Source exemple d'utilisation en mode "libre".

    Ce source contient beaucoup d'appels à toutes les méthodes, aussi il est à regarder attentivement.

    tstReport.frm: Source Exemple de programmation avec un report.

    Cet exemple nécessite de disposer du fichier "sample.rep" livré avec l'outil "ReportDesigner". L'exemple complet est également fourni sous forme d'un projet VB

    Il est basé sur une forme contenant les objets suivants :

    une combobox (combo1) de type DropDown List) contenant 3 valeurs "Electro ménager", "Hifi Télévision" et "Video"

    3 listBox indexées (List1 avec les index 0,1 et 2)

    Cinq boutons (Command1 à Command5) pour effectuer les actions suivantes (dans l'ordre)

    Visualisation de l'édition de la valorisation d'un rayon (enabled=faux)

    Impression de la valorisation d'un rayon (enabled=faux)

    Sélection de l'imprimante (enabled=Vrai)

    Visualisation de l'édition de la valorisation de tout le stock (enabled=Vrai)

    Impression de la valorisation de tout le stock. (enabled=Vrai)

    Ne pas oublier d'ajouter la référence à la DLL TBPrinter.DLL avec le menu "Projet" - "Référence"

    Une fois cette forme créée, il suffit de faire un copier coller du source suivant.

     

    Option Explicit


    Dim gbPrinter As New THEPrinter

    Private Sub Combo1_Click()
    ChargeListe Combo1.ListIndex
    End Sub

    Private Sub Command1_Click()
    gbPrinter.UseReport AddSlash(App.Path) & "Sample.rep", , True
    If gbPrinter.Error = THEPrinter_Ok Then GenereEtatRayon
    End Sub

    Private Sub Command2_Click()
    gbPrinter.UseReport AddSlash(App.Path) & "Sample.rep", , False
    If gbPrinter.Error = THEPrinter_Ok Then GenereEtatRayon
    End Sub
    Private Sub Command4_Click()
    gbPrinter.UseReport AddSlash(App.Path) & "Sample.rep", , True
    If gbPrinter.Error = THEPrinter_Ok Then GenereEtatStock
    End Sub

    Private Sub Command5_Click()
    gbPrinter.UseReport AddSlash(App.Path) & "Sample.rep", , False
    If gbPrinter.Error = THEPrinter_Ok Then GenereEtatStock
    End Sub

    Private Sub Command3_Click()
    gbPrinter.SelectPrinter
    End Sub

    Private Function AddSlash(Path As String) As String
    If Right(Path, 1) <> "\" Then
    AddSlash = Path & "\"
    Else
    AddSlash = Path
    End If
    End Function

    Private Sub GenereEtatRayon()
    Dim I As Integer
    Dim Cumul As Currency

    gbPrinter.PrintVariable "NOMRAYON", Combo1.Text
    gbPrinter.PrintVariable "DATEIMP", Now()
    Cumul = 0
    For I = 0 To List1(0).ListCount - 1
    gbPrinter.SetArrayVar "TABLE", "ARTICLE", List1(0).List(I)
    gbPrinter.SetArrayVar "TABLE", "QUANTITE", CInt(Val(List1(1).List(I)))
    gbPrinter.SetArrayVar "TABLE", "PRIX", CDbl(Val(List1(2).List(I)))
    gbPrinter.SetArrayVar "TABLE", "VALO", CDbl(CInt(Val(List1(1).List(I))) * CDbl(Val(List1(2).List(I))))
    gbPrinter.PrintArrayLine "TABLE"
    Cumul = Cumul + Val(List1(1).List(I)) * Val(List1(2).List(I))
    gbPrinter.SetVariable "TOTAL", Cumul
    Next I
    gbPrinter.PrintVarContent "TOTAL"
    gbPrinter.Termine
    gbPrinter.CloseReport
    Set gbPrinter = Nothing
    End Sub

    Private Sub GenereEtatStock()
    Dim I As Integer
    Dim R As Integer
    Dim Cumul As Currency

    gbPrinter.SetVariable "NOMRAYON", "Tous rayons ensembles"
    gbPrinter.SetVariable "DATEIMP", Now()
    Cumul = 0
    For R = 0 To 2
    ChargeListe R
    For I = 0 To List1(0).ListCount - 1
    gbPrinter.SetArrayVar "TABLE", "ARTICLE", List1(0).List(I)
    gbPrinter.SetArrayVar "TABLE", "QUANTITE", CInt(Val(List1(1).List(I)))
    gbPrinter.SetArrayVar "TABLE", "PRIX", CDbl(Val(List1(2).List(I)))
    gbPrinter.SetArrayVar "TABLE", "VALO", CDbl(CInt(Val(List1(1).List(I))) * CDbl(Val(List1(2).List(I))))
    gbPrinter.PrintArrayLine "TABLE"
    Cumul = Cumul + Val(List1(1).List(I)) * Val(List1(2).List(I))
    gbPrinter.SetVariable "TOTAL", Cumul
    Next I
    Next R
    gbPrinter.PrintVarContent "TOTAL"
    gbPrinter.PrintVariable "NOMRAYON", "Tous rayons ensembles"
    gbPrinter.PrintVariable "DATEIMP", Now()
    gbPrinter.Termine
    gbPrinter.CloseReport
    Set gbPrinter = Nothing
    End Sub

    Private Sub ChargeListe(index As Integer)
    List1(0).Clear
    List1(1).Clear
    List1(2).Clear
    Select Case index
    Case 0
    List1(0).AddItem "Réfrigérateur 200L"
    List1(0).AddItem "Réfrigérateur 250L"
    List1(0).AddItem "Lave linge X45F9"
    List1(0).AddItem "Seche Linge ZK28"
    List1(0).AddItem "Sèche Linge ZH56"
    List1(0).AddItem "Cuisinière Lap Top 25"
    List1(0).AddItem "Four micro onde ZX32"
    List1(1).AddItem "3"
    List1(1).AddItem "1"
    List1(1).AddItem "5"
    List1(1).AddItem "7"
    List1(1).AddItem "2"
    List1(1).AddItem "1"
    List1(1).AddItem "12"
    List1(2).AddItem "295.00 €"
    List1(2).AddItem "345.00 €"
    List1(2).AddItem "337.00 €"
    List1(2).AddItem "195.00 €"
    List1(2).AddItem "246.00 €"
    List1(2).AddItem "650.00 €"
    List1(2).AddItem "75.00 €"
    Case 1
    List1(0).AddItem "Téléviseur 70 cms"
    List1(0).AddItem "Téleviseur Plat 50 cms"
    List1(0).AddItem "Téléviseur 90 cms"
    List1(0).AddItem "Lecteur CD"
    List1(0).AddItem "Chaine HIFI compacte"
    List1(0).AddItem "Téléviseur Plat 100 cms"
    List1(0).AddItem "Baladeur CD MP3"
    List1(0).AddItem "Téléviseur 70 cms"
    List1(0).AddItem "Téleviseur Plat 50 cms"
    List1(0).AddItem "Téléviseur 90 cms"
    List1(0).AddItem "Lecteur CD"
    List1(0).AddItem "Chaine HIFI compacte"
    List1(0).AddItem "Téléviseur Plat 100 cms"
    List1(0).AddItem "Baladeur CD MP3"
    List1(1).AddItem "3"
    List1(1).AddItem "1"
    List1(1).AddItem "5"
    List1(1).AddItem "7"
    List1(1).AddItem "2"
    List1(1).AddItem "1"
    List1(1).AddItem "12"
    List1(1).AddItem "3"
    List1(1).AddItem "1"
    List1(1).AddItem "5"
    List1(1).AddItem "7"
    List1(1).AddItem "2"
    List1(1).AddItem "1"
    List1(1).AddItem "12"
    List1(2).AddItem "315.00 €"
    List1(2).AddItem "345.50 €"
    List1(2).AddItem "425.00 €"
    List1(2).AddItem "175.00 €"
    List1(2).AddItem "750.00 €"
    List1(2).AddItem "1495.00 €"
    List1(2).AddItem "75.00 €"
    List1(2).AddItem "315.00 €"
    List1(2).AddItem "345.50 €"
    List1(2).AddItem "425.00 €"
    List1(2).AddItem "175.00 €"
    List1(2).AddItem "750.00 €"
    List1(2).AddItem "1495.00 €"
    List1(2).AddItem "75.00 €"
    Case 2
    List1(0).AddItem "Caméscope CH54"
    List1(0).AddItem "Caméra numerique VD56"
    List1(0).AddItem "Apareil photo numérique 35X135 8M Pixel"
    List1(0).AddItem "Projecteur Multi Fonction"
    List1(0).AddItem "Ensemble Ecran-Lecteur-Graveur DVD"
    List1(0).AddItem "Ensemble Home Cinéma"
    List1(0).AddItem "Lecteur DVD"
    List1(1).AddItem "3"
    List1(1).AddItem "1"
    List1(1).AddItem "5"
    List1(1).AddItem "7"
    List1(1).AddItem "2"
    List1(1).AddItem "1"
    List1(1).AddItem "12"
    List1(2).AddItem "295.00 €"
    List1(2).AddItem "345.00 €"
    List1(2).AddItem "337.00 €"
    List1(2).AddItem "195.00 €"
    List1(2).AddItem "246.00 €"
    List1(2).AddItem "650.00 €"
    List1(2).AddItem "75.00 €"
    End Select
    Command1.Enabled = True
    Command2.Enabled = True
    End Sub
     

    Un petit "Run" et cela devrait fonctionner dès l'instant où tout est là ou cela doit être ...

    Bon courage.