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 ?
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 ?
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 ?
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
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
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
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
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
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
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
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
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
ç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
>
>
>
>
ç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
>
>
>
>
ç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
>
>
>
>
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(strLastHeader) = cDicoOut (strLastHeader) & vbCrLf &
Trim$(tblLine(i))
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
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(strLastHeader) = cDicoOut (strLastHeader) & vbCrLf &
Trim$(tblLine(i))
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
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(strLastHeader) = cDicoOut (strLastHeader) & vbCrLf &
Trim$(tblLine(i))
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