OVH Cloud OVH Cloud

Séparation des champs pop

6 réponses
Avatar
Gloops
Salut tout le monde,

Il me manquait un bout du sujet d'un message, dans mon client pop.

Je regarde, je m'aperçois que le sujet est donné sur deux lignes. Comme
j'ai considéré le sujet comme situé entre le double point qui suit
"Subject" et la fin de la ligne, bien entendu la suite n'y est pas.

Pourtant, Mozilla s'en sort très bien.

Je ne me rappelle pas avoir vu trop de détails là-dessus dans la doc
pop. Il y aurait bien la solution de s'arrêter à la fin de ligne qui
précède le double point suivant, mais ... si le sujet contient un double
point, on n'est pas rendu.

Quelqu'un aurait-il quelque chose à dire sur la question ?

6 réponses

Avatar
ng
Salut,

En effet il est possible d'avoir un entete sur plusieurs lignes, voici un
code de parsage qui fonctionne bien :

'//Form 1

Option Explicit

Private Sub Form_Load()
Dim strHeader As String, oChamps As cDictionary

strHeader = "" '//<= entete ici

Set oChamps = mParseHeader.ParseHeader(strHeader)

Debug.Print "Message de " & oChamps("From")
Debug.Print "Pour " & oChamps("To")
Debug.Print "Date " & oChamps("Date")
Debug.Print "Envoyé avec " & oChamps("X-Mailer")
Debug.Print "Sujet du message : " & oChamps("Subject")

End Sub


'//Module mParseHeader :

Option Explicit


Public Function ParseHeader(strHeader As String) As cDictionary
Dim cDicoOut As cDictionary, tblLine() As String
Dim strLastHeader As String
Set cDicoOut = New cDictionary
Dim i As Integer
tblLine = Split(strHeader, vbCrLf)
For i = 0 To UBound(tblLine)
If tblLine(i) Like "*:*" And Not tblLine(i) Like " *" Then
strLastHeader = Trim$(Left$(tblLine(i), InStr(1, tblLine(i),
":") - 1))
Call cDicoOut.Add(strLastHeader, Trim$(Mid$(tblLine(i), InStr(1,
tblLine(i), ":") + 1)))
Else
cDicoOut(strLastHeader) = cDicoOut(strLastHeader) & vbCrLf &
Trim$(tblLine(i))
End If
Next
Erase tblLine
Set ParseHeader = cDicoOut
Set cDicoOut = Nothing
End Function


'//Classe cDictionnary :

Option Explicit
Option Compare Text

Private Type tcData
strID As String
vData As Variant
End Type

Private m_tblData() As tcData

Public Sub Add(ID As String, vData As Variant)
Dim tLigne As tcData
tLigne.vData = vData
tLigne.strID = ID
Call AjoutTableauLigne(tLigne, m_tblData)
End Sub

Public Sub Remove(ID As Variant)
Select Case VarType(ID)
Case vbInteger, vbLong
Call SupprimeTableauLigne(CInt(ID) - 1, m_tblData)
Case vbString
Call SupprimeTableauLigne(GetIndexFromID(CStr(ID)), m_tblData)
End Select
End Sub

Public Property Get Count() As Integer
Count = TableauCount(m_tblData)
End Property

Public Property Get Item(ID As Variant) As Variant
Select Case VarType(ID)
Case vbInteger, vbLong
Item = m_tblData(CInt(ID) - 1).vData
Case vbString
Item = m_tblData(GetIndexFromID(CStr(ID))).vData
End Select
End Property

Public Property Let Item(ID As Variant, ByVal vNewValue As Variant)
Select Case VarType(ID)
Case vbInteger, vbLong
m_tblData(CInt(ID) - 1).vData = vNewValue
Case vbString
m_tblData(GetIndexFromID(CStr(ID))).vData = vNewValue
End Select
End Property


Private Function GetIndexFromID(ID As String) As Integer
If EstTableauValide(m_tblData) Then
Dim i As Integer
For i = 0 To UBound(m_tblData)
If m_tblData(i).strID = ID Then
GetIndexFromID = i
Exit For '//BREAK
End If
Next
End If
End Function

Private Sub Class_Terminate()
Erase m_tblData
End Sub

Private Sub AjoutTableauLigne(tLigne As tcData, tblTableau() As tcData)
If EstTableauValide(tblTableau) Then
Dim nInd As Integer
nInd = UBound(tblTableau) + 1
ReDim Preserve tblTableau(nInd)
tblTableau(nInd) = tLigne
Else
ReDim tblTableau(0)
tblTableau(0) = tLigne
End If
End Sub

Private Function EstTableauValide(tblTableau() As tcData) As Boolean
On Error Resume Next
Err.Clear
Dim lTest As Long
lTest = UBound(tblTableau)
EstTableauValide = (Err.Number = 0)
On Error GoTo 0
End Function

Private Sub SupprimeTableauLigne(Index As Integer, tblTableau() As tcData)
If EstTableauValide(tblTableau) Then
If Index <= UBound(tblTableau) Then
Dim tblTmp() As tcData, i As Integer
For i = 0 To UBound(tblTableau)
If i <> Index Then
Call AjoutTableauLigne(tblTableau(i), tblTmp)
End If
Next
tblTableau = tblTmp
Erase tblTmp
End If
End If
End Sub

Private Function TableauCount(tblTableau() As tcData) As Integer
If EstTableauValide(tblTableau) Then
TableauCount = UBound(tblTableau) + 1
Else
TableauCount = 0
End If
End Function




--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Gloops wrote:
Salut tout le monde,

Il me manquait un bout du sujet d'un message, dans mon client pop.

Je regarde, je m'aperçois que le sujet est donné sur deux lignes.
Comme j'ai considéré le sujet comme situé entre le double point qui
suit "Subject" et la fin de la ligne, bien entendu la suite n'y est
pas.
Pourtant, Mozilla s'en sort très bien.

Je ne me rappelle pas avoir vu trop de détails là-dessus dans la doc
pop. Il y aurait bien la solution de s'arrêter à la fin de ligne qui
précède le double point suivant, mais ... si le sujet contient un
double point, on n'est pas rendu.

Quelqu'un aurait-il quelque chose à dire sur la question ?


Avatar
Gloops
Salut,

Au poil, y a plus qu'à pomper :)

Si je te suis bien, de même que la ligne de suite est indiquée en VB par
un caractère de soulignement à la fin de la ligne suivie, elle est
indiquée en entête pop par un espace au début de la ligne de suite.

C'est bon à savoir, j'ai dû parcourir la norme trop vite, ou alors ce
point était publié sur un autre site.

Merci beaucoup.
_________________________________
ng a écrit, le 18/10/2004 13:46 :
Salut,

En effet il est possible d'avoir un entete sur plusieurs lignes, voici un
code de parsage qui fonctionne bien :

'//Form 1

Option Explicit

Private Sub Form_Load()
Dim strHeader As String, oChamps As cDictionary

strHeader = "" '//<= entete ici

Set oChamps = mParseHeader.ParseHeader(strHeader)

Debug.Print "Message de " & oChamps("From")
Debug.Print "Pour " & oChamps("To")
Debug.Print "Date " & oChamps("Date")
Debug.Print "Envoyé avec " & oChamps("X-Mailer")
Debug.Print "Sujet du message : " & oChamps("Subject")

End Sub


'//Module mParseHeader :

Option Explicit


Public Function ParseHeader(strHeader As String) As cDictionary
Dim cDicoOut As cDictionary, tblLine() As String
Dim strLastHeader As String
Set cDicoOut = New cDictionary
Dim i As Integer
tblLine = Split(strHeader, vbCrLf)
For i = 0 To UBound(tblLine)
If tblLine(i) Like "*:*" And Not tblLine(i) Like " *" Then
strLastHeader = Trim$(Left$(tblLine(i), InStr(1, tblLine(i),
":") - 1))
Call cDicoOut.Add(strLastHeader, Trim$(Mid$(tblLine(i), InStr(1,
tblLine(i), ":") + 1)))
Else
cDicoOut(strLastHeader) = cDicoOut(strLastHeader) & vbCrLf &
Trim$(tblLine(i))
End If
Next
Erase tblLine
Set ParseHeader = cDicoOut
Set cDicoOut = Nothing
End Function


'//Classe cDictionnary :

Option Explicit
Option Compare Text

Private Type tcData
strID As String
vData As Variant
End Type

Private m_tblData() As tcData

Public Sub Add(ID As String, vData As Variant)
Dim tLigne As tcData
tLigne.vData = vData
tLigne.strID = ID
Call AjoutTableauLigne(tLigne, m_tblData)
End Sub

Public Sub Remove(ID As Variant)
Select Case VarType(ID)
Case vbInteger, vbLong
Call SupprimeTableauLigne(CInt(ID) - 1, m_tblData)
Case vbString
Call SupprimeTableauLigne(GetIndexFromID(CStr(ID)), m_tblData)
End Select
End Sub

Public Property Get Count() As Integer
Count = TableauCount(m_tblData)
End Property

Public Property Get Item(ID As Variant) As Variant
Select Case VarType(ID)
Case vbInteger, vbLong
Item = m_tblData(CInt(ID) - 1).vData
Case vbString
Item = m_tblData(GetIndexFromID(CStr(ID))).vData
End Select
End Property

Public Property Let Item(ID As Variant, ByVal vNewValue As Variant)
Select Case VarType(ID)
Case vbInteger, vbLong
m_tblData(CInt(ID) - 1).vData = vNewValue
Case vbString
m_tblData(GetIndexFromID(CStr(ID))).vData = vNewValue
End Select
End Property


Private Function GetIndexFromID(ID As String) As Integer
If EstTableauValide(m_tblData) Then
Dim i As Integer
For i = 0 To UBound(m_tblData)
If m_tblData(i).strID = ID Then
GetIndexFromID = i
Exit For '//BREAK
End If
Next
End If
End Function

Private Sub Class_Terminate()
Erase m_tblData
End Sub

Private Sub AjoutTableauLigne(tLigne As tcData, tblTableau() As tcData)
If EstTableauValide(tblTableau) Then
Dim nInd As Integer
nInd = UBound(tblTableau) + 1
ReDim Preserve tblTableau(nInd)
tblTableau(nInd) = tLigne
Else
ReDim tblTableau(0)
tblTableau(0) = tLigne
End If
End Sub

Private Function EstTableauValide(tblTableau() As tcData) As Boolean
On Error Resume Next
Err.Clear
Dim lTest As Long
lTest = UBound(tblTableau)
EstTableauValide = (Err.Number = 0)
On Error GoTo 0
End Function

Private Sub SupprimeTableauLigne(Index As Integer, tblTableau() As tcData)
If EstTableauValide(tblTableau) Then
If Index <= UBound(tblTableau) Then
Dim tblTmp() As tcData, i As Integer
For i = 0 To UBound(tblTableau)
If i <> Index Then
Call AjoutTableauLigne(tblTableau(i), tblTmp)
End If
Next
tblTableau = tblTmp
Erase tblTmp
End If
End If
End Sub

Private Function TableauCount(tblTableau() As tcData) As Integer
If EstTableauValide(tblTableau) Then
TableauCount = UBound(tblTableau) + 1
Else
TableauCount = 0
End If
End Function






Avatar
Gloops
ça y est ça marche !
ça allait plus vite de regarder la ligne suivante en ajoutant 1 à
l'index que de repomper ta fonction, mais en tout cas merci pour le tuyau.
_________________________________
ng a écrit, le 18/10/2004 13:46 :

Salut,

En effet il est possible d'avoir un entete sur plusieurs lignes, voici un
code de parsage qui fonctionne bien :

'//Form 1

Option Explicit

Private Sub Form_Load()
Dim strHeader As String, oChamps As cDictionary

strHeader = "" '//<= entete ici

Set oChamps = mParseHeader.ParseHeader(strHeader)

Debug.Print "Message de " & oChamps("From")
Debug.Print "Pour " & oChamps("To")
Debug.Print "Date " & oChamps("Date")
Debug.Print "Envoyé avec " & oChamps("X-Mailer")
Debug.Print "Sujet du message : " & oChamps("Subject")

End Sub


'//Module mParseHeader :

Option Explicit


Public Function ParseHeader(strHeader As String) As cDictionary
Dim cDicoOut As cDictionary, tblLine() As String
Dim strLastHeader As String
Set cDicoOut = New cDictionary
Dim i As Integer
tblLine = Split(strHeader, vbCrLf)
For i = 0 To UBound(tblLine)
If tblLine(i) Like "*:*" And Not tblLine(i) Like " *" Then
strLastHeader = Trim$(Left$(tblLine(i), InStr(1, tblLine(i),
":") - 1))
Call cDicoOut.Add(strLastHeader, Trim$(Mid$(tblLine(i), InStr(1,
tblLine(i), ":") + 1)))
Else
cDicoOut(strLastHeader) = cDicoOut(strLastHeader) & vbCrLf &
Trim$(tblLine(i))
End If
Next
Erase tblLine
Set ParseHeader = cDicoOut
Set cDicoOut = Nothing
End Function


'//Classe cDictionnary :

Option Explicit
Option Compare Text

Private Type tcData
strID As String
vData As Variant
End Type

Private m_tblData() As tcData

Public Sub Add(ID As String, vData As Variant)
Dim tLigne As tcData
tLigne.vData = vData
tLigne.strID = ID
Call AjoutTableauLigne(tLigne, m_tblData)
End Sub

Public Sub Remove(ID As Variant)
Select Case VarType(ID)
Case vbInteger, vbLong
Call SupprimeTableauLigne(CInt(ID) - 1, m_tblData)
Case vbString
Call SupprimeTableauLigne(GetIndexFromID(CStr(ID)), m_tblData)
End Select
End Sub

Public Property Get Count() As Integer
Count = TableauCount(m_tblData)
End Property

Public Property Get Item(ID As Variant) As Variant
Select Case VarType(ID)
Case vbInteger, vbLong
Item = m_tblData(CInt(ID) - 1).vData
Case vbString
Item = m_tblData(GetIndexFromID(CStr(ID))).vData
End Select
End Property

Public Property Let Item(ID As Variant, ByVal vNewValue As Variant)
Select Case VarType(ID)
Case vbInteger, vbLong
m_tblData(CInt(ID) - 1).vData = vNewValue
Case vbString
m_tblData(GetIndexFromID(CStr(ID))).vData = vNewValue
End Select
End Property


Private Function GetIndexFromID(ID As String) As Integer
If EstTableauValide(m_tblData) Then
Dim i As Integer
For i = 0 To UBound(m_tblData)
If m_tblData(i).strID = ID Then
GetIndexFromID = i
Exit For '//BREAK
End If
Next
End If
End Function

Private Sub Class_Terminate()
Erase m_tblData
End Sub

Private Sub AjoutTableauLigne(tLigne As tcData, tblTableau() As tcData)
If EstTableauValide(tblTableau) Then
Dim nInd As Integer
nInd = UBound(tblTableau) + 1
ReDim Preserve tblTableau(nInd)
tblTableau(nInd) = tLigne
Else
ReDim tblTableau(0)
tblTableau(0) = tLigne
End If
End Sub

Private Function EstTableauValide(tblTableau() As tcData) As Boolean
On Error Resume Next
Err.Clear
Dim lTest As Long
lTest = UBound(tblTableau)
EstTableauValide = (Err.Number = 0)
On Error GoTo 0
End Function

Private Sub SupprimeTableauLigne(Index As Integer, tblTableau() As tcData)
If EstTableauValide(tblTableau) Then
If Index <= UBound(tblTableau) Then
Dim tblTmp() As tcData, i As Integer
For i = 0 To UBound(tblTableau)
If i <> Index Then
Call AjoutTableauLigne(tblTableau(i), tblTmp)
End If
Next
tblTableau = tblTmp
Erase tblTmp
End If
End If
End Sub

Private Function TableauCount(tblTableau() As tcData) As Integer
If EstTableauValide(tblTableau) Then
TableauCount = UBound(tblTableau) + 1
Else
TableauCount = 0
End If
End Function






Avatar
ng
Salut,

Oui c'est bien ça, je ne l'ai pas lu dans la RFC, c'est simplement une
constatation expérimentale mais c'est bien ça rassure toi ;)

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Gloops wrote:
Salut,

Au poil, y a plus qu'à pomper :)

Si je te suis bien, de même que la ligne de suite est indiquée en VB
par un caractère de soulignement à la fin de la ligne suivie, elle est
indiquée en entête pop par un espace au début de la ligne de suite.

C'est bon à savoir, j'ai dû parcourir la norme trop vite, ou alors ce
point était publié sur un autre site.

Merci beaucoup.
_________________________________
ng a écrit, le 18/10/2004 13:46 :
Salut,

En effet il est possible d'avoir un entete sur plusieurs lignes,
voici un code de parsage qui fonctionne bien :

'//Form 1

Option Explicit

Private Sub Form_Load()
Dim strHeader As String, oChamps As cDictionary

strHeader = "" '//<= entete ici

Set oChamps = mParseHeader.ParseHeader(strHeader)

Debug.Print "Message de " & oChamps("From")
Debug.Print "Pour " & oChamps("To")
Debug.Print "Date " & oChamps("Date")
Debug.Print "Envoyé avec " & oChamps("X-Mailer")
Debug.Print "Sujet du message : " & oChamps("Subject")

End Sub


'//Module mParseHeader :

Option Explicit


Public Function ParseHeader(strHeader As String) As cDictionary
Dim cDicoOut As cDictionary, tblLine() As String
Dim strLastHeader As String
Set cDicoOut = New cDictionary
Dim i As Integer
tblLine = Split(strHeader, vbCrLf)
For i = 0 To UBound(tblLine)
If tblLine(i) Like "*:*" And Not tblLine(i) Like " *" Then
strLastHeader = Trim$(Left$(tblLine(i), InStr(1,
tblLine(i), ":") - 1))
Call cDicoOut.Add(strLastHeader, Trim$(Mid$(tblLine(i),
InStr(1, tblLine(i), ":") + 1)))
Else
cDicoOut(strLastHeader) = cDicoOut(strLastHeader) &
vbCrLf & Trim$(tblLine(i))
End If
Next
Erase tblLine
Set ParseHeader = cDicoOut
Set cDicoOut = Nothing
End Function


'//Classe cDictionnary :

Option Explicit
Option Compare Text

Private Type tcData
strID As String
vData As Variant
End Type

Private m_tblData() As tcData

Public Sub Add(ID As String, vData As Variant)
Dim tLigne As tcData
tLigne.vData = vData
tLigne.strID = ID
Call AjoutTableauLigne(tLigne, m_tblData)
End Sub

Public Sub Remove(ID As Variant)
Select Case VarType(ID)
Case vbInteger, vbLong
Call SupprimeTableauLigne(CInt(ID) - 1, m_tblData)
Case vbString
Call SupprimeTableauLigne(GetIndexFromID(CStr(ID)),
m_tblData) End Select
End Sub

Public Property Get Count() As Integer
Count = TableauCount(m_tblData)
End Property

Public Property Get Item(ID As Variant) As Variant
Select Case VarType(ID)
Case vbInteger, vbLong
Item = m_tblData(CInt(ID) - 1).vData
Case vbString
Item = m_tblData(GetIndexFromID(CStr(ID))).vData
End Select
End Property

Public Property Let Item(ID As Variant, ByVal vNewValue As Variant)
Select Case VarType(ID)
Case vbInteger, vbLong
m_tblData(CInt(ID) - 1).vData = vNewValue
Case vbString
m_tblData(GetIndexFromID(CStr(ID))).vData = vNewValue
End Select
End Property


Private Function GetIndexFromID(ID As String) As Integer
If EstTableauValide(m_tblData) Then
Dim i As Integer
For i = 0 To UBound(m_tblData)
If m_tblData(i).strID = ID Then
GetIndexFromID = i
Exit For '//BREAK
End If
Next
End If
End Function

Private Sub Class_Terminate()
Erase m_tblData
End Sub

Private Sub AjoutTableauLigne(tLigne As tcData, tblTableau() As
tcData) If EstTableauValide(tblTableau) Then
Dim nInd As Integer
nInd = UBound(tblTableau) + 1
ReDim Preserve tblTableau(nInd)
tblTableau(nInd) = tLigne
Else
ReDim tblTableau(0)
tblTableau(0) = tLigne
End If
End Sub

Private Function EstTableauValide(tblTableau() As tcData) As Boolean
On Error Resume Next
Err.Clear
Dim lTest As Long
lTest = UBound(tblTableau)
EstTableauValide = (Err.Number = 0)
On Error GoTo 0
End Function

Private Sub SupprimeTableauLigne(Index As Integer, tblTableau() As
tcData) If EstTableauValide(tblTableau) Then
If Index <= UBound(tblTableau) Then
Dim tblTmp() As tcData, i As Integer
For i = 0 To UBound(tblTableau)
If i <> Index Then
Call AjoutTableauLigne(tblTableau(i), tblTmp)
End If
Next
tblTableau = tblTmp
Erase tblTmp
End If
End If
End Sub

Private Function TableauCount(tblTableau() As tcData) As Integer
If EstTableauValide(tblTableau) Then
TableauCount = UBound(tblTableau) + 1
Else
TableauCount = 0
End If
End Function




Avatar
davepath
Salut

Je suis par hazard tombé sur votre code suivant :

Public Function ParseHeader(strHeader As String) As cDictionary
Dim cDicoOut As cDictionary, tblLine() As String
Dim strLastHeader As String
Set cDicoOut = New cDictionary
Dim i As Integer
tblLine = Split(strHeader, vbCrLf)
For i = 0 To UBound(tblLine)
If tblLine(i) Like "*:*" And Not tblLine(i) Like " *" Then
strLastHeader = Trim$(Left$(tblLine(i), InStr(1,
tblLine(i),":") - 1))
Call cDicoOut.Add(strLastHeader, Trim$(Mid$(tblLine(i),
InStr(1,tblLine(i), ":") + 1)))
Else
cDicoOut(strLastHeader) = cDicoOut (strLastHeader) & vbCrLf &
Trim$(tblLine(i))
End If
Next
Erase tblLine
Set ParseHeader = cDicoOut
Set cDicoOut = Nothing
End Function

Ici je n'ais pas compris, excusez moi, vous appeler un objet, un sub , etc ...
cDicoOut

Call cDicoOut.Add(strLastHeader, Trim$(Mid$(tblLine(i), InStr(1,tblLine(i),
":") + 1)))

puis :
cDicoOut(strLastHeader) = cDicoOut (strLastHeader) & vbCrLf &
Trim$(tblLine(i))

et ici une variable ou je ne sais quoi

Y a pas un truc ?



"Gloops" wrote:

ça y est ça marche !
ça allait plus vite de regarder la ligne suivante en ajoutant 1 à
l'index que de repomper ta fonction, mais en tout cas merci pour le tuyau.
_________________________________
ng a écrit, le 18/10/2004 13:46 :

> Salut,
>
> En effet il est possible d'avoir un entete sur plusieurs lignes, voici un
> code de parsage qui fonctionne bien :
>
> '//Form 1
>
> Option Explicit
>
> Private Sub Form_Load()
> Dim strHeader As String, oChamps As cDictionary
>
> strHeader = "" '//<= entete ici
>
> Set oChamps = mParseHeader.ParseHeader(strHeader)
>
> Debug.Print "Message de " & oChamps("From")
> Debug.Print "Pour " & oChamps("To")
> Debug.Print "Date " & oChamps("Date")
> Debug.Print "Envoyé avec " & oChamps("X-Mailer")
> Debug.Print "Sujet du message : " & oChamps("Subject")
>
> End Sub
>
>
> '//Module mParseHeader :
>
> Option Explicit
>
>
> Public Function ParseHeader(strHeader As String) As cDictionary
> Dim cDicoOut As cDictionary, tblLine() As String
> Dim strLastHeader As String
> Set cDicoOut = New cDictionary
> Dim i As Integer
> tblLine = Split(strHeader, vbCrLf)
> For i = 0 To UBound(tblLine)
> If tblLine(i) Like "*:*" And Not tblLine(i) Like " *" Then
> strLastHeader = Trim$(Left$(tblLine(i), InStr(1, tblLine(i),
> ":") - 1))
> Call cDicoOut.Add(strLastHeader, Trim$(Mid$(tblLine(i), InStr(1,
> tblLine(i), ":") + 1)))
> Else
> cDicoOut(strLastHeader) = cDicoOut(strLastHeader) & vbCrLf &
> Trim$(tblLine(i))
> End If
> Next
> Erase tblLine
> Set ParseHeader = cDicoOut
> Set cDicoOut = Nothing
> End Function
>
>
> '//Classe cDictionnary :
>
> Option Explicit
> Option Compare Text
>
> Private Type tcData
> strID As String
> vData As Variant
> End Type
>
> Private m_tblData() As tcData
>
> Public Sub Add(ID As String, vData As Variant)
> Dim tLigne As tcData
> tLigne.vData = vData
> tLigne.strID = ID
> Call AjoutTableauLigne(tLigne, m_tblData)
> End Sub
>
> Public Sub Remove(ID As Variant)
> Select Case VarType(ID)
> Case vbInteger, vbLong
> Call SupprimeTableauLigne(CInt(ID) - 1, m_tblData)
> Case vbString
> Call SupprimeTableauLigne(GetIndexFromID(CStr(ID)), m_tblData)
> End Select
> End Sub
>
> Public Property Get Count() As Integer
> Count = TableauCount(m_tblData)
> End Property
>
> Public Property Get Item(ID As Variant) As Variant
> Select Case VarType(ID)
> Case vbInteger, vbLong
> Item = m_tblData(CInt(ID) - 1).vData
> Case vbString
> Item = m_tblData(GetIndexFromID(CStr(ID))).vData
> End Select
> End Property
>
> Public Property Let Item(ID As Variant, ByVal vNewValue As Variant)
> Select Case VarType(ID)
> Case vbInteger, vbLong
> m_tblData(CInt(ID) - 1).vData = vNewValue
> Case vbString
> m_tblData(GetIndexFromID(CStr(ID))).vData = vNewValue
> End Select
> End Property
>
>
> Private Function GetIndexFromID(ID As String) As Integer
> If EstTableauValide(m_tblData) Then
> Dim i As Integer
> For i = 0 To UBound(m_tblData)
> If m_tblData(i).strID = ID Then
> GetIndexFromID = i
> Exit For '//BREAK
> End If
> Next
> End If
> End Function
>
> Private Sub Class_Terminate()
> Erase m_tblData
> End Sub
>
> Private Sub AjoutTableauLigne(tLigne As tcData, tblTableau() As tcData)
> If EstTableauValide(tblTableau) Then
> Dim nInd As Integer
> nInd = UBound(tblTableau) + 1
> ReDim Preserve tblTableau(nInd)
> tblTableau(nInd) = tLigne
> Else
> ReDim tblTableau(0)
> tblTableau(0) = tLigne
> End If
> End Sub
>
> Private Function EstTableauValide(tblTableau() As tcData) As Boolean
> On Error Resume Next
> Err.Clear
> Dim lTest As Long
> lTest = UBound(tblTableau)
> EstTableauValide = (Err.Number = 0)
> On Error GoTo 0
> End Function
>
> Private Sub SupprimeTableauLigne(Index As Integer, tblTableau() As tcData)
> If EstTableauValide(tblTableau) Then
> If Index <= UBound(tblTableau) Then
> Dim tblTmp() As tcData, i As Integer
> For i = 0 To UBound(tblTableau)
> If i <> Index Then
> Call AjoutTableauLigne(tblTableau(i), tblTmp)
> End If
> Next
> tblTableau = tblTmp
> Erase tblTmp
> End If
> End If
> End Sub
>
> Private Function TableauCount(tblTableau() As tcData) As Integer
> If EstTableauValide(tblTableau) Then
> TableauCount = UBound(tblTableau) + 1
> Else
> TableauCount = 0
> End If
> End Function
>
>
>
>




Avatar
ng
Salut,

Ici je n'ais pas compris, excusez moi, vous appeler un objet, un sub
, etc ... cDicoOut

Call cDicoOut.Add(strLastHeader, Trim$(Mid$(tblLine(i),
InStr(1,tblLine(i), ":") + 1)))



cDicoOut est un objet de type cDictionary (j'avais fourni la classe
cDictionary avec)
On appelle simplement la méthode Add qui ajoute un entete au dictionnaire.

cDicoOut(strLastHeader) = cDicoOut (strLastHeader) & vbCrLf &
Trim$(tblLine(i))


On modifie le contenu de l'entete strLastHeader de l'objet dictionary, c'est
pour gérer les entetes multilignes.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

davepath wrote:
Salut

Je suis par hazard tombé sur votre code suivant :

Public Function ParseHeader(strHeader As String) As cDictionary
Dim cDicoOut As cDictionary, tblLine() As String
Dim strLastHeader As String
Set cDicoOut = New cDictionary
Dim i As Integer
tblLine = Split(strHeader, vbCrLf)
For i = 0 To UBound(tblLine)
If tblLine(i) Like "*:*" And Not tblLine(i) Like " *" Then
strLastHeader = Trim$(Left$(tblLine(i), InStr(1,
tblLine(i),":") - 1))
Call cDicoOut.Add(strLastHeader, Trim$(Mid$(tblLine(i),
InStr(1,tblLine(i), ":") + 1)))
Else
cDicoOut(strLastHeader) = cDicoOut (strLastHeader) &
vbCrLf & Trim$(tblLine(i))
End If
Next
Erase tblLine
Set ParseHeader = cDicoOut
Set cDicoOut = Nothing
End Function

Ici je n'ais pas compris, excusez moi, vous appeler un objet, un sub
, etc ... cDicoOut

Call cDicoOut.Add(strLastHeader, Trim$(Mid$(tblLine(i),
InStr(1,tblLine(i), ":") + 1)))

puis :
cDicoOut(strLastHeader) = cDicoOut (strLastHeader) & vbCrLf &
Trim$(tblLine(i))

et ici une variable ou je ne sais quoi

Y a pas un truc ?



"Gloops" wrote:

ça y est ça marche !
ça allait plus vite de regarder la ligne suivante en ajoutant 1 à
l'index que de repomper ta fonction, mais en tout cas merci pour le
tuyau. _________________________________
ng a écrit, le 18/10/2004 13:46 :

Salut,

En effet il est possible d'avoir un entete sur plusieurs lignes,
voici un code de parsage qui fonctionne bien :

'//Form 1

Option Explicit

Private Sub Form_Load()
Dim strHeader As String, oChamps As cDictionary

strHeader = "" '//<= entete ici

Set oChamps = mParseHeader.ParseHeader(strHeader)

Debug.Print "Message de " & oChamps("From")
Debug.Print "Pour " & oChamps("To")
Debug.Print "Date " & oChamps("Date")
Debug.Print "Envoyé avec " & oChamps("X-Mailer")
Debug.Print "Sujet du message : " & oChamps("Subject")

End Sub


'//Module mParseHeader :

Option Explicit


Public Function ParseHeader(strHeader As String) As cDictionary
Dim cDicoOut As cDictionary, tblLine() As String
Dim strLastHeader As String
Set cDicoOut = New cDictionary
Dim i As Integer
tblLine = Split(strHeader, vbCrLf)
For i = 0 To UBound(tblLine)
If tblLine(i) Like "*:*" And Not tblLine(i) Like " *" Then
strLastHeader = Trim$(Left$(tblLine(i), InStr(1,
tblLine(i), ":") - 1))
Call cDicoOut.Add(strLastHeader, Trim$(Mid$(tblLine(i),
InStr(1, tblLine(i), ":") + 1)))
Else
cDicoOut(strLastHeader) = cDicoOut(strLastHeader) &
vbCrLf & Trim$(tblLine(i))
End If
Next
Erase tblLine
Set ParseHeader = cDicoOut
Set cDicoOut = Nothing
End Function


'//Classe cDictionnary :

Option Explicit
Option Compare Text

Private Type tcData
strID As String
vData As Variant
End Type

Private m_tblData() As tcData

Public Sub Add(ID As String, vData As Variant)
Dim tLigne As tcData
tLigne.vData = vData
tLigne.strID = ID
Call AjoutTableauLigne(tLigne, m_tblData)
End Sub

Public Sub Remove(ID As Variant)
Select Case VarType(ID)
Case vbInteger, vbLong
Call SupprimeTableauLigne(CInt(ID) - 1, m_tblData)
Case vbString
Call SupprimeTableauLigne(GetIndexFromID(CStr(ID)),
m_tblData) End Select
End Sub

Public Property Get Count() As Integer
Count = TableauCount(m_tblData)
End Property

Public Property Get Item(ID As Variant) As Variant
Select Case VarType(ID)
Case vbInteger, vbLong
Item = m_tblData(CInt(ID) - 1).vData
Case vbString
Item = m_tblData(GetIndexFromID(CStr(ID))).vData
End Select
End Property

Public Property Let Item(ID As Variant, ByVal vNewValue As Variant)
Select Case VarType(ID)
Case vbInteger, vbLong
m_tblData(CInt(ID) - 1).vData = vNewValue
Case vbString
m_tblData(GetIndexFromID(CStr(ID))).vData = vNewValue
End Select
End Property


Private Function GetIndexFromID(ID As String) As Integer
If EstTableauValide(m_tblData) Then
Dim i As Integer
For i = 0 To UBound(m_tblData)
If m_tblData(i).strID = ID Then
GetIndexFromID = i
Exit For '//BREAK
End If
Next
End If
End Function

Private Sub Class_Terminate()
Erase m_tblData
End Sub

Private Sub AjoutTableauLigne(tLigne As tcData, tblTableau() As
tcData) If EstTableauValide(tblTableau) Then
Dim nInd As Integer
nInd = UBound(tblTableau) + 1
ReDim Preserve tblTableau(nInd)
tblTableau(nInd) = tLigne
Else
ReDim tblTableau(0)
tblTableau(0) = tLigne
End If
End Sub

Private Function EstTableauValide(tblTableau() As tcData) As Boolean
On Error Resume Next
Err.Clear
Dim lTest As Long
lTest = UBound(tblTableau)
EstTableauValide = (Err.Number = 0)
On Error GoTo 0
End Function

Private Sub SupprimeTableauLigne(Index As Integer, tblTableau() As
tcData) If EstTableauValide(tblTableau) Then
If Index <= UBound(tblTableau) Then
Dim tblTmp() As tcData, i As Integer
For i = 0 To UBound(tblTableau)
If i <> Index Then
Call AjoutTableauLigne(tblTableau(i), tblTmp)
End If
Next
tblTableau = tblTmp
Erase tblTmp
End If
End If
End Sub

Private Function TableauCount(tblTableau() As tcData) As Integer
If EstTableauValide(tblTableau) Then
TableauCount = UBound(tblTableau) + 1
Else
TableauCount = 0
End If
End Function