PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → aide pour la fonctionnalité drag and drop
aide pour la fonctionnalité drag and drop
Iniciado por alexion, 26,nov. 2019 10:55 - No hay respuesta
Miembro registrado
117 mensajes
Publicado el 26,noviembre 2019 - 10:55
Bonjour à toutes et à tous,

Je développe en ce moment même une fonctionnalité de drag and drop et je me heurte à quelques impondérables liés à mes faibles connaissances en WinDev... je m'explique...

Je cherche à réaliser une opération de drag and drop dans une table permettant à terme de réaliser une copie d'un fichier droppé dans un répertoire cible.

Cependant, parce que ce serait trop facile, ma table est elle même reliée à un champ arbre qui me permet de naviguer entre les répertoires composant un dossier parent :

//A chaque clic sur un élément de l'arbre, on affiche le contenu de l'élément dans la table liée

sUnFichier, sResListeFichier, sStatutCryptage sont des chaînes

//On supprime le contenu de la table
TableSupprimeTout(TABLE_PreviewDuContenuLocal)

// Vérifie si l'arbre n'est pas vide et si une ligne est bien sélectionnée
SI ARBRE_RépertoireLocal..Occurrence = 0 OU ArbreSelect(ARBRE_RépertoireLocal, Vrai) = "" ALORS

//si aucun élément de l'arbre n'a été sélectionné
RETOUR
FIN

//on récupère le contenu de l'élément de l'arbre sélectionné
sLigneSélect est une chaîne = ArbreSelect(ARBRE_RépertoireLocal, Vrai)

//On remplace les tabulations, les escapes et les "II" pour récupérer le format originel du chemin du répertoire sélectionné dans l'arbre
sLigneSélect = Remplace(sLigneSélect, TAB, "\")
sLigneSélect = Remplace(sLigneSélect, ESC, "")
sLigneSélect = Remplace(sLigneSélect, "II", "")
sLigneSélect = Remplace(sLigneSélect, "test://", "C:")

sElement est une chaîne = ExtraitChaîne(sLigneSélect, 1, TAB, DepuisFin)

sElement = ExtraitChaîne(sElement, 1, ESC)

//On récupère la liste de tout les fichiers présents dans le répertoire sélectionné.
// On limite la récupération en ne prenant pas en compte les fichiers cachés et les fichiers présents dans les sous-dossiers
sResListeFichier = fListeFichier(sElement + "\*.*", frSansFichierCaché + frNonRécursif)

//parcours de la liste
POUR TOUTE chaîne sUnFichier de sResListeFichier SEPAREE PAR RC

//nous n'affichons pas les fichiers système
SI fExtraitChemin(sUnFichier,fExtension) <> ".sys" ALORS

//nous n'affichons pas les fichiers ayant pour extension ".lock"
SI fExtraitChemin(sUnFichier, fExtension) <> CONST_LOCK ALORS

//on réalise un calcul sur la taille du fichier pour adapter au mieux son affichage dans la table

//on récupère la taille du fichier exprimé en octets
nTailleFichier est un entier = fTaille(sUnFichier)
sTailleFichier est une chaîne

//si la taille du fichier est strictement inférieure à 1024 octets
SI nTailleFichier < 1024 ALORS

sTailleFichier = NumériqueVersChaîne(nTailleFichier) + " octets"

SINON

//si la taille du fichier est comprise entre 1.024 (compris) et 1.048.578 octets
SI nTailleFichier >= 1024 ET nTailleFichier < 1048579 ALORS

//on divise le total par 1024 et on arrondit à 2 décimales
sTailleFichier = NumériqueVersChaîne(Arrondi(nTailleFichier / 1024,2)) + " Ko"

SINON

//si la taille du fichier est comprise entre 1.048.579 (compris) et 1.073.741.824 octets
SI nTailleFichier >= 1048579 ET nTailleFichier < 1073741824 ALORS

//on divise par 1.048.579 et on arrondit à 2 décimales
sTailleFichier = NumériqueVersChaîne(Arrondi(nTailleFichier / 1048579,2)) + " Mo"

SINON

//si la taille est supérieure ou égale à 1.073.741.824 octets
SI nTailleFichier >= 1073741824 ALORS

//on divise par 1.073.741.824 et on arrondit à 2 décimales
sTailleFichier = NumériqueVersChaîne(Arrondi(nTailleFichier / 1073741824,2)) + " Go"

FIN
FIN
FIN
FIN

//on lit le contenu du statut de cryptage du fichier ".lock" correspondant et on l'enregistre dans une variable
sStatutCryptage = INILit("CRYPT", "STATUS", "", sUnFichier + CONST_LOCK)

SI sStatutCryptage = "CRYPTED" ALORS

//Si le fichier est crypté
TableAjouteLigne(TABLE_PreviewDuContenuLocal, "C:\Mes Projets\P2P\lock.png", fExtraitChemin(sUnFichier,fFichier+fExtension), sTailleFichier, sUnFichier)

SINON

//si le fichier n'est pas crypté
TableAjouteLigne(TABLE_PreviewDuContenuLocal, "C:\Mes Projets\P2P\lock1.png", fExtraitChemin(sUnFichier,fFichier+fExtension), sTailleFichier, sUnFichier)

FIN
FIN
FIN
FIN


Donc, pour chaque clic d'un élément présent dans mon arbre, je modifie le contenu de ma table.
Je cherche à, après avoir afficher le contenu d'un dossier, permettre le drop d'un fichier dans la table et pouvoir récupérer le chemin du répertoire en cours pour y copier le fichier droppé :

//
//INITIALISATION DE TABLE_PREVIEWDUCONTENULOCAL
//

ExplorerAccepte(Vrai,TABLE_PreviewDuContenuLocal)


//
//DROP DEPUIS L'EXPLORATEUR (WM_DROPFILES) SUR TABLE_PREVIEWDUCONTENULOCAL
//

sLigneSélect est une chaîne = ArbreSelect(ARBRE_RépertoireLocal, Vrai)

Trace("1 = " + sLigneSélect)

// Drag and drop avec l'explorateur Windows : activation
gnNumIdentifiantEvenementDragAndDropWindows = Evénement(RecupFichiers_DND_Windows,TABLE_PreviewDuContenuLocal..NomComplet,WM_DROPFILES)


et ma fonction RecupFichiers_DND_Windows() :

Procedure RecupFichiers_DND_Windows()

// Nombre de fichiers posés dans l'application par Drag and Drop
nbFic est un entier = ExplorerRécupère(_EVE.wParam)
sNomFic est une chaîne
// Récupération de tous les fichiers
i est un entier
POUR i = 1 À nbFic
sNomFic=ExplorerRécupère(_EVE.wParam,i)
Trace(sNomFic)

//réaliser code d'ajout du fichier dans le répertoire cible

// Ajoute le fichier
TableAjouteLigne(TABLE_PreviewDuContenuLocal,sNomFic, sNomFic)
FIN

// Positionne la table en fin
TablePosition(TABLE_PreviewDuContenuLocal, TABLE_PreviewDuContenuLocal..Occurrence)


après test, lors d'un premier drop, ma trace affiche "1 = test://<ESC>I<ESC>I<TAB>test<ESC>I<ESC>I<TAB>archives<ESC>I<ESC>I" (si j'essaie de dropper un fichier dans le répertoire test://test/archive). Cependant, le drop ne s'effectue pas et lors des drops suivants, ils s'affichent dans ma table mais la fonction trace en renvoie plus rien.

Je n'ai pas beaucoup d'expérience en WinDev et je bloque un peu sur ça, merci d'avance