Quelqu'un aurait il un petit bout de code pour remplir un arbre à la sauce
explorer...?
Pour afficher les disques dur, les répertoires et en sélectionnant un
répertoire afficher dans un champ liste images les fichiers JPEG qu'il
contient....
Merci par avance.
Fabrice
PS : n'ayant pas encore la version cd, je n'ai pas les exemples....
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Pierre BOUSQUET
j'espere que ce te conviendra : PROCEDURE WindowsListeFicRep(Chemin="",Type=3,Trier=Vrai,Tracerúux) // Récupère la liste des fichiers et des sous répertoires // du répertoire courant dans une liste // Type= 1 : répertoires // 2 : fichiers // 3 : rep+fichiers chemin=Minuscule(Remplace(Remplace(Chemin,"",""),"+","")) SI Position(chemin,"frepencours()") ALORS chemin=Remplace(chemin,"frepencours()",fRepEnCours()) FIN b est entier Liste est chaîne Chem est chaîne = chemin
SI chem="" ALORS // Liste des lecteurs NbLec est un entier NbLec = AppelDLL32("kernel32", "GetLogicalDrives") Valeur est entier
POUR b=1 A 26 SI b=1 ALORS valeur=1 SINON Valeur=Puissance(2,b-1) FIN SI ( ETBinaire(NbLec, valeur)) = valeur ALORS SI liste<>"" ALORS liste=liste+RC liste=liste+Caract(64+b)+":"+TAB+fDisqueInfo(Caract(64+b)+":",fdTypeDisque) FIN FIN
WIN32_FIND_DATA est une structure dwAttrib est un entier CreeDateB est un entier CreeDateH est un entier DerAccB est un entier DerAccH est un entier DerEcritB est un entier DerEcritH est un entier nFileSizeHigh est un entier nFileSizeLow est un entier dwReserve0 est un entier dwReserve1 est un entier cFileName est une chaîne ASCIIZ sur 260 cAlternate est une chaîne ASCIIZ sur 14 FIN
WFD est un WIN32_FIND_DATA lpFileName est une chaîne ASCIIZ sur 255 hFile est un entier = 1 r est un entier = 1 // Ce code vous est offert par Beaussier en ligne TypeRencontre est entier
MemCrée("ZM_TMPLISTE")
// Déclaration de la recherche à faire BOUCLE b++ lpFileName = ExtraitChaîne(chem,b,";") SI lpFileName=EOT ALORS SORTIR
generique = ExtraitChaîne(lpFileName,ChaîneOccurrence(lpFileName,"")+1,"") SI Position(generique,".")<1 ALORS //si position(chem,"*.*")<1 ALORS chem=Remplace(chem+"*.*","","") generique="*.*" FIN
SI Position(lpFileName,""+generique)<1 ALORS lpFileName=lpFileName+""+generique FIN
hFile = AppelDLL32("kernel32", "FindFirstFileA", &lpFileName, &WFD) SI hFile<>-1 ALORS r=1 TANTQUE r SI WFD:cFileName<>".." ET WFD:cFileName<>"." ALORS SI fRep(Remplace(lpFileName,generique,"")+WFD:cFileName,frRépertoire)<>"" ALORS TypeRencontre=1 SINON TypeRencontre=2 FIN
SI Tracer ALORS Message(Remplace(lpFileName,generique,"")+WFD:cFileName) Multitâche(-1) FIN
SI TypeRencontre=type OU type=3 ALORS SI Trier ALORS MemRecherche("ZM_TMPLISTE",TypeRencontre+Remplace(lpFileName,generique,"")+WFD:cFileName) SI MemEnDehors("ZM_TMPLISTE") ALORS // liste=liste+remplace(lpFileName,"*.*","")+WFD:cFileName
SI TypeRencontre=1 ALORS // Répertoire MemAjoute("ZM_TMPLISTE",TypeRencontre+Remplace(lpFileName,generique,"")+WFD:cFileName,Remplace(lpFileName,generique,"")+WFD:cFileName+TAB+"R") SINON // Fichier MemAjoute("ZM_TMPLISTE",TypeRencontre+Remplace(lpFileName,generique,"")+WFD:cFileName,Remplace(lpFileName,generique,"")+WFD:cFileName+TAB+"F") FIN MemTrie("ZM_TMPLISTE") FIN SINON SI liste<>"" ALORS liste = liste+RC SI TypeRencontre=1 ALORS liste=liste+Remplace(lpFileName,generique,"")+WFD:cFileName+TAB+"R" SINON liste=liste+Remplace(lpFileName,generique,"")+WFD:cFileName+TAB+"F" FIN FIN FIN FIN r = AppelDLL32("kernel32", "FindNextFileA", hFile, &WFD) FIN FIN r = AppelDLL32("kernel32", "FindClose", hFile) FIN
SI Tracer ALORS Message() FIN
SI Trier MemPremier("ZM_TMPLISTE") TANTQUE PAS MemEnDehors("ZM_TMPLISTE") SI liste<>"" ALORS liste = liste+RC liste=liste+MemRécupère("ZM_TMPLISTE",MemEnCours("ZM_TMPLISTE")) MemSuivant("ZM_TMPLISTE") FIN FIN MemSupprimeTout("ZM_TMPLISTE")
RENVOYER Remplace(liste,"","")
-- Pierre BOUSQUET
" Ne me dites pas que ce problème est difficile. S'il n'était pas difficile, ce ne serait pas un problème. "
j'espere que ce te conviendra :
PROCEDURE WindowsListeFicRep(Chemin="",Type=3,Trier=Vrai,Tracerúux)
// Récupère la liste des fichiers et des sous répertoires
// du répertoire courant dans une liste
// Type= 1 : répertoires
// 2 : fichiers
// 3 : rep+fichiers
chemin=Minuscule(Remplace(Remplace(Chemin,"\",""),"+",""))
SI Position(chemin,"frepencours()") ALORS
chemin=Remplace(chemin,"frepencours()",fRepEnCours())
FIN
b est entier
Liste est chaîne
Chem est chaîne = chemin
SI chem="" ALORS
// Liste des lecteurs
NbLec est un entier
NbLec = AppelDLL32("kernel32", "GetLogicalDrives")
Valeur est entier
POUR b=1 A 26
SI b=1 ALORS
valeur=1
SINON
Valeur=Puissance(2,b-1)
FIN
SI ( ETBinaire(NbLec, valeur)) = valeur ALORS
SI liste<>"" ALORS liste=liste+RC
liste=liste+Caract(64+b)+":"+TAB+fDisqueInfo(Caract(64+b)+":",fdTypeDisque)
FIN
FIN
WIN32_FIND_DATA est une structure
dwAttrib est un entier
CreeDateB est un entier
CreeDateH est un entier
DerAccB est un entier
DerAccH est un entier
DerEcritB est un entier
DerEcritH est un entier
nFileSizeHigh est un entier
nFileSizeLow est un entier
dwReserve0 est un entier
dwReserve1 est un entier
cFileName est une chaîne ASCIIZ sur 260
cAlternate est une chaîne ASCIIZ sur 14
FIN
WFD est un WIN32_FIND_DATA
lpFileName est une chaîne ASCIIZ sur 255
hFile est un entier = 1
r est un entier = 1
// Ce code vous est offert par Beaussier en ligne
TypeRencontre est entier
MemCrée("ZM_TMPLISTE")
// Déclaration de la recherche à faire
BOUCLE
b++
lpFileName = ExtraitChaîne(chem,b,";")
SI lpFileName=EOT ALORS SORTIR
generique =
ExtraitChaîne(lpFileName,ChaîneOccurrence(lpFileName,"")+1,"")
SI Position(generique,".")<1 ALORS
//si position(chem,"*.*")<1 ALORS
chem=Remplace(chem+"*.*","\","")
generique="*.*"
FIN
SI Position(lpFileName,""+generique)<1 ALORS
lpFileName=lpFileName+""+generique
FIN
hFile = AppelDLL32("kernel32", "FindFirstFileA", &lpFileName, &WFD)
SI hFile<>-1 ALORS
r=1
TANTQUE r
SI WFD:cFileName<>".." ET WFD:cFileName<>"." ALORS
SI
fRep(Remplace(lpFileName,generique,"")+WFD:cFileName,frRépertoire)<>""
ALORS
TypeRencontre=1
SINON
TypeRencontre=2
FIN
SI Tracer ALORS
Message(Remplace(lpFileName,generique,"")+WFD:cFileName)
Multitâche(-1)
FIN
SI TypeRencontre=type OU type=3 ALORS
SI Trier ALORS
MemRecherche("ZM_TMPLISTE",TypeRencontre+Remplace(lpFileName,generique,"")+WFD:cFileName)
SI MemEnDehors("ZM_TMPLISTE") ALORS
// liste=liste+remplace(lpFileName,"*.*","")+WFD:cFileName
SI TypeRencontre=1 ALORS
// Répertoire
MemAjoute("ZM_TMPLISTE",TypeRencontre+Remplace(lpFileName,generique,"")+WFD:cFileName,Remplace(lpFileName,generique,"")+WFD:cFileName+TAB+"R")
SINON
// Fichier
MemAjoute("ZM_TMPLISTE",TypeRencontre+Remplace(lpFileName,generique,"")+WFD:cFileName,Remplace(lpFileName,generique,"")+WFD:cFileName+TAB+"F")
FIN
MemTrie("ZM_TMPLISTE")
FIN
SINON
SI liste<>"" ALORS liste = liste+RC
SI TypeRencontre=1 ALORS
liste=liste+Remplace(lpFileName,generique,"")+WFD:cFileName+TAB+"R"
SINON
liste=liste+Remplace(lpFileName,generique,"")+WFD:cFileName+TAB+"F"
FIN
FIN
FIN
FIN
r = AppelDLL32("kernel32", "FindNextFileA", hFile, &WFD)
FIN
FIN
r = AppelDLL32("kernel32", "FindClose", hFile)
FIN
SI Tracer ALORS
Message()
FIN
SI Trier
MemPremier("ZM_TMPLISTE")
TANTQUE PAS MemEnDehors("ZM_TMPLISTE")
SI liste<>"" ALORS liste = liste+RC
liste=liste+MemRécupère("ZM_TMPLISTE",MemEnCours("ZM_TMPLISTE"))
MemSuivant("ZM_TMPLISTE")
FIN
FIN
MemSupprimeTout("ZM_TMPLISTE")
RENVOYER Remplace(liste,"\","")
--
Pierre BOUSQUET
" Ne me dites pas que ce problème est difficile.
S'il n'était pas difficile, ce ne serait pas un problème. "
j'espere que ce te conviendra : PROCEDURE WindowsListeFicRep(Chemin="",Type=3,Trier=Vrai,Tracerúux) // Récupère la liste des fichiers et des sous répertoires // du répertoire courant dans une liste // Type= 1 : répertoires // 2 : fichiers // 3 : rep+fichiers chemin=Minuscule(Remplace(Remplace(Chemin,"",""),"+","")) SI Position(chemin,"frepencours()") ALORS chemin=Remplace(chemin,"frepencours()",fRepEnCours()) FIN b est entier Liste est chaîne Chem est chaîne = chemin
SI chem="" ALORS // Liste des lecteurs NbLec est un entier NbLec = AppelDLL32("kernel32", "GetLogicalDrives") Valeur est entier
POUR b=1 A 26 SI b=1 ALORS valeur=1 SINON Valeur=Puissance(2,b-1) FIN SI ( ETBinaire(NbLec, valeur)) = valeur ALORS SI liste<>"" ALORS liste=liste+RC liste=liste+Caract(64+b)+":"+TAB+fDisqueInfo(Caract(64+b)+":",fdTypeDisque) FIN FIN
WIN32_FIND_DATA est une structure dwAttrib est un entier CreeDateB est un entier CreeDateH est un entier DerAccB est un entier DerAccH est un entier DerEcritB est un entier DerEcritH est un entier nFileSizeHigh est un entier nFileSizeLow est un entier dwReserve0 est un entier dwReserve1 est un entier cFileName est une chaîne ASCIIZ sur 260 cAlternate est une chaîne ASCIIZ sur 14 FIN
WFD est un WIN32_FIND_DATA lpFileName est une chaîne ASCIIZ sur 255 hFile est un entier = 1 r est un entier = 1 // Ce code vous est offert par Beaussier en ligne TypeRencontre est entier
MemCrée("ZM_TMPLISTE")
// Déclaration de la recherche à faire BOUCLE b++ lpFileName = ExtraitChaîne(chem,b,";") SI lpFileName=EOT ALORS SORTIR
generique = ExtraitChaîne(lpFileName,ChaîneOccurrence(lpFileName,"")+1,"") SI Position(generique,".")<1 ALORS //si position(chem,"*.*")<1 ALORS chem=Remplace(chem+"*.*","","") generique="*.*" FIN
SI Position(lpFileName,""+generique)<1 ALORS lpFileName=lpFileName+""+generique FIN
hFile = AppelDLL32("kernel32", "FindFirstFileA", &lpFileName, &WFD) SI hFile<>-1 ALORS r=1 TANTQUE r SI WFD:cFileName<>".." ET WFD:cFileName<>"." ALORS SI fRep(Remplace(lpFileName,generique,"")+WFD:cFileName,frRépertoire)<>"" ALORS TypeRencontre=1 SINON TypeRencontre=2 FIN
SI Tracer ALORS Message(Remplace(lpFileName,generique,"")+WFD:cFileName) Multitâche(-1) FIN
SI TypeRencontre=type OU type=3 ALORS SI Trier ALORS MemRecherche("ZM_TMPLISTE",TypeRencontre+Remplace(lpFileName,generique,"")+WFD:cFileName) SI MemEnDehors("ZM_TMPLISTE") ALORS // liste=liste+remplace(lpFileName,"*.*","")+WFD:cFileName
SI TypeRencontre=1 ALORS // Répertoire MemAjoute("ZM_TMPLISTE",TypeRencontre+Remplace(lpFileName,generique,"")+WFD:cFileName,Remplace(lpFileName,generique,"")+WFD:cFileName+TAB+"R") SINON // Fichier MemAjoute("ZM_TMPLISTE",TypeRencontre+Remplace(lpFileName,generique,"")+WFD:cFileName,Remplace(lpFileName,generique,"")+WFD:cFileName+TAB+"F") FIN MemTrie("ZM_TMPLISTE") FIN SINON SI liste<>"" ALORS liste = liste+RC SI TypeRencontre=1 ALORS liste=liste+Remplace(lpFileName,generique,"")+WFD:cFileName+TAB+"R" SINON liste=liste+Remplace(lpFileName,generique,"")+WFD:cFileName+TAB+"F" FIN FIN FIN FIN r = AppelDLL32("kernel32", "FindNextFileA", hFile, &WFD) FIN FIN r = AppelDLL32("kernel32", "FindClose", hFile) FIN
SI Tracer ALORS Message() FIN
SI Trier MemPremier("ZM_TMPLISTE") TANTQUE PAS MemEnDehors("ZM_TMPLISTE") SI liste<>"" ALORS liste = liste+RC liste=liste+MemRécupère("ZM_TMPLISTE",MemEnCours("ZM_TMPLISTE")) MemSuivant("ZM_TMPLISTE") FIN FIN MemSupprimeTout("ZM_TMPLISTE")
RENVOYER Remplace(liste,"","")
-- Pierre BOUSQUET
" Ne me dites pas que ce problème est difficile. S'il n'était pas difficile, ce ne serait pas un problème. "
Fabrice Guillaume
Bonjour Pierre,
Je te remercie pour ce bout de code, toutefois.... pourrais tu m'expliquer un peu plus. Ceci est une procédure local, global ? Tout ce code est à mettre dans la procédure ? Quel objet appelle cette procédure ? Peux tu m'en dire davantage. Je te remercie par avance
Bonne journée et bon week end
Cordialement
Fabrice
Bonjour Pierre,
Je te remercie pour ce bout de code, toutefois.... pourrais tu m'expliquer
un peu plus.
Ceci est une procédure local, global ? Tout ce code est à mettre dans la
procédure ? Quel objet appelle cette procédure ? Peux tu m'en dire
davantage.
Je te remercie par avance
Je te remercie pour ce bout de code, toutefois.... pourrais tu m'expliquer un peu plus. Ceci est une procédure local, global ? Tout ce code est à mettre dans la procédure ? Quel objet appelle cette procédure ? Peux tu m'en dire davantage. Je te remercie par avance
Bonne journée et bon week end
Cordialement
Fabrice
Pierre BOUSQUET
j'ai créé un arbre, à l'init j'appelle la procédure avec chemin="", il me liste alors tous les disques. Pour chaque disque j'ajoute dans l'arbre un fils ".", par exemple arbreajoute(monarbre,"c:") arbreajoute(monarbre,"c:"+TAB+".")
lorsque l'utilisateur ouvre l'arbre c:, je détecte que le 1er fils est un point, j'execute alors de nouveau la procedure avec comme chemin la valeur de l'arbre (c:), je supprime le fils "." et alimente avec les valeurs retournées par la fonction et ainsi de suite jusqu'à ce que la fonction me renvoie une chaine vide.
En fait l'arboresence des disques et répertoires et recherchées en fonction des clics de l'utilisateur
Suis-je clair ?
Fabrice Guillaume vient de nous annoncer :
Bonjour Pierre,
Je te remercie pour ce bout de code, toutefois.... pourrais tu m'expliquer un peu plus. Ceci est une procédure local, global ? Tout ce code est à mettre dans la procédure ? Quel objet appelle cette procédure ? Peux tu m'en dire davantage. Je te remercie par avance
Bonne journée et bon week end
Cordialement
Fabrice
-- Pierre BOUSQUET
" Ne me dites pas que ce problème est difficile. S'il n'était pas difficile, ce ne serait pas un problème. "
j'ai créé un arbre, à l'init j'appelle la procédure avec chemin="", il
me liste alors tous les disques. Pour chaque disque j'ajoute dans
l'arbre un fils ".", par exemple
arbreajoute(monarbre,"c:")
arbreajoute(monarbre,"c:"+TAB+".")
lorsque l'utilisateur ouvre l'arbre c:, je détecte que le 1er fils est
un point, j'execute alors de nouveau la procedure avec comme chemin la
valeur de l'arbre (c:), je supprime le fils "." et alimente avec les
valeurs retournées par la fonction et ainsi de suite jusqu'à ce que la
fonction me renvoie une chaine vide.
En fait l'arboresence des disques et répertoires et recherchées en
fonction des clics de l'utilisateur
Suis-je clair ?
Fabrice Guillaume vient de nous annoncer :
Bonjour Pierre,
Je te remercie pour ce bout de code, toutefois.... pourrais tu m'expliquer
un peu plus.
Ceci est une procédure local, global ? Tout ce code est à mettre dans la
procédure ? Quel objet appelle cette procédure ? Peux tu m'en dire
davantage.
Je te remercie par avance
Bonne journée et bon week end
Cordialement
Fabrice
--
Pierre BOUSQUET
" Ne me dites pas que ce problème est difficile.
S'il n'était pas difficile, ce ne serait pas un problème. "
j'ai créé un arbre, à l'init j'appelle la procédure avec chemin="", il me liste alors tous les disques. Pour chaque disque j'ajoute dans l'arbre un fils ".", par exemple arbreajoute(monarbre,"c:") arbreajoute(monarbre,"c:"+TAB+".")
lorsque l'utilisateur ouvre l'arbre c:, je détecte que le 1er fils est un point, j'execute alors de nouveau la procedure avec comme chemin la valeur de l'arbre (c:), je supprime le fils "." et alimente avec les valeurs retournées par la fonction et ainsi de suite jusqu'à ce que la fonction me renvoie une chaine vide.
En fait l'arboresence des disques et répertoires et recherchées en fonction des clics de l'utilisateur
Suis-je clair ?
Fabrice Guillaume vient de nous annoncer :
Bonjour Pierre,
Je te remercie pour ce bout de code, toutefois.... pourrais tu m'expliquer un peu plus. Ceci est une procédure local, global ? Tout ce code est à mettre dans la procédure ? Quel objet appelle cette procédure ? Peux tu m'en dire davantage. Je te remercie par avance
Bonne journée et bon week end
Cordialement
Fabrice
-- Pierre BOUSQUET
" Ne me dites pas que ce problème est difficile. S'il n'était pas difficile, ce ne serait pas un problème. "
Fabrice Guillaume
Oui très clair, je te remercie et te souhaite un très bon week end
Salutations
Fabrice
"Pierre BOUSQUET" a écrit dans le message de news:
j'ai créé un arbre, à l'init j'appelle la procédure avec chemin="", il me liste alors tous les disques. Pour chaque disque j'ajoute dans l'arbre un fils ".", par exemple arbreajoute(monarbre,"c:") arbreajoute(monarbre,"c:"+TAB+".")
lorsque l'utilisateur ouvre l'arbre c:, je détecte que le 1er fils est un point, j'execute alors de nouveau la procedure avec comme chemin la valeur de l'arbre (c:), je supprime le fils "." et alimente avec les valeurs retournées par la fonction et ainsi de suite jusqu'à ce que la fonction me renvoie une chaine vide.
En fait l'arboresence des disques et répertoires et recherchées en fonction des clics de l'utilisateur
Suis-je clair ?
Fabrice Guillaume vient de nous annoncer : > Bonjour Pierre, > > Je te remercie pour ce bout de code, toutefois.... pourrais tu
m'expliquer
> un peu plus. > Ceci est une procédure local, global ? Tout ce code est à mettre dans la > procédure ? Quel objet appelle cette procédure ? Peux tu m'en dire > davantage. > Je te remercie par avance > > Bonne journée et bon week end > > Cordialement > > Fabrice
-- Pierre BOUSQUET
" Ne me dites pas que ce problème est difficile. S'il n'était pas difficile, ce ne serait pas un problème. "
Oui très clair, je te remercie et te souhaite un très bon week end
Salutations
Fabrice
"Pierre BOUSQUET" <pb4807@hotmail.com> a écrit dans le message de news:
mn.333b7d61c15a2eb1.47088@hotmail.com...
j'ai créé un arbre, à l'init j'appelle la procédure avec chemin="", il
me liste alors tous les disques. Pour chaque disque j'ajoute dans
l'arbre un fils ".", par exemple
arbreajoute(monarbre,"c:")
arbreajoute(monarbre,"c:"+TAB+".")
lorsque l'utilisateur ouvre l'arbre c:, je détecte que le 1er fils est
un point, j'execute alors de nouveau la procedure avec comme chemin la
valeur de l'arbre (c:), je supprime le fils "." et alimente avec les
valeurs retournées par la fonction et ainsi de suite jusqu'à ce que la
fonction me renvoie une chaine vide.
En fait l'arboresence des disques et répertoires et recherchées en
fonction des clics de l'utilisateur
Suis-je clair ?
Fabrice Guillaume vient de nous annoncer :
> Bonjour Pierre,
>
> Je te remercie pour ce bout de code, toutefois.... pourrais tu
m'expliquer
> un peu plus.
> Ceci est une procédure local, global ? Tout ce code est à mettre dans la
> procédure ? Quel objet appelle cette procédure ? Peux tu m'en dire
> davantage.
> Je te remercie par avance
>
> Bonne journée et bon week end
>
> Cordialement
>
> Fabrice
--
Pierre BOUSQUET
" Ne me dites pas que ce problème est difficile.
S'il n'était pas difficile, ce ne serait pas un problème. "
Oui très clair, je te remercie et te souhaite un très bon week end
Salutations
Fabrice
"Pierre BOUSQUET" a écrit dans le message de news:
j'ai créé un arbre, à l'init j'appelle la procédure avec chemin="", il me liste alors tous les disques. Pour chaque disque j'ajoute dans l'arbre un fils ".", par exemple arbreajoute(monarbre,"c:") arbreajoute(monarbre,"c:"+TAB+".")
lorsque l'utilisateur ouvre l'arbre c:, je détecte que le 1er fils est un point, j'execute alors de nouveau la procedure avec comme chemin la valeur de l'arbre (c:), je supprime le fils "." et alimente avec les valeurs retournées par la fonction et ainsi de suite jusqu'à ce que la fonction me renvoie une chaine vide.
En fait l'arboresence des disques et répertoires et recherchées en fonction des clics de l'utilisateur
Suis-je clair ?
Fabrice Guillaume vient de nous annoncer : > Bonjour Pierre, > > Je te remercie pour ce bout de code, toutefois.... pourrais tu
m'expliquer
> un peu plus. > Ceci est une procédure local, global ? Tout ce code est à mettre dans la > procédure ? Quel objet appelle cette procédure ? Peux tu m'en dire > davantage. > Je te remercie par avance > > Bonne journée et bon week end > > Cordialement > > Fabrice
-- Pierre BOUSQUET
" Ne me dites pas que ce problème est difficile. S'il n'était pas difficile, ce ne serait pas un problème. "