OVH Cloud OVH Cloud

Moi, des bêtises ?

13 réponses
Avatar
Gloops
Bonjour tout le monde,

Ben c'est quoi que j'ai glandé ?
Parfois, quand je ferme le formulaire de mon application en mode de test
sous VB, au lieu de revenir proprement dans l'environnement de
développement comme d'habitude, je perds carrément le contrôle, avec
deux processus VB et un de mon application d'ouverts, et je suis obligé
de fermer l'un des processus à l'aide du gestionnaire de tâches, ce qui
ferme les trois ensemble. Au bout de trois ou quatre fois j'étais bien
dressé, j'avais fait une sauvegarde avant de lancer l'exécution.

Il m'a été proposé d'envoyer un compte-rendu à Microsoft, ce que j'ai
fait une fois, j'espère que je ne leur ai pas refilé à moudre un grain
moisi ...

Le formulaire comporte un WebBrowser.
C'est vrai qu'une autre application avec un WebBrowser un jour avait
fait un caprice (ne voulait carrément pas se lancer), mais d'autres
fonctionnent très bien.

Il faut quoi pour s'y retrouver ? Form_Unload ?

Private Sub Form_Unload(Cancel As Integer)
DB.Close
Set DB = Nothing
End Sub

La base a été ouverte dans Form_Load

Private Sub Form_Load()
Set DB =
DBEngine.OpenDatabase("C:\...(chemin)...\VB\Navigation\FavorisNav.mdb")
MajNb 'voir plus loin
End Sub

et bien sûr déclarée au niveau module, en plus d'une déclaration API

Private Declare Function ShellExecute Lib "shell32.dll" _
Alias "ShellExecuteA" ( _
ByVal hwnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long

Dim DB As Database



Sur cette base j'ouvre un jeu d'enregistrements et je le referme dans la
même procédure, comme par exemple là :

Private Sub MajNb()
Dim Rs As Recordset
Set Rs = DB.OpenRecordset("FavorisNav")
lblNbBase.Caption = Str$(Rs.RecordCount)
Rs.Close
Set Rs = Nothing
lblNb.Caption = Str$(ListView1.ListItems.Count)
End Sub

En ai-je dit assez ?

J'ai fermé le formulaire avec la petite croix rouge en haut à droite.

10 réponses

1 2
Avatar
Gloops
Ah oui, mais si je ne dis pas tout, personne ne va s'y retrouver, aussi.

L'un des boutons permet d'ajouter un commentaire dans la base, à l'aide
d'un formulaire réalisé à cet effet, vu que je n'ai pas su saisir un
commentaire multiligne à l'aide d'un InputBox.

Il m'a semblé avoir fermé proprement le formulaire de commentaires, mais
j'ai pu me tromper.

Les boutons de ce formulaire le cachent seulement, pour que la variable
publique soit disponible pour l'appelant, et c'est l'appelant qui ferme
par Unload (troisième ligne avant la fin de cmdCommentaire_Click).

L'ouverture en modal de frmCommentaires (par les paramètres de la
méthode Show) fait attendre la fin du traitement du commentaire par
l'utilisateur, le formulaire a été caché par ses boutons avant d'être,
si je ne m'abuse, déchargé par la procédure appelante.

Private Sub cmdCommentaire_Click()
Dim Rs As Recordset
Dim Commentaire As String

Set Rs = DB.OpenRecordset("SELECT * FROM FavorisNav WHERE URL='" + _
ListView1.ListItems(ListView1.SelectedItem.Index).SubItems(1) + "'")

'Commentaire = InputBox("Z'a'ez des commentaires à faire ?", , _
"" & Rs!Commentaire)

frmCommentaires.Show Modal:=1, OwnerForm:=Me
If frmCommentaires.Abandon = False Then
Commentaire = frmCommentaires.txtCommentaire
Rs.Edit
Rs!Commentaire = Commentaire
Rs.Update
ListView1.ListItems(ListView1.SelectedItem.Index).SubItems(2) =
Commentaire
End If
Rs.Close
Unload frmCommentaires ' <-- instruction stratégique ?
Set Rs = Nothing
ListView1.SetFocus
End Sub

Et le module de frmCommentaires :
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Public Abandon As Boolean

Private Sub cmdAnnuler_Click()
Abandon = True
Me.Hide
End Sub

Private Sub cmdOK_Click()
Abandon = False
Me.Hide
End Sub

Private Sub Form_Load()
txtCommentaire =
Form1.ListView1.ListItems(Form1.ListView1.SelectedItem.Index).SubItems(2)
End Sub

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Ah oui alors comme il y a plusieurs références au ListView de Form1, je
dois préciser qu'il comporte dans l'ordre une colonne titre, une colonne
URL, une colonne commentaire, et deux colonnes de dates.

Chargé par

Private Sub cmdCharge_Click()
Dim Max As Integer
Dim Rs As Recordset
ListView1.ColumnHeaders.Clear
Set Rs = DB.OpenRecordset("FavorisNav")
With Me.ListView1
.ColumnHeaders.Clear 'tiens je viens de voir que j'ai fait du zèle
'd'ailleurs .ListItems.Clear serait plus utile
' m'étonnerait quand même que ça soit qui me
' fasse perdre le contrôle
.View = lvwReport
.GridLines = True
.FullRowSelect = True

.ColumnHeaders.Add , , "Titre"
.ColumnHeaders.Add , , "URL"
.ColumnHeaders.Add , , "Commentaire"
.ColumnHeaders.Add , , "Dernière visite"
.ColumnHeaders.Add , , "Proch. visite"
While Not Rs.EOF
Set itmX = .ListItems.Add(, , "" & Rs!Titre)
'itmX.ForeColor = vbRed
'itmX.Bold = True
itmX.SubItems(1) = "" & Rs!URL
itmX.SubItems(2) = "" & Rs!Commentaire
itmX.SubItems(3) = "" & Rs!DerniereConnexion
itmX.SubItems(4) = "" & Rs!ProchaineConnexion
If Max < Len(Rs!URL) Then Max = Len(Rs!URL)
Rs.MoveNext
Debug.Print Len(itmX.SubItems(1))
Wend
.ColumnHeaders(2).Width = Max * 90
.ColumnHeaders(3).Width = 3030
.ColumnHeaders(4).Width = 1740
.ColumnHeaders(5).Width = 1200
End With
Rs.Close
Set Rs = Nothing
MajNb
ListView1.SetFocus
End Sub
Avatar
Gloops
A force d'y venir par petits bouts, je vais finir par tout dire.
D'ailleurs, je conclue sur une hypothèse.

Je travaille sur Windows XP Home SP1, il y a quelques jours toutes les
mises à jour proposées (autres que SP2) étaient installées,

avec VB6 SP6.

Les références du projet :
- Visual Basic for Applications (C:WINDOWSSystem32MSVBVM60.DLL)
Anglais / Standard
- Visual Basic runtime objects and procedures
(C:WINDOWSSystem32MSVBVM60.DLL3 : dixit la boîte références)
Anglais/Standard
- Visual Basic objects and procedures (C:Program FilesMicrosoft Visual
StudioVB98VB6.OLB) Anglais/Standard
- OLE Automation (C:WINDOWSSystem32stdole2.tlb) Standard
- Microsoft Internet Controls (C:WINDOWSSystem32shdocvw.dll) Standard
- Microsoft DAO 3.51 Object Library (C:Program FilesFichiers
communsMicrosoft SharedDAODAO35 ...) Standard
- Microsoft Internet Controls (C:WINDOWSSystem32shdocvw.oca) Standard

En le tapant je vois que j'ai mis deux références à shdocvw, est-ce
qu'elles peuvent se tirer dans les pattes ? Si je coche le composant
dans l'onglet Composants, est-ce que cela me dispense de cocher la
référence correspondante ?
Je vais en enlever une, puis-je m'attendre à ce que cela solutionne le
problème ?
Avatar
christophe-pasde
Bonjour,

J'ai pas tout saisi.

Mais d'une manière générale il faut ecrire dans le form unload

Set NomForm = nothing

Donc dans ton exemple : nomform= nom de ta feuille

Private Sub Form_Unload(Cancel As Integer)
DB.Close
Set DB = Nothing
Set NomForm = nothing
End Sub

Ceci permet d'être sur que l'objet form et ce qu'il contient est
détruit. Je crois que c'est un disfonctionnement de VB qui ne libére pas
tout en certaine occasions, y'a peut-être des gens ici qui on un lien
sur le sujet.


Christophe


Gloops a écrit :
Bonjour tout le monde,

Ben c'est quoi que j'ai glandé ?
Parfois, quand je ferme le formulaire de mon application en mode de test
sous VB, au lieu de revenir proprement dans l'environnement de
développement comme d'habitude, je perds carrément le contrôle, avec
deux processus VB et un de mon application d'ouverts, et je suis obligé
de fermer l'un des processus à l'aide du gestionnaire de tâches, ce qui
ferme les trois ensemble. Au bout de trois ou quatre fois j'étais bien
dressé, j'avais fait une sauvegarde avant de lancer l'exécution.

Il m'a été proposé d'envoyer un compte-rendu à Microsoft, ce que j'ai
fait une fois, j'espère que je ne leur ai pas refilé à moudre un grain
moisi ...

Le formulaire comporte un WebBrowser.
C'est vrai qu'une autre application avec un WebBrowser un jour avait
fait un caprice (ne voulait carrément pas se lancer), mais d'autres
fonctionnent très bien.

Il faut quoi pour s'y retrouver ? Form_Unload ?

Private Sub Form_Unload(Cancel As Integer)
DB.Close
Set DB = Nothing
End Sub

La base a été ouverte dans Form_Load

Private Sub Form_Load()
Set DB =
DBEngine.OpenDatabase("C:...(chemin)...VBNavigationFavorisNav.mdb")
MajNb 'voir plus loin
End Sub

et bien sûr déclarée au niveau module, en plus d'une déclaration API

Private Declare Function ShellExecute Lib "shell32.dll" _
Alias "ShellExecuteA" ( _
ByVal hwnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long

Dim DB As Database



Sur cette base j'ouvre un jeu d'enregistrements et je le referme dans la
même procédure, comme par exemple là :

Private Sub MajNb()
Dim Rs As Recordset
Set Rs = DB.OpenRecordset("FavorisNav")
lblNbBase.Caption = Str$(Rs.RecordCount)
Rs.Close
Set Rs = Nothing
lblNb.Caption = Str$(ListView1.ListItems.Count)
End Sub

En ai-je dit assez ?

J'ai fermé le formulaire avec la petite croix rouge en haut à droite.



Avatar
Gloops
Ah OK, je vais faire ça, merci. Set Form1 = Nothing, à la fin de
Form_Unload.

M'était pas encore arrivé, ce bazard.

J'ai un peu dilué, hein ?
C'est une application avec un WebBrowser et une ListView sur Form1, la
ListView est chargée à partir d'une base de données avec des adresses
web à consulter, pour que l'utilisateur fasse des commentaires dessus, à
charger à leur tour dans la base. Les commentaires sont saisis grâce au
deuxième formulaire, frmCommentaires.

(Pour plus de facilité un autre bouton de Form1 permet d'alimenter la
base de données à partir d'un fichier texte contenant des URL.)
_________________________________________________
christophe-pasde<> a écrit, le 08/06/2005 10:04 :
Bonjour,

J'ai pas tout saisi.

Mais d'une manière générale il faut ecrire dans le form unload

Set NomForm = nothing

Donc dans ton exemple : nomform= nom de ta feuille

Private Sub Form_Unload(Cancel As Integer)
DB.Close
Set DB = Nothing
Set NomForm = nothing
End Sub

Ceci permet d'être sur que l'objet form et ce qu'il contient est
détruit. Je crois que c'est un disfonctionnement de VB qui ne libére pas
tout en certaine occasions, y'a peut-être des gens ici qui on un lien
sur le sujet.


Christophe


Gloops a écrit :

Bonjour tout le monde,

Ben c'est quoi que j'ai glandé ?
Parfois, quand je ferme le formulaire de mon application en mode de
test sous VB, au lieu de revenir proprement dans l'environnement de
développement comme d'habitude, je perds carrément le contrôle, avec
deux processus VB et un de mon application d'ouverts, et je suis
obligé de fermer l'un des processus à l'aide du gestionnaire de
tâches, ce qui ferme les trois ensemble. Au bout de trois ou quatre
fois j'étais bien dressé, j'avais fait une sauvegarde avant de lancer
l'exécution.

Il m'a été proposé d'envoyer un compte-rendu à Microsoft, ce que j'ai
fait une fois, j'espère que je ne leur ai pas refilé à moudre un grain
moisi ...

Le formulaire comporte un WebBrowser.
C'est vrai qu'une autre application avec un WebBrowser un jour avait
fait un caprice (ne voulait carrément pas se lancer), mais d'autres
fonctionnent très bien.

Il faut quoi pour s'y retrouver ? Form_Unload ?

Private Sub Form_Unload(Cancel As Integer)
DB.Close
Set DB = Nothing
End Sub

La base a été ouverte dans Form_Load

Private Sub Form_Load()
Set DB =
DBEngine.OpenDatabase("C:...(chemin)...VBNavigationFavorisNav.mdb")
MajNb 'voir plus loin
End Sub

et bien sûr déclarée au niveau module, en plus d'une déclaration API

Private Declare Function ShellExecute Lib "shell32.dll" _
Alias "ShellExecuteA" ( _
ByVal hwnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long

Dim DB As Database



Sur cette base j'ouvre un jeu d'enregistrements et je le referme dans
la même procédure, comme par exemple là :

Private Sub MajNb()
Dim Rs As Recordset
Set Rs = DB.OpenRecordset("FavorisNav")
lblNbBase.Caption = Str$(Rs.RecordCount)
Rs.Close
Set Rs = Nothing
lblNb.Caption = Str$(ListView1.ListItems.Count)
End Sub

En ai-je dit assez ?

J'ai fermé le formulaire avec la petite croix rouge en haut à droite.





Avatar
christophe-pasde
RE,

de rien si ça solutionne ...
Une autre chose si je peux me permettre, c'est la gestion de la BD.

Il est mieux de ne faire qu'un accès à la base pour remplir le listview
dans une fonction spécifique, de fermer la base à la fin de la fonction.
De même pour une fonction qui enregistre les commentaires.

C'est plus mieux que de l'ouvrir sur Form_Load et de la fermer sur Unload.

Christophe

Gloops a écrit :

Ah OK, je vais faire ça, merci. Set Form1 = Nothing, à la fin de
Form_Unload.

M'était pas encore arrivé, ce bazard.

J'ai un peu dilué, hein ?
C'est une application avec un WebBrowser et une ListView sur Form1, la
ListView est chargée à partir d'une base de données avec des adresses
web à consulter, pour que l'utilisateur fasse des commentaires dessus, à
charger à leur tour dans la base. Les commentaires sont saisis grâce au
deuxième formulaire, frmCommentaires.

(Pour plus de facilité un autre bouton de Form1 permet d'alimenter la
base de données à partir d'un fichier texte contenant des URL.)
_________________________________________________
christophe-pasde<> a écrit, le 08/06/2005 10:04 :

Bonjour,

J'ai pas tout saisi.

Mais d'une manière générale il faut ecrire dans le form unload

Set NomForm = nothing

Donc dans ton exemple : nomform= nom de ta feuille

Private Sub Form_Unload(Cancel As Integer)
DB.Close
Set DB = Nothing
Set NomForm = nothing
End Sub

Ceci permet d'être sur que l'objet form et ce qu'il contient est
détruit. Je crois que c'est un disfonctionnement de VB qui ne libére
pas tout en certaine occasions, y'a peut-être des gens ici qui on un
lien sur le sujet.


Christophe


Gloops a écrit :

Bonjour tout le monde,

Ben c'est quoi que j'ai glandé ?
Parfois, quand je ferme le formulaire de mon application en mode de
test sous VB, au lieu de revenir proprement dans l'environnement de
développement comme d'habitude, je perds carrément le contrôle, avec
deux processus VB et un de mon application d'ouverts, et je suis
obligé de fermer l'un des processus à l'aide du gestionnaire de
tâches, ce qui ferme les trois ensemble. Au bout de trois ou quatre
fois j'étais bien dressé, j'avais fait une sauvegarde avant de lancer
l'exécution.

Il m'a été proposé d'envoyer un compte-rendu à Microsoft, ce que j'ai
fait une fois, j'espère que je ne leur ai pas refilé à moudre un
grain moisi ...

Le formulaire comporte un WebBrowser.
C'est vrai qu'une autre application avec un WebBrowser un jour avait
fait un caprice (ne voulait carrément pas se lancer), mais d'autres
fonctionnent très bien.

Il faut quoi pour s'y retrouver ? Form_Unload ?

Private Sub Form_Unload(Cancel As Integer)
DB.Close
Set DB = Nothing
End Sub

La base a été ouverte dans Form_Load

Private Sub Form_Load()
Set DB =
DBEngine.OpenDatabase("C:...(chemin)...VBNavigationFavorisNav.mdb")
MajNb 'voir plus loin
End Sub

et bien sûr déclarée au niveau module, en plus d'une déclaration API

Private Declare Function ShellExecute Lib "shell32.dll" _
Alias "ShellExecuteA" ( _
ByVal hwnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long

Dim DB As Database



Sur cette base j'ouvre un jeu d'enregistrements et je le referme dans
la même procédure, comme par exemple là :

Private Sub MajNb()
Dim Rs As Recordset
Set Rs = DB.OpenRecordset("FavorisNav")
lblNbBase.Caption = Str$(Rs.RecordCount)
Rs.Close
Set Rs = Nothing
lblNb.Caption = Str$(ListView1.ListItems.Count)
End Sub

En ai-je dit assez ?

J'ai fermé le formulaire avec la petite croix rouge en haut à droite.








Avatar
Gloops
christophe-pasde<> a écrit, le 08/06/2005 14:43 :
Il est mieux de ne faire qu'un accès à la base pour remplir le listview
dans une fonction spécifique, de fermer la base à la fin de la fonction.
De même pour une fonction qui enregistre les commentaires.



Ah bon ? Moi qui croyais bien faire en évitant d'ouvrir et fermer
plusieurs fois, histoire d'améliorer le temps de réponse ...
Avatar
Jean-Marc
"Gloops" a écrit dans le message de
news:42a7252e$0$3102$
christophe-pasde<> a écrit, le 08/06/2005 14:43 :
> Il est mieux de ne faire qu'un accès à la base pour remplir le listview
> dans une fonction spécifique, de fermer la base à la fin de la fonction.
> De même pour une fonction qui enregistre les commentaires.

Ah bon ? Moi qui croyais bien faire en évitant d'ouvrir et fermer
plusieurs fois, histoire d'améliorer le temps de réponse ...



Hello,

c'est effectivement un débat intéressant.
Pour ma part, l'expérience et la pratique m'ont montré que:
- Le plus secure est de bosser en transaction
- Connecter et déconnecter ne coûte pas si cher
- Que bien isoler ses unités de travail fait gagner du
temps et diminue les risques de perte de données

En bref, j'ouvre et je ferme en début et fin de fonctions.
J'englobe les traitements pour lesquels je veux être consistant
dans un Begintrans / Commit trans.

Ce que dis la s'applique à VB mais aussi à tout programme
mnipulant une BDD.

Pour le fun, j'avais écrit une petite nouvelle pour illustrer
les dangers de ne pas utiliser les transacations:
http://membres.lycos.fr/jeanmarcn/begintrans.htm


--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
Avatar
Jean-Marc
<HS>
Je fais des essais de mon serveur web en VB.
Vous pouvez aussi visiter:
http://myjmnhome.dyndns.org/begintrans.htm
Ca me permettra de tester mon serveur en même temps :-)
</HS>

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."


"Jean-Marc" a écrit dans le message de
news:42a73703$0$328$
"Gloops" a écrit dans le message de
news:42a7252e$0$3102$
> christophe-pasde<> a écrit, le 08/06/2005 14:43 :
> > Il est mieux de ne faire qu'un accès à la base pour remplir le


listview
> > dans une fonction spécifique, de fermer la base à la fin de la


fonction.
> > De même pour une fonction qui enregistre les commentaires.
>
> Ah bon ? Moi qui croyais bien faire en évitant d'ouvrir et fermer
> plusieurs fois, histoire d'améliorer le temps de réponse ...

Hello,

c'est effectivement un débat intéressant.
Pour ma part, l'expérience et la pratique m'ont montré que:
- Le plus secure est de bosser en transaction
- Connecter et déconnecter ne coûte pas si cher
- Que bien isoler ses unités de travail fait gagner du
temps et diminue les risques de perte de données

En bref, j'ouvre et je ferme en début et fin de fonctions.
J'englobe les traitements pour lesquels je veux être consistant
dans un Begintrans / Commit trans.

Ce que dis la s'applique à VB mais aussi à tout programme
mnipulant une BDD.

Pour le fun, j'avais écrit une petite nouvelle pour illustrer
les dangers de ne pas utiliser les transacations:
http://membres.lycos.fr/jeanmarcn/begintrans.htm


--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."





Avatar
christophe-pasde
Salut

Pour ma part j'essaye d'être au maximum Objet donc les fonctions de BDs
sont dans une interface spécifique où chaque méthode ouvre la base
modifie une collection d'objet reçus ou collecte une collection d'objets
attendus puis ferme la base.

Ce qui fait
1) Que le temps risqué où la carte mère ne doit pas griller est
statistiquement plus que faible.
2) Les accès à la base se font au travers d'une interface unique: maj
aisée, et en cas de changement de format de BD juste ça à recrire.
3) je manipule mes objets ensuite comme je l'entend sans me soucier le
moins du monde de la base de donnée.

En plus si tu utilises comme index de collection la clef primaire d'une
table tu peux même (pour ADO) accélerer les accès BD en accèdant à la
table avec un seek.

Voilà c'est juste les motivations de mon point de vue.

Ceci dit ça ne répond pas à ma question sur le compactage quelques fils
plus haut.


Christophe

Jean-Marc a écrit :

"Gloops" a écrit dans le message de
news:42a7252e$0$3102$

christophe-pasde<> a écrit, le 08/06/2005 14:43 :

Il est mieux de ne faire qu'un accès à la base pour remplir le listview
dans une fonction spécifique, de fermer la base à la fin de la fonction.
De même pour une fonction qui enregistre les commentaires.



Ah bon ? Moi qui croyais bien faire en évitant d'ouvrir et fermer
plusieurs fois, histoire d'améliorer le temps de réponse ...




Hello,

c'est effectivement un débat intéressant.
Pour ma part, l'expérience et la pratique m'ont montré que:
- Le plus secure est de bosser en transaction
- Connecter et déconnecter ne coûte pas si cher
- Que bien isoler ses unités de travail fait gagner du
temps et diminue les risques de perte de données

En bref, j'ouvre et je ferme en début et fin de fonctions.
J'englobe les traitements pour lesquels je veux être consistant
dans un Begintrans / Commit trans.

Ce que dis la s'applique à VB mais aussi à tout programme
mnipulant une BDD.

Pour le fun, j'avais écrit une petite nouvelle pour illustrer
les dangers de ne pas utiliser les transacations:
http://membres.lycos.fr/jeanmarcn/begintrans.htm




Avatar
christophe-pasde
B'en l'a l'air de fonctionner la page s'affiche !
Christophe


Jean-Marc a écrit :

<HS>
Je fais des essais de mon serveur web en VB.
Vous pouvez aussi visiter:
http://myjmnhome.dyndns.org/begintrans.htm
Ca me permettra de tester mon serveur en même temps :-)
</HS>



1 2