Comment qu'on fait ?

Résolu
pjouy Messages postés 110 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 18 mai 2009 - 19 sept. 2005 à 22:37
pjouy Messages postés 110 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 18 mai 2009 - 23 sept. 2005 à 19:50
Bonjour,

J'écris du code en VB pour formater mon texte pour l'impression.
Le problème, c'est que ce code fait gonfler l'exécutable de mon application à vue d'oeil (page complexe oblige).

Est-il possible de déporter ce code dans un fichier externe (un OCX ou une DLL peut-être) et de l'appeler, un peu de la même manière qu'un module ?

Et si oui, comment on fait ??

Merci beaucoup d'avance !

21 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
22 sept. 2005 à 21:29
ok.....

pour tester, lâche ton projet

nouveau projet, EXE Standard
dans la Form1 (par défaut), tu poses un bouton (par défaut), puis tu copies ce code :

Private MaDll As New Cls_Test
'
'
Private Sub Command1_Click()
Set MaDll = New Cls_Test
Set MaDll.MyFrm = Me
Call MaDll.MyCommandPrinter
Set MaDll = Nothing
End Sub

ensuite,
menu fichier > ajouter un projet, DLL ActiveX

tu renommes la classe par défaut en Cls_Test et tu y copies ce code :

Private mFrm As Object
'
'
Public Property Get MyFrm() As Object
MyFrm = mFrm
End Property
Public Property Set MyFrm(ByVal new_mFrm As Object)
Set mFrm = new_mFrm
End Property
'
'
Public Sub MyCommandPrinter()
mFrm.Command1.Caption = "classe valide"
End Sub

là, tu fermes tes fenêtres (sauf VB), tu sélectionnes ton projet1 (EXE), menu projet > références et tu coches ta dll (projet2)

F5, click sur le bouton, eh hop, çà marche

je viens de le refaire en même temps pour être certain.

donc pour toi, tu n'auras plus qu'à changer mFrm.Command1.Caption = "classe valide" par ce que tu veux, comme entre autres :

Printer.Print mFrm.Label_PeriodeDebut.Caption & " " & mFrm.DTPicker_PeriodeDebut.Value

en l'attente
PCPT
3
pjouy Messages postés 110 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 18 mai 2009
19 sept. 2005 à 22:46
Ah, j'oubliais : actuellement, ce code est dans un bouton, et donc j'imprime les contrôles que je veux qui sont dans la Form en cours. Est-il aussi possible de faire comprendre à la dll que le code qui est dans celle-ci correspond à ma Form ?
Ca éviterait de faire un Call de 3 kilomètres de long avec 10 000 variables !

Merci encore
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
19 sept. 2005 à 23:08
salut,
possible.... là, il faudrait ton code pour savoir.
dans le principe, sans doute, mais si ton Click fait référence à "10000" variables, et que tu ne veux pas les énumérer en appel, si elles sont privées, çà semble compromis.....

colle un morceau de code, çà sera plus facile de se rendre compte ;)
PCPT
0
pjouy Messages postés 110 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 18 mai 2009
20 sept. 2005 à 09:07
Salut,

En fait, il y a beaucoup de contrôles qu'il faut imprimer, c'est surtout ça qui m'inquiète... (est-ce que la DLL prendre les contrôles de ma Form ou me renvoyer une erreur). Bref, voilà un tout petit bout de code, le reste est dans le même ordre d'idée.

Private Sub Command_ImprimerEAA_Click()
On Error GoTo ErreurImpression 'Au cas où il y ait un pb à l'impression (par exemple s'il n'y a pas d'imprimante)
'Définition des paramètres de la feuille
Printer.FontName = "Arial"
Printer.PrintQuality = -3 'qualité économie
Printer.PaperSize = vbPRPSA4 'format papier A4
Printer.Orientation = 1 'mode portrait
Printer.ScaleMode = vbMillimeters 'calage en millimètres
GoSub Entete 'Et en plus j'ai des Sub !!
'Page 1 ###################################################
Page = 1
Printer.FontSize = 22 'taille de la police
Printer.FontBold = True
Printer.ForeColor = &HE0E0E0 'gris clair
Printer.CurrentX = 21
Printer.CurrentY = 32
Printer.Print Label_Titre.Caption
Printer.ForeColor = vbBlack
Printer.CurrentX = 20 'Position X
Printer.CurrentY = 32 'Position Y
Printer.Print Label_Titre.Caption
Printer.FontSize = 14
Printer.FontBold = False
Printer.CurrentX = 25
Printer.CurrentY = 80
Printer.Print Label_PeriodeDebut.Caption & " " & DTPicker_PeriodeDebut.Value
Printer.CurrentX = 25
Printer.CurrentY = 90
Printer.Print Label_PeriodeFin.Caption & " " & DTPicker_PeriodeFin.Value
Printer.FontSize = 16 Printer.CurrentX 30: Printer.CurrentY 115
Printer.Print "Nom : " & NomPrenom.Text Printer.CurrentX 30: Printer.CurrentY 128

......

Voilà
Merci pour ton aide
0

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

Posez votre question
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
20 sept. 2005 à 11:28
re,
ta fonction (dans un dll activex) sera une automatisation.

si ton but est de, par exemple, ne PAS imprimer toutes les valeurs de la form (des Label, Textbox, etc...), il faudra soit tous les passer en param, soit passer ceux qui ne doivent pas être imprimés.

ton code "gonfle consédérablement l'exe", je suppose donc que tu l'appelles à plusieurs occasions...
si tu penses (et tu es le mieux placé) qu'il est possible de mettre le code en dll, c'est qu'il l'est aussi en module, appelable à différents endroits, donc pas tant de place que çà.

c'est là ou je bloque. tu veux déporter le code, simplement? une sorte d'include en fait....

et tes appels seraient toujours la même Form?

j'en demande beaucoup
PCPT
0
pjouy Messages postés 110 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 18 mai 2009
20 sept. 2005 à 20:35
Salut

Non, ce code n'est appelé qu'une seule et unique fois, lorsqu'on appuie sur le bouton qui va bien. Mais comme je crée des pages complexes (avec beaucoup de labels et textbox qui sont dans la form [qui est une forme d'assistant avec Précédent / Suivant avec des Frames] ), chaque nouvelle page fait prendre environ 30 à 50 ko à mon exécutable.

Mon idée était de le décharger un peu, et de mettre le code dans une DLL.

Maintenant, tu as vu une partie de mon code (qui résume très bien la globalité de ce que j'ai à imprimer)... Est-ce que, à ton avis, il est possible de le déporter de mon Command_Imprimer_Click vers une DLL (sans avoir à passer mes labels et textbox en variable) ?

Merci ;)
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
20 sept. 2005 à 21:05
si tu n'as cet appel que d'un seul bouton, alors oui, sans problème. mais à ta place, j'utiliserais un module de classe dans le projet. il sera instancié, pas la peine de dll...
PCPT
0
pjouy Messages postés 110 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 18 mai 2009
21 sept. 2005 à 00:49
Est-ce qu'un module de classe va me créer un fichier supplémentaire par rapport à l'exe ? Parce que c'est ce que je cherche au bout du compte...

Si je souhaite créer une DLL pour l'impression de ces pages, est-ce qu'un couper/coller tout bête de mon code peut suffir ? Ou bien y a-t-il des choses à changer ? De plus, est-ce qu'il ne va pas me sortir un truc du genre "objet non défini" quand je prendrai le texte d'un label dans ma form ?
Pardonne-moi toutes ces questions, mais je n'ai encore jamais fait de DLL...
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
21 sept. 2005 à 02:03
re,
pour faire tes tests, ajoute juste un module de classe dans ton projet (donc qui n'ajoutera rien en "externe" au programme, et donc qui ne créera pas la DLL finale que tu veux)

ensuite, pour la déclarer, dans ta Form
Dim MaDllMachin as New NOM_DE_TA_CLASSE

fait une fonction ou une procédure dans cette classe
Public Sub MyCommandPrinter(ByVal F as Form)

mets y le code de ton bouton en ajouter F. devant les contrôles correspondants
Printer.Print F.Label_Titre.Caption
...

ensuite pour l'appeler
Call MaDllMachin.MyCommandPrinter(Me)

et si çà fonctionne bien comme tu veux, il n'y aura plus qu'à créer une 2e projet (ActiveX), d'y déplacer ta classe, la mettre en public, et de la compiler

dispo au besoin
++
PCPT
0
pjouy Messages postés 110 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 18 mai 2009
21 sept. 2005 à 10:39
Re,

J'ai réussi à faire ce que tu m'as dit jusqu'à la création d'un 2ème projet DLL ActiveX. J'ai fait un copier/coller de mon module de classe. Mais je ne sais pas la mettre en Public. Effectivement, lorsque j'essaye de la compiler, il me dit "Des modules d'objets privés ne peuvent être utilisés dans les modules d'objets publics comme types renvoyés..."

J'y suis presque
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
21 sept. 2005 à 12:36
bon, j'avais commencé des imprim écrans, etc...
sûr de moi, en en fait, j'ai le même problème que toi.
et pareil en déclarant la fonction en Friend

continue à rechercher de ton côté, je te tiens également au courant
@+
PCPT
0
pjouy Messages postés 110 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 18 mai 2009
21 sept. 2005 à 14:19
Apparament, le problème vient du fait qu'il y a des variables passées dans les Public Sub. Si on les enlève, il veut bien compiler la DLL. Par contre, si on ne lui indique pas la Form où se trouvent les contrôles, il va y avoir un problème... Allô Houston ??
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
21 sept. 2005 à 15:12
bon, bah quand même !!!!!!

çà fonctionne chez moi.


' ------------
' dans la Form
' ------------

Private MaDll As New Cls_Test
'
'
Private Sub Command1_Click()
Set MaDll = New Cls_Test
Set MaDll.MyFrm = Me
Call MaDll.MyCommandPrinter
Set MaDll = Nothing
End Sub

' ----------------------
' dans le module, en dll
' ----------------------

Private mFrm As Object
'
'
Public Property Get MyFrm() As Object
MyFrm = mFrm
End Property
Public Property Set MyFrm(ByVal new_mFrm As Object)
Set mFrm = new_mFrm
End Property
'
'
Public Sub MyCommandPrinter()
mFrm.Command1.Caption = "classe valide"
End Sub


<SMALL> Coloration syntaxique automatique [AFCK]</SMALL>


tiens-moi au courant
PCPT
0
pjouy Messages postés 110 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 18 mai 2009
22 sept. 2005 à 21:12
Re [désolé pour le retard]

J'ai pas compris grand chose à ton code... et je m'emmêle les pinceaux avec tous les Frm...

Aurais-tu la gentillesse de m'expliquer à quoi tout ça correspond ?

Merci
0
pjouy Messages postés 110 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 18 mai 2009
22 sept. 2005 à 23:29
Je te remercie pour tes explications détaillées, mais j'avais déjà compris ce que tu m'avais dit de faire.

Ce que je comprends pas très bien, c'est comment fonctionne le code. Si je devine pas trop mal, on essaye de faire passer la variable par un objet...
C'est que j'aime bien comprendre le code que j'implémente, sinon on n'évolue pas
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
22 sept. 2005 à 23:51
la DLL va garder en référence la Form appelante, en tant que collection (particulièrement objet ici).
on instancie cet appel d'objet en privé, et c'est pour çà qu'on peut l'utiliser.
l'objet par lui-même ne peut pas être utilisé en public.

en comparaison, on pourrait dire qu'elle (la dll) considère la Form appelante comme un Item, et qu'elle ne travaille que sur ce dernier, et non pas sur le contenant total.

j'aurais du mal à mieux expliquer.....

en l'attente,
PCPT
0
pjouy Messages postés 110 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 18 mai 2009
23 sept. 2005 à 00:53
Ca marche !

Merci beaucoup

J'avoue juste que ce passage ne m'est pas très clair :

Public Property Get MyFrm() As Object
MyFrm = mFrm 'OK on récupère la variable
End Property
Public Property Set MyFrm(ByVal new_mFrm As Object)
Set mFrm = new_mFrm 'Mais ici ça sert à quoi, vu que la variable
'new_mForm n'est utilisée nulle part...
End Property
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
23 sept. 2005 à 01:09
ok, désolé :
le Get sert à ce que, à partir de la Form, tu puisses récupérer (donc relire) Madll.MyFrm (sachant que c'est bien un objet, pas une String)
et le Set, pour initialiser. donc la Form dit à la classe qu'elle reçoit une nouvelle valeur.
la classer reçoit la valeur (objet) temporaire, et l'enregistre ensuite dans sa variable (mFrm = paramètre renvoyé)

oui?

PCPT
0
pjouy Messages postés 110 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 18 mai 2009
23 sept. 2005 à 09:06
OK, merci beaucoup, c'est plus clair maintenant.

Donc, si à l'avenir j'ai d'autres variables à ajouter, il faut que je rajoute autant de Public Property Get et Set que de variables.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
23 sept. 2005 à 10:28
çà dépend tu cas de figure.
si t'as 50 string et que tu vas les traiter dans une même procédure, tu peux aussi déclarer un get/let (et pas Set pour des variables) en tableau

PCPT
0
Rejoignez-nous