Variable conditionelle publique dépacement de capacité de 64 ko

Résolu
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 - 12 août 2011 à 13:04
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 - 13 août 2011 à 22:48
Bonjour à tous

J'ai suivi le TUTO sur ce site sur les variables conditionnelles.
Dans ce dernier il est dit que pour qu'elles soit PUBLIC la seule solution est de les entrer dans le panneau des projets.

C'est ce que j'ai fait, mais j'en ai une certaine quantité et maintenant VB6 n'en veut plus, en me mettant le message d'erreur "Une donnée fixe ou statique ne peut dépasser 64 Ko"

Il y a t'il un moyen de contourner cette restriction, si je veux les garder en PUBLIC ???

Merci et bonne journée

17 réponses

cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
12 août 2011 à 22:48
VB ne compile pas les fonctions non utilisées du projet (il ne fait que vaguement regarder si la syntaxe est respectée). Donc pas besoin de toutes ces variables de compilation conditionnelle . Si tu y tiens toujours, deux solutions se présentent : grouper les fonctions inutiles dans un module et exclure ce module du projet ou entourer le code de chaque fonction inutile avec un #If FONCTIONS_INUTILES .

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
12 août 2011 à 14:09
Bonjour,

Ton message manque cruellement de précisions précieuses.
Quelle est la variable qui pose problème ?
Précise-nous plus particulièrement si elle est de type String. Et si oui : précise également si elle est un élément d'une variable de type personnalisé (structure), d'un tablkeau dynamique, etc ...
Le mieux est que tu nous montres la déclaration de cette variable.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
12 août 2011 à 14:45
Bonjour UCFOUTU

C'est un peu compliqué alors j'avais essayé de ne pas trop vous embrouiller, apparemment c'est loupé

Donc precisement j'ai un truc comme 100 a 200 fonctions qui sont toutes rangées dans des modules simples selon leurs utilités

Module_Fonctions_Fichier.bas
Module_Fonctions_Affichage.bas
Module_Fonctions_Fenetres.bas
Etc ....

Seulement je n'ai pas toujours besoin de toutes ces fonctions, donc j'ai mis dans chacune d'elles une condition pour le debugger.

Example :
Public Function FichierExiste(ByVal vsPath As String) As Boolean

 #If FichierExiste =  1 Then  
  FichierExiste = (GetFileAttributes(vsPath) <> &HFFFFFFFF)
 #End If
  
End Function


Ces modules sont communs a toutes mes applications, alors lorsque je créé une nouvelle appli, je declare dans le projet la constante conditionnelle #FichierExiste comme ceci FichierExiste 1:AutreFonction 1: etc ...

Seulement apparement la longueur de la phrase dans le gestionnaire de projet est limitée et toutes mes declarations mises bout à bout, font que je ne peut plus en rajouter, car VB me donne cette erreur des que je depasse le Xieme caractere

Dans le VPB j'ai regardé et la pharse est certe longue, mais est tres loin de faire 64 Ko

Donc, je ne sais plus trop comment m'y prendre pour pouvoir declarer toutes mes constantes sans etre limité.
J'ai essayé de modifier directement la ligne CondComp= dans le VPB mais le meme message d'erreur apparait

Fait un essai entre cette phrase dans les declaration de constantes PUBLIC du projet (2e onglet "Argument de compilation conditionelle") ça devrait marcher :
EnvoiMailLotus  1 : IsLoaded 1 : SupCaracCabalistique = 1 : ExtractFileName = 1 : BoiteDialogueEnregistrerFichier = 1 : ComplementAscII = 1 : BoiteDialogueOuvrirFichier = 1 : DeconnecteExtra_L = 1 : DeconnecteOLE_L = 1 : PositionneCurseurExtra_L = 1 : RemonteBarreTacheExtra_L = 1 : FermeTraceur = 1 : EcrisTraceur = 1 : TempArret = 1 : FormStayOnScreen = 1 : AttenteExtra_L = 1 : EffaceLigneExtra_L = 1 : EcrisLigneExtra_L = 1 : ValideExtra_L = 1 : CommandeExtra_L = 1 : PremierPlan = 1 : LisLigneExtra_L = 1 : AnnulExtra_L = 1 : NomUtilisateur = 1 : DescendBarreTacheExtra_L = 1 : ConnecteExtra_L = 1 : OuvreSessionExtra_L = 1 : LanceExtra_L = 1 : OuvreTraceur = 1 : IsReference = 1 : ClipBoard_SetData = 1 : LectureClefBDR = 1 : ModifieValeurClefBDR = 1 : ChemRepPack = 1 : FichierExiste = 1 : ERA_End = 1 : DeComplementAscII = 1 : StringField = 1 : SkinForm = 1 : ChargementConfigExtra = 1 : Dec = 1 : DesactiveMsgBoxFermeture = 1 : SessionEnIndexTGC = 1 : OsVista = 1 : ChargementFichiers = 1


Puis maintenant, essaie de rajouter par exemple au tout debut :

CetteConstanteConditionnelle = 1:

Et bien la...ça plante
0
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
12 août 2011 à 14:47
Voici la ligne complete car le site ne l'a pas prise

EnvoiMailLotus 1 : IsLoaded 1 : SupCaracCabalistique = 1 : ExtractFileName = 1 : BoiteDialogueEnregistrerFichier = 1 : ComplementAscII = 1 : BoiteDialogueOuvrirFichier = 1 : DeconnecteExtra_L = 1 : DeconnecteOLE_L = 1 : PositionneCurseurExtra_L = 1 : RemonteBarreTacheExtra_L = 1 : FermeTraceur = 1 : EcrisTraceur = 1 : TempArret = 1 : FormStayOnScreen = 1 : AttenteExtra_L = 1 : EffaceLigneExtra_L = 1 : EcrisLigneExtra_L = 1 : ValideExtra_L = 1 : CommandeExtra_L = 1 : PremierPlan = 1 : LisLigneExtra_L = 1 : AnnulExtra_L = 1 : NomUtilisateur = 1 : DescendBarreTacheExtra_L = 1 : ConnecteExtra_L = 1 : OuvreSessionExtra_L = 1 : LanceExtra_L = 1 : OuvreTraceur = 1 : IsReference = 1 : ClipBoard_SetData = 1 : LectureClefBDR = 1 : ModifieValeurClefBDR = 1 : ChemRepPack = 1 : FichierExiste = 1 : ERA_End = 1 : DeComplementAscII = 1 : StringField = 1 : SkinForm = 1 : ChargementConfigExtra = 1 : Dec = 1 : DesactiveMsgBoxFermeture = 1 : SessionEnIndexTGC = 1 : OsVista = 1 : ChargementFichiers = 1
0

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

Posez votre question
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
13 août 2011 à 10:01
VB ne compile pas les fonctions non utilisées du projet

Aaaah!!! je ne le savais pas

Effectivement si tel est le cas, je n'ai pas besoin de toute cette artillerie.
Ce comportement est étonnant car ce n'est pas le cas de tous les compilateurs d'autres langages

Merci de ta reponse
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
13 août 2011 à 10:55
C'est à peu près la seule "optimisation" de VB6 parce que pour le reste ... Quelqu'un qui a l'habitude du C/ASM verrait le code généré, c'est la mort direct

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
0
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
13 août 2011 à 11:05
C'est vrai ce que tu dis

J'ai souvent entendu dire que pour avoir un logiciel quasi incracable il suffit de le coder en VB
Que les Hackers se tirait les cheveux quand ils mettaient le nez dans l'ASM

Quand j'pense comme je connaissais pas cet optimisation, j'me suis tapé un rajout dans chacune de mes fonctions dans tous mes modules communs a toutes les applis, une condition qui m'oblige a "activer" la fonction avant de l'utiliser, j'ai passé une journée a faire ça, entre la recherche et la modif

J'suis tellement habitué a ce que VB ne sache pas faire telle ou telle chose que certains langages font "finger in the tarin" que j'me suis même pas posé la question que pour une fois il saurait faire quelque chose que les langages bas niveaux ne savent pas faire

Merci beaucoup de cette combine, par curiosité, j'essaierais de compiler un programme n’appelant qu'une de mes fonctions, et un autre avec 10 et regarder si la taille est différente.
Si j'avais été malin le contrôle est simple, j'aurais du le faire avant, ça m'aurait gagné un temps precieux.
Mais encore une fois..c'est pas souvent que VB m’épate

Je te souhaite une excellente journée
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
13 août 2011 à 12:32
Quasi-incrackable je dirais pas, surtout que les fonctions du runtime portent des noms plutôt explicites donc ce n'est pas très compliqué de savoir ce que fait telle ou telle sub/fct. Malheureusement tu pourrais être étonné de ne pas voir changer la taille de ton programme lorsque tu retires une fonction (je viens de tester). Pourquoi ? Mystère ! Bonne journée à toi aussi, et content de voir que VB6 continue à être utilisé

VB.NET is good ... VB6 is better
0
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
13 août 2011 à 12:56
Malheureusement tu pourrais être étonné de ne pas voir changer la taille de ton programme lorsque tu retires une fonction (je viens de tester)

Peut être pas sur une fonction ??
J'essaierais par exemple de compiler avec une seule, et avec 50...
Si ça ne change pas, cela mettra a mal ta théorie
Puis après, vu que j'me suis donné la peine de "Conditionaliser" (Joli ce nouveau mot ) chacune de mes fonctions, je les "supprimerais" de la compilation
Si cette fois ça change rien...bah la j'vois pas

Bonne journée à toi aussi, et content de voir que VB6 continue à être utilisé

Oui au début, je ne jurais que par lui, et j'aimais pas en entendre dire du mal
Mais en fait...je crois que ceux qui en disent que du bien, ne sont pas des programmeurs au sens strict du terme

C'est sur que celui qui sait coder en C, ne peut quand même pas apprécier les liberté que VB prend avec les formats de variables, de tableaux (Safearray en tete), les appels d'API, etc...

Donc cela me rassure..le fait que je commence a en dire du mal, me prouve que je commence à progresser dans la programmation

Il reste quand même comme son ancienne femme avec qui on a divorcé....on a fait nos premiers "attouchements" (De clavier) ensembles, connus nos premières "excitations", nos premières jouissances ensemble, tous les deux seuls parfois dans une chambre face a un écran...et ça...on ne peut l'oublier

Il reste donc un peu dans nos/mon cœur...en n'oubliant pas que la haine est parfois le revers de l'amour

Et de plus VB6 n'est pas prêt de mourir, et ceci pour une raison toute simple....un langage encore plus "évolué" que lui...j'ai nommé le grand VBA, qui règne dans des millions de bureaux en maitre incontesté, sous le nom que je déteste de MACRO.

Avec cette daube tout le monde se prend pour le programmeur du coin
Faut reconnaitre qu'avec un simple EXCEL on peut en faire des choses....mais de la a appeler ça de la programmation.
Autant appeler un mec qui met un disque un musicien

Enfin...on ne peut pas en vouloir aux amateurs de vouloir jouer dans la cour des grands.
C'est ce que je fais tous les jours...au grand malheur de ces derniers

Bon weekend a toi aussi, et encore merci de cette conversation plus qu’intéressante
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
13 août 2011 à 14:09
Euh ... Là je reteste pour essayer de comprendre pourquoi la taille ne change pas et je retrouve ma fonction et le paramètre de MsgBox. Il l'avait mis en Unicode, du coup je l'avais pas vu (recherche de texte dans Total Commander, par défaut, c'est ASCII. Donc si on pense pas à vérifier aussi en Unicode, on trouve pas) Donc retour aux solutions que j'ai proposées càd gros IF ou module(s) exclus du projet. Tu peux aussi les regrouper par familles (ce qui te ferait bcp moins de VCC). En tous cas VC++ 2005 fait cette optimisation. On dirait queVB6 utilise le compilo de VC6, il serait peut-être possible d'activer une option d'optimisation qui supprimerait les fonctions inutilisées.

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
0
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
13 août 2011 à 14:21
Alors si j'ai bien compris, VB6 compile bien toutes les fonctions..pas que celles qu'on utilise ???
Donc la bonne nouvelle c'est que j'ai pas bossé pour rien.

Pour l'activation d'optimisation, je vais pas me lancer dans un truc que je comprend pas, deja que je comprend pas grand chose.
Déjà une fois j'suis parti sur une combine pour faire faire a VB6 des DLL standard...et j'me suis retrouvé avec une semaine de perdu et des DLL ni chien, ni loup, donc les modif de VB6 je les laisse a crosoft, ile ne fait bien assez comme ça

C'est compliqué, je ne peux pas bouger les fonctions, car les modules sont utilisés par plein de programmes, donc si je regroupe une fonction elle bouge pour tout le monde

C'est pas grave...je vais trouver une combine pour rétrécir la longueur de la ligne de déclaration PUBLIC qui apparemment ne doit pas dépasser 1024 octets

Je te remercie encore de ton aide
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
13 août 2011 à 14:34
Bonjour,
et indépendamment du propos même de tes variables de compilation conditionnelle (de manière générale, donc) :
evite tout simplement tes lignes à rallonge avec utilisatio bn des :
toto 1 : titi 3 : blabla = "aaa" :.... etc ...
s'étale "à rallonge" et peut s'écrire (sans ces rallonges) :
toto = 1
titi = 3
blabla = "aaa"
...
etc ...


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
13 août 2011 à 15:43
@ucfoutu : Malheureusement pas le choix, on ne peut les définir que sur une ligne dans la fenêtre de propriétés du projet (VB6, je le rappelle). C'est bien mieux géré en VB.NET (lien). Les lignes à rallonge peuvent parfois être utiles et plus faciles à lire (sauf quand tu as 40 commandes à la suite - là ça commence à faire trop). Exemple : le code d'un bouton "Suivant" en VBA, une ligne avec 3-4 commandes, tu vois ce que ça fait et ça ne t'embrouille pas. Après ça chacun sa façon de coder, du moment qu'on parvient à se relire 3 ans après ...

Ca n'irait pas si tu utilisais une VCC par module ? Ou ne pas inclure ceux que tu n'utilises pas ? Je pense que ce serait bien plus simple ! Perso, j'ai un dossier Modules avec dedans tout ce qui pourrait m'être utile et quand j'ai un nouveau projet, je copie ce dont j'ai besoin en supprimant ce dont je ne me servirai pas. Je sais à chaque fois où trouver ce dont j'ai besoin et ça m'évite de devoir réinventer l'eau tiède (en risquant à chaque fois d'avoir plus de code à déboguer) ... Par contre, il faut absolument que les fonctions soient testées. Sinon il faut changer dans le projet où on travaille, dans le repository et dans tous les autres projets qui utilisent la/les fonctions.

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
0
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
13 août 2011 à 19:52
C'est bien mieux géré en VB.NET

Ouf...Encore une chose que crosoft a corrigé avec .NET
Faudra un jour que j'ai le courage de m'y mettre...

Merci à vous deux de vos conseils
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
13 août 2011 à 21:39
Perso je suis pas trop pour .NET (mes dernières applis sont en VB6/VBA/PHP). Le seul truc que je lui reproche c'est le framework trop lourd. Minimum 200Mo pour faire tourner un Hello World VB6 c'est moins de 4Mo (sans le MDAC qui est installé minimum depuis Win2000). Point de vue productivité je sais pas, mais avec VB6/VBA on peut tout faire (pour ce qui est de la gestion).

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
0
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
13 août 2011 à 22:17
C'est sur, d'ailleurs dans les bureaux ils ne savent même pas ce qu'est .NET

J'avais peur que avec les OFFICE 2007/2010 ils changent le VB6 pour le VB.NET dans la gestion des macros.

Mais en fait non.
Je pense qu'a terme VB6 ne sera plus que le VBA des OFFICES.

Peut être même que dans des années y'aura des jeunes bureaucrates qui diront : "VB6 ???tu veut dire VBA !!!"

Tu as raison pour la taille de .NET
Plus ça va et plus, crosoft a la folie des grandeurs.
C'est aussi une des raisons qui m'a fait ne pas l'utiliser, sans parler de sa complexité bien sur
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
13 août 2011 à 22:48
Tout à fait d'accord avec toi ... Il existe déjà un moyen de faire des addons Office en .NET au lieu de VBA mais c'est clair qu'ils ne peuvent pas se permettre de supprimer VBA (sauf s'ils ont envie de se retrouver en faillite ). Autant développer une application métier en VB6 est un enfer, autant faire ça en VBA Access prend 10x moins de temps vu qu'on ne se concentre plus sur des trucs pénibles comme la liaison form/données (d'ailleurs, ça devrait pas être très fun de simuler des sous-sous-formulaires en VB6 et les filtres sur chaque champ/case/combo)

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
0
Rejoignez-nous