IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Afficher une barre de progression durant la copie de fichier avec CopyFileExA


Sujet :

WinDev

  1. #1
    Membre éprouvé Avatar de wimbish
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 416
    Points : 1 073
    Points
    1 073
    Par défaut Afficher une barre de progression durant la copie de fichier avec CopyFileExA
    Bonjour,

    J'essaye d'afficher une barre de progression durant la copie de mes fichier.
    Actuellement j'utilise ce bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result_dll = API("kernel32","CopyFileExA" , &lpExistingFileName, &lpNewFileName,&CallBackProgress, Null,Null,0x00001000)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    PROCEDURE CallBackProgress(TotalFileSize est un entier système ,TotalBytesTransferred est un entier système ,StreamSize est un entier système,StreamBytesTransferred est un entier système, dwStreamNumber est un entier système,dwCallbackReason est un entier système,hSourceFile est un entier système,hDestinationFile est un entier système,lpData est un entier système)
     
    LIB_Libellé1 = NumériqueVersChaîne(PartieEntière((StreamSize * 10000) / (TotalFileSize * 10000) * 100)) + "% complete....."+TotalBytesTransferred+"++"+StreamSize
    {JAUGE_Jauge1..Nom,indChamp}..BorneMin = 0
    {JAUGE_Jauge1..Nom,indChamp}..BorneMax = TotalFileSize
    {JAUGE_Jauge1..Nom,indChamp}..Valeur = StreamSize
    RENVOYER 0
    J'aimerais envoyer le nom de la jauge en paramètre à la fonction CallBackProgress (pour afficher la progression dans une table) et jusque-là présent aucuns résultat !!

    En théorie on doit utiliser "lpData" mais je n'y arrive pas.
    De plus, les valeurs de paramètres de la fonction de callback en débogage me semble curieux, la syntaxe n'est peut être pas bonne.

    Quelqu'un aurait il une idée ?
    (Ou un bout de code plus propre pour faire cela ?)

    Merci d'avance.
    Christophe.

    Tous les chemins mènent à Rome http://doc.pcsoft.fr/fr-FR/

  2. #2
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Il semble me souvenir d'un bout de code avec les _eve afin de permettre l'affichage de la jauge. Il faudrait que je fasse une recherche dans les "vieux" codes que j'ai chez moi.
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  3. #3
    Membre éprouvé Avatar de wimbish
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 416
    Points : 1 073
    Points
    1 073
    Par défaut
    Merci,
    Il n'y a pas d'urgence
    Christophe.

    Tous les chemins mènent à Rome http://doc.pcsoft.fr/fr-FR/

  4. #4
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    726
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 726
    Points : 1 645
    Points
    1 645
    Par défaut
    Bonjour,

    Si fCopieFichier avec frJauge ne vous convient pas, alors voici quelques remarques :
    - LARGE_INTEGER n'est pas un entier système, c'est un entier sur 8. En mode 32 bits et passé par valeur, ça fait une différence.
    - DWORD c'est un entier tout court (donc sur 4). En fait c'est un entier sans signe exactement.
    - OK pour HANDLE et les pointeurs, là c'est des entiers système.
    - Attention au jour où vous passerez en Unicode, il faudra alors utiliser CopyFileExW.
    - lpData n'est qu'une donnée libre, servant à retrouver un contexte, ce que WinDev fait déjà tout seul.
    - Bien que Null soit converti implicitement en 0, il n'a pas grand chose à voir avec le NULL de l'API, qui lui est un vrai 0 (entier valant 0).
    - Quel est l'intérêt d'écrire {JAUGE_Jauge1..Nom,indChamp} au lieu de JAUGE_Jauge1 ? Aucun je présume.

    Je n'ai pas le temps de regarder plus en détail ni de tester moi-même.
    Mais déjà en utilisant des entiers sur 8 aux bons endroits ça devrait marcher mieux, non ?

  5. #5
    Membre éprouvé Avatar de wimbish
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 416
    Points : 1 073
    Points
    1 073
    Par défaut
    Merci Hibernatus34,

    Avec les bons types cela fonctionne nettement mieux.

    pour info:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sNomJauge est une chaîne = JAUGE_Jauge1..Nom
    Result_dll = API("kernel32","CopyFileExA" , &lpExistingFileName, &lpNewFileName,&CallBackProgress,sNomJauge,Null,0x00001000)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    PROCEDURE CallBackProgress(TotalFileSize est un entier sur 8 octets ,TotalBytesTransferred est un entier sur 8 octets ,StreamSize est un entier sur 8 octets,StreamBytesTransferred est un entier sur 8 octets, dwStreamNumber est un entier sur 4 octets,dwCallbackReason est un entier sur 4 octets,hSourceFile est un entier système,hDestinationFile est un entier système,lpData est une chaîne)
     
    {lpData,indChamp}..BorneMin = 0
    {lpData,indChamp}..BorneMax = TotalFileSize
    {lpData,indChamp}..Valeur = TotalBytesTransferred
    Ps : Dans l'appel de l'API, JAUGE_Jauge1 ne passe pas alors que JAUGE_Jauge1..Nom qui est explicitement une chaîne passe bien.
    Christophe.

    Tous les chemins mènent à Rome http://doc.pcsoft.fr/fr-FR/

  6. #6
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 953
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 953
    Points : 9 283
    Points
    9 283
    Par défaut
    Bonjour,

    Gilles sur un forum de code source avait fourni ceci :

    Pour ceux que ça interesse, j'ai fini par le faire avec l'API et une
    callback de fonction Windev.
    C'est performant, interruptible, on peut mettre en pause et
    reprendre...
    code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    FONCTION fCopieFic(sSource est une chaîne,sDest est une chaîne)
    sLocSource             est une chaîne=sSource
    sLocDest             est une chaîne=sDest
    bRetourApi             est un booléen
    nExistingFileName     est un entier=&sLocSource //Ici l'adresse de la
    chaine, pourrait être la chaine en direct
    nNewFileName         est un entier=&sLocDest //Ici l'adresse de la chaine,
    pourrait être la chaine en direct
    nData                 est un entier
    nCancel             est un entier
    nCopyFlags            est un entier
    bRetourApi=API("KERNEL32","CopyFileExA",nExistingFileName,nNewFileName,&fCopyProgressRoutine
    ,nData,nCancel ,nCopyFlags)
    RENVOYER bRetourApi
    et la callback :
    FONCTION fCopyProgressRoutine(nTotalFileSize est un entier sur 8
    octets,nTotalBytesTransferred est un entier sur 8 octets,nStreamSize
    est un entier sur 8 octets,nStreamBytesTransferred est un entier sur 8
    octets,nStreamNumber est un entier sans signe sur 4
    octets,nCallbackReason est un entier sans signe sur 4
    octets,hSourceFile est un entier,hDestinationFile est un entier)
    Jauge(nTotalBytesTransferred,nTotalFileSize)
    //Annulation de la copie
    //Pour les autres paramètres voir la MSDN
    //http://msdn.microsoft.com/en-us/library/aa363854(VS.85).aspx
    SI ToucheEnfoncée(teEchap,Faux) ALORS
        RENVOYER 1
    FIN
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  7. #7
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    726
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 726
    Points : 1 645
    Points
    1 645
    Par défaut
    Citation Envoyé par wimbish Voir le message
    Ps : Dans l'appel de l'API, JAUGE_Jauge1 ne passe pas alors que JAUGE_Jauge1..Nom qui est explicitement une chaîne passe bien.
    Si la callback est une procédure de fenêtre, les champs de la fenêtres doivent être accessibles. C'est le cas dans WD17, j'ai testé. Peut-être pas dans WD14 ?

  8. #8
    Membre éprouvé Avatar de wimbish
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 416
    Points : 1 073
    Points
    1 073
    Par défaut
    J'utilise l'indirection dans la procédure de callback car la procédure sera globale

    j'utilise JAUGE_Jauge1..Nom dans l'appel de la fonction API car la valeur attendu est la chaîne "JAUGE_Jauge1" et pas la valeur de la jauge.

    L'utilisation du ..Nom est une habitude afin de ne pas avoir de surprise avec certain champ et cela rend le code plus clair (selon moi)
    Christophe.

    Tous les chemins mènent à Rome http://doc.pcsoft.fr/fr-FR/

  9. #9
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    726
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 726
    Points : 1 645
    Points
    1 645
    Par défaut
    D'accord, je n'avais pas compris que c'était voulu pour la rendre globale.
    C'est à cause du premier code où le nom de la jauge était en dur dans la callback.

  10. #10
    Membre éprouvé Avatar de wimbish
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 416
    Points : 1 073
    Points
    1 073
    Par défaut
    Mea Culpa, c’était un bout de code de test.
    Je comprend que ça t'ai interloqué.
    Christophe.

    Tous les chemins mènent à Rome http://doc.pcsoft.fr/fr-FR/

Discussions similaires

  1. Réponses: 11
    Dernier message: 14/01/2009, 12h03
  2. Afficher une barre de progression
    Par paradeofphp dans le forum ASP.NET
    Réponses: 10
    Dernier message: 24/12/2007, 10h19
  3. Afficher une barre de progression
    Par paradeofphp dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 29/08/2007, 20h42
  4. [Formulaire] Afficher une barre de progression
    Par JohnDoeVS dans le forum IHM
    Réponses: 1
    Dernier message: 28/03/2007, 22h16
  5. Afficher une barre de progression en upload
    Par illuzmax dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 06/06/2006, 13h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo