[VB6 - ACTIVEX] RGWEATHER - LA MÉTÉO SIMPLEMENT DANS VOS APPLIS

cs_magicgus Messages postés 206 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 14 septembre 2011 - 10 sept. 2010 à 01:49
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 10 sept. 2010 à 09:25
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/52276-vb6-activex-rgweather-la-meteo-simplement-dans-vos-applis

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
10 sept. 2010 à 09:25
après avoir testé ton projet, il ne m'a pas récupéré la météo, chez moi, hier soir.
au bout de quelques secondes (c'est long!) j'ai eu ton message d'erreur.

rapidement, je t'ai nettoyé ta fonction :
Public Property Get CurrentPeriod() As DataPeriod
Select Case VBA.Hour(VBA.Time)
Case Is < 6
CurrentPeriod = Night
Case Is < 11
CurrentPeriod = Morning
Case Is < 18
CurrentPeriod = Afternoon
Case Is < 22
CurrentPeriod = Evening
Case Is < 24
CurrentPeriod = Night
End Select
End Property

n'hésites pas, comme ici à renvoyer un DataPeriod et non un entier...
ca évitera a avoir, comme dans ta Form une pseudo table de correspondance :
1 - Matin 2 - Midi, etc.

Concernant la manipulation XML, c'est assez simple, au moins dans ton cas.

oXML.async = False

nous permet par exemple de demander à avoir un chargement synchrone (ce qu'il ne fait pas, par défault). Ainsi, le code attendra que le fichier XML soit chargé (ou non, si erreur).

Ici, on va charger le fichier, depuis un URL (ou un fichier sur le disque...)
Load renverra False en cas d'erreur.

If oXML.Load(UrlMeteoAPI & vsCity) Then
...
End If

La ligne :
oXML.setProperty "SelectionNamespaces", "xmlns:meteo='http://www.meteorologic.net/rss/1.0'"

est plus anecdotique... elle permet de déclarer que nous rechercherons des noeuds xml précédés de meteo: (déclaration effectuée également dans le XML)

ici, nous bouclons sur chacun des trois noeuds indiquant la météo.

For Each oNode In oXML.selectNodes("rss/channel/item/meteo:weather")

on voit une simple requete XPath, reprenant le cheminement dans l'arbre XML

plutot que d'exploiter l'attribut XML date, je prefere ajouter un nombre de jour à Date (ou VBA.Date, si tu preferes).

pour le reste, c'est assez basique :

.Matin_Temperature = Val(oNode.selectSingleNode("@tempe_matin").Text)
.Matin_Picto = oNode.selectSingleNode("@pictos_matin").Text

sélection XPath (comme selectNodes, mais en ne renvoyant pas une collection d'éléments mais bien un seul)

on part non plus de oXML, le document complet, mais de oNode, notre noeud meteo:weather
on demande l'attribut tempe_matin (@ => attribut) et on l'exploite.
j'aurais pu passer aussi par oNode.Attributes.getNamedItem("tempe_matin").Text

m'enfin...

bref, tout cela mis bout a bout te permet de supprimer trois de tes modules.

je t'encourage a ne pas conserver GetData...
cs_magicgus Messages postés 206 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 14 septembre 2011
10 sept. 2010 à 04:52
C'est pas faut, encore faudrait il que je maitrise tout ça pour l'appliqué d'emblée, je suis un peut un bricoleur qui essayer de faire du bricolage prorpre, et pour ce qui est du XML en vrai je n'y connait rien, donc je me suis débrouiller autrement...
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
10 sept. 2010 à 04:16
exemple de ce qui peux etre fait :
(en ajoutant dans les references 'Microsoft XML 6')

Private Type Prevision
Date As Date
Matin_Temperature As Single
Matin_Picto As String
Midi_Temperature As Single
Midi_Picto As String
ApresMidi_Temperature As Single
ApresMidi_Picto As String
Soir_Temperature As Single
Soir_Picto As String
End Type

Private mxtMeteo(2) As Prevision

'Fonction qui renvoie le numéro correspondant à la periode en coure, analysant les plages horaires pour savoir où l'on se situe dans le temps
Public Property Get CurrentPeriod() As DataPeriod
Select Case VBA.Hour(VBA.Time)
Case Is < 6
CurrentPeriod = Night
Case Is < 11
CurrentPeriod = Morning
Case Is < 18
CurrentPeriod = Afternoon
Case Is < 22
CurrentPeriod = Evening
Case Is < 24
CurrentPeriod = Night
End Select
End Property

Private Function MeteoRefresh(ByVal vsCity As String) As Boolean
Dim oXML As DOMDocument60
Dim oNode As IXMLDOMNode
Dim nIndexDay As Long
Set oXML = new DOMDocument60
oXML.async = False

If oXML.Load(UrlMeteoAPI & vsCity) Then
oXML.setProperty "SelectionNamespaces", "xmlns:meteo='http://www.meteorologic.net/rss/1.0'"

For Each oNode In oXML.selectNodes("rss/channel/item/meteo:weather")
With mxtMeteo(nIndexDay)
.Date = Date + nIndexDay

.Matin_Temperature = Val(oNode.selectSingleNode("@tempe_matin").Text)
.Matin_Picto = oNode.selectSingleNode("@pictos_matin").Text

.Midi_Temperature = Val(oNode.selectSingleNode("@tempe_midi").Text)
.Midi_Picto = oNode.selectSingleNode("@pictos_midi").Text

.ApresMidi_Temperature = Val(oNode.selectSingleNode("@tempe_apmidi").Text)
.ApresMidi_Picto = oNode.selectSingleNode("@pictos_apmidi").Text

.Soir_Temperature = Val(oNode.selectSingleNode("@tempe_soir").Text)
.Soir_Picto = oNode.selectSingleNode("@pictos_soir").Text
End With
nIndexDay = nIndexDay + 1
Next
MeteoRefresh = True
End If
End Function
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
10 sept. 2010 à 03:32
pas tres convivial, ce GetData...
Label2.Caption = Weather1.GetData(DataAbout, Today, Current)

pas la peine de dupliquer ton Type:
Type TypeJour2Matin: Date As String: Temperature As String: Condition As String: Image As String: End Type
Type TypeJour2Midi: Date As String: Temperature As String: Condition As String: Image As String: End Type
Type TypeJour2ApresMidi: Date As String: Temperature As String: Condition As String: Image As String: End Type
Type TypeJour2Soir: Date As String: Temperature As String: Condition As String: Image As String: End Type

tu aurais pu te simplifier la vie en utilisant le DOM pour telecharger et lire ton xml, plutot que de le faire via APIs et manipulations de chaines de texte.
ca aurait pu meme te permettre de supprimer le code concernant l'UTF16.
cs_magicgus Messages postés 206 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 14 septembre 2011
10 sept. 2010 à 01:49
Je vient de le tester en créant un nouveau projet, il m'a fallu environ 2 minutes pour faire une fenetre qui m'affiche la météo, un form, mon control, 4 label et le tour est joué !

Le code que j'ai mis pour qu'il soit fonctionnel (ayant indiquer une ville au préalable)

Private Sub Form_Load()
Weather1.Refresh
End Sub

Private Sub Weather1_RefreshFinnish(Status As RGWeather.EnumStatus, StatusDescription As String)
Label1.Caption = Weather1.CityName
Label2.Caption = Weather1.GetData(DataAbout, Today, Current)
Label3.Caption = Weather1.GetData(Temperature, Today, Current)
Label4.Caption = Weather1.GetData(PictureName, Today, Current) & ".jpg"
End Sub

Facile comme bonjour !
Rejoignez-nous