Comportement différent dans l'éditeur et en exécutable

Résolu
jdddeschamps Messages postés 13 Date d'inscription jeudi 18 décembre 2008 Statut Membre Dernière intervention 23 mars 2009 - 23 mars 2009 à 00:20
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 23 mars 2009 à 10:26
C'est étrange ce qui m'arrive ; voici mon code :
Private Sub MDIForm_Load()

Dim i As Integer
Dim hwndHelp As Long

frmScope.Left = 0
frmScope.Top = 1755
frmScope.Show
Call Initialisation
frmElab.Show

end sub

dans initialisation, je teste la base de donnée et j'ouvre un msgbox en cas d'erreur puis je propose de la réparer.
dans frmscope, un timer ouvre la base de donnée.

quand je teste le code dans l'éditeur VB6, tout va bien, j'ai le temps de réparer la base de données : le code du timer ne s'exécute pas tant que l'opérateur n'a pas répondu aux msgbox successifs.

quand je compile et que je crée l'exe puis que je le lance, le code du timer s'exécute avant que l'opérateur ait le temps de répondre aux msgbox et de réparer la bdd !

Quelqu'un a-t-il une explication et connait-il un moyen :
soit de rendre l'exécution identique dans l'éditeur et sous forme d'exe ;
soit d'interdire l'éxecution du timer temps que la procédure initialisation n'est pas finie.

Ma solution, si je n'ai pas de meilleure réponse, est de créer une variable publique initialisation_OK que les différents timer de l'application vont tester avant d'exécuter leur code.

merci

7 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
23 mars 2009 à 06:21
surtout que tu as mis un MsgBox... l'user répond a son rythme.

tu pourrais lancer jetcomp.exe. un petit utilitaire Microsoft dispo sur leur site.
compresse et répare les bases access très efficacement.

même le lancer a chaque fermeture de ton application, pourquoi pas ?
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
23 mars 2009 à 02:15
Salut
Eh bien fait ton Init avant de lancer les formes qui vont utiliser ta DB.
Essyer de synchronoser des évènements est audacieux.
Il vaut mieux se baser sur les états des objets (State pour une connexion), que sur du timing.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
jdddeschamps Messages postés 13 Date d'inscription jeudi 18 décembre 2008 Statut Membre Dernière intervention 23 mars 2009
23 mars 2009 à 09:58
Effectivement,
J'avais essayé de coller l'init avant le frmscope.show, mais cela ne suffit pas, il fallait le coller avant toute référence à une propriété de frmscope (.top, width, etc) car je pense que la méthode load s'exécute dès l'appel à une propriété de la feuille ce qui déclenche le timer.
quels sont les états des objets ? ce dont tu viens de parler comme une feuille chargée ou non chargée ?
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
23 mars 2009 à 10:09
oui, une reference a une propriété déclenche le chargement de la Form

tu peux également jouer avec la propriété Enabled de ton Timer... et ainsi ne pas le démarrer au chargement de la Form, mais plus tard...

ou au pire, tester la propriété State de ta connection, au début de ton Timer, avant de jouer avec ta base de données non initialisée.

NB. Si l'init fais reference aux propriétés de ta form, c'est que tu as mal concu la chose. Il ne devrait pas y avoir de dépendance à ce niveau là, je pense
0

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

Posez votre question
jdddeschamps Messages postés 13 Date d'inscription jeudi 18 décembre 2008 Statut Membre Dernière intervention 23 mars 2009
23 mars 2009 à 10:18
jetcomp.exe

C'est vrai, mon idée n'était pas judicieuse : il s'agissait de tester la bdd à l'ouverture puis à exécuter jetcomp.exe si nécessaire après accord de l'opérateur.
Mieux vaut tout simplement exécuter jetcomp.exe au query unload et systématiquement à l'ouverture.
Parfois mon application plante en cours de route sur bdd corrompue. au redémarrage de l'application, jetcomp.exe réparera la bdd systématiquement.
J'ai déjà fait le ménage dans les procédures pour systématiquement fermer les rst et les databases (http://support.microsoft.com/kb/283849/fr).

Le problème pour jetcomp.exe, c'est qu'il va falloir :
- l'installer dans le dossier système ;
- installer vba32.dll et vbar332 pour windows NT (je n'arrive plus à trouver l'article de microsoft qui le dit) ;
- le retrouver dans le dossier système lors de l'exécution ;
- le lancer en shell.

Au boulot
0
jdddeschamps Messages postés 13 Date d'inscription jeudi 18 décembre 2008 Statut Membre Dernière intervention 23 mars 2009
23 mars 2009 à 10:21
Cela dit, je m'étonne que l'application n'ait pas le même comportement dans l'éditeur que compilé sous forme d'exécutable.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
23 mars 2009 à 10:26
suffit pas de le placer dans le repertoire de ton appli ? j'ai jamais eu de soucis avec... te faut juste un bon MDAC2.8
0
Rejoignez-nous