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

 Delphi Discussion :

copier des fichiers avec progressbar


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 42
    Points : 18
    Points
    18
    Par défaut copier des fichiers avec progressbar
    bonsoir a tous

    j'ai chercher sur le net des codes exemples et j'ai fini par trouver celui la qui marche bien et selon mon besoin .

    le problème est que le progressbar ne marche pas avec la copie des fichiers comment je dois procéder pour faire marcher le progressbar en même temps avec la copie exacte des fichiers merci .

    voila mon 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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    Procedure CopyFiles(From , Dest:String);
    var
    F : TShFileOpStruct;
    begin
    F.Wnd := 0;
    F.wFunc := FO_COPY;
    F.pFrom := PCHAR(From);
    F.pTo := PCHAR(Dest);
    F.fFlags := FOF_ALLOWUNDO or FOF_RENAMEONCOLLISION;
    if ShFileOperation(F) <> 0 then ShowMessage('Copy Failed');
     
    end;
     
     
     
    procedure TForm1.AdvGlowButton1Click(Sender: TObject);
    begin
    progressbar1.Visible:=true;
    timer1.Enabled:=true;
    CopyFiles('F:\test1\*.jpg', 'F:\test2\');
    CopyFiles('F:\test1\*.pdf', 'F:\test2\');
    CopyFiles('F:\test1\*.xls', 'F:\test2\');
     
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    progressbar1.Position:=0;
    end;
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    ProgressBar1.Position := ProgressBar1.Position + 1;
    if progressbar1.Position=100 then begin
     
      progressbar1.Position:=0;
      progressbar1.Visible:=false;
      timer1.Enabled:=false;
      showmessage('La Sauvegarde a été Faite avec success ! ');
      end;
    end;

  2. #2
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 346
    Points : 3 124
    Points
    3 124
    Par défaut
    Bonjour

    Question déjà posée sur le forum :

    http://www.developpez.net/forums/d51...r-progressbar/

    A+

    Charly

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 699
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 699
    Points : 13 138
    Points
    13 138
    Par défaut
    Tu n'es pas en FOF_SILENT. Tu as donc déjà une boîte de dialogue avec barre de progression. Pourquoi une deuxième
    De plus, ShFileOperation accepte une liste de fichiers (wildcard inclus). Inutile de la lancer plusieurs fois

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Tu n'es pas en FOF_SILENT. Tu as donc déjà une boîte de dialogue avec barre de progression. Pourquoi une deuxième
    De plus, ShFileOperation accepte une liste de fichiers (wildcard inclus). Inutile de la lancer plusieurs fois
    un exemple serais bien plus simple que ce que tu es entrain de dire j'ai compris mais j'ai pas réussi a le faire avec une seule ligne
    avant j'ai utilisé une autre méthode qui ne m'a pas permis d'utiliser un seul bouton pour récupérer 3 types de fichiers alors j'ai utiliser ShFileOperation pour réduire le nombre des boutons en un seul

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 699
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 699
    Points : 13 138
    Points
    13 138
    Par défaut
    Citation Envoyé par coolirc Voir le message
    un exemple serais bien plus simple que ce que tu es entrain de dire j'ai compris mais j'ai pas réussi a le faire avec une seule ligne
    Non, ici c'est l'inverse : on nous montre ce qui est fait qui ne fonctionne pas et on aide à la correction

    Mais ce qui ne va pas n'est pas la fonction CopyFiles, mais certainement le paramètre pFrom que tu lui passes. ShFileOperation attend un buffer de caractères dont tous les fichiers sont séparés par un #0 (chaîne C). La fin de tableau est marquée aussi par un #0 : fichier1#0fichier2#0fichier3#0#0. Il faut donc simplement appeler CopyFiles ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CopyFiles('F:\test1\*.jpg'#0'F:\test1\*.pdf'#0'F:\test1\*.xls'#0, 'F:\test2');
    Le double #0 final n'est pas utile ici puisque le transtypage en PChar dans la fonction va en ajouter un mais il ne gênerait pas.

    J'attire aussi ton attention qu'un ShowMessage(F.pFrom) n'affichera que F:\test1\*.jpg puisque le premier #0 sera considéré comme une fin de chaîne

  6. #6
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    ah ok merci c'est pour ça que ça fonctionnait pas moi j'ai utilisé des virgules a la place donc c'était ça le problème

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    en fête nous sommes sorti du but du sujet c'est sur j'ai appris comment mettre le code sur une seule ligne pour la copie mais ça n'a pas résolu mon problème de progressbar qui ne marche pas selon le mouvement de la copie des fichiers . et je veux aussi afficher les fichiers dans un TMemo par exemple test1.txt la liste des fichiers copié seront affiché dans un Tmemo

    Comment puis-je procéder merci.

  8. #8
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 699
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 699
    Points : 13 138
    Points
    13 138
    Par défaut
    La seule façon est de générer la liste des fichiers à l'aide de FindFirst, FindNext, ne serait-ce que pour initialiser la barre de progression au nombre de fichiers ou de leurs tailles cumulées.
    Ensuite seulement lancer la copie sur chaque fichier l'un après l'autre avec incrémentation de la ProgressBar et l'affichage dans le mémo à chaque répetition de la boucle.

  9. #9
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    bon j'ai essayé déjà pendant plusieurs heures mais je n'arrive comme même pas a faire fonctionner le progressbar avec le mouvement de la copie j'ai remplacé le TMemo avec un TlistBox et du coup après la copie je lance une fonction qui me liste tout les fichiers disponible sur le dossier de destination

    sinon avec du code ça serais sympas avec des paroles je n'y arrive pas , j'ai ajouter aussi une option Tinifile afin de me permettre de changer le répertoire directement depuis le fichier ini de configuration .

    voila mon nouveau 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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
     
     
    procedure GetFilenames(Path: string ; Dest: TStrings);
    var
    SR: TSearchRec;
    begin
    if FindFirst(Path+'*.*', faAnyFile, SR) = 0 then
    repeat
    Dest.Add(SR.Name);
    until FindNext(SR) <> 0;
    FindClose(SR);
    end;
     
    Procedure CopyFiles(From , Dest:String);
    var
    F : TShFileOpStruct;
    begin
    F.Wnd := 0;
    F.wFunc := FO_COPY;
    F.pFrom := PCHAR(From);
    F.pTo := PCHAR(Dest);
    F.fFlags := FOF_ALLOWUNDO or FOF_RENAMEONCOLLISION;
    if ShFileOperation(F) <> 0 then ShowMessage('Copy Failed');
     
    end;
     
    function ConnectShare(Drive, RemotePath, UserName, Password : String):Integer;
    var
      NRW : TNetResource;
    begin
      with NRW do
      begin
        dwType := RESOURCETYPE_ANY;
        if Drive <> '' then
          lpLocalName := PChar(Drive)
        else
          lpLocalName := nil;
        lpRemoteName := PChar(RemotePath);
        lpProvider := '';
      end;
      Result := WNetAddConnection2(NRW, PChar(Password), PChar(UserName), 0);
    end;
     
    function DisconnectShare(Drive : String):Integer;
    begin
      Result := WNetCancelConnection2(PChar(Drive), 0, false);
    end;
     
    procedure TForm1.AdvGlowButton1Click(Sender: TObject);
    var A,B,C,Y:string;
    begin
    ConnectShare('X:','\\*.*.*.*\*.*.*.*\','Administrateur','*******');
    IniFile := TIniFile.Create('myapp.ini') ;
    iniFile := TIniFile.Create(ChangeFileExt(Application.ExeName,'.ini')) ;
    A := IniFile.ReadString('Config','FromPath','');
    B := IniFile.ReadString('Config','FromPath2','');
    C := IniFile.ReadString('Config','FromPath3','');
    Y := IniFile.ReadString('Config','ToPath','');
    IniFile.Free;
    progressbar1.Visible:=true;
    progressbar1.position := 0;
    progressbar1.Min := 0;
    progressbar1.Max := A.Length;
    Progressbar1.Enabled := True;
    CopyFiles(A,Y);
    progressbar1.Position := A.Length;
    progressbar1.Position := 10;
    progressbar1.Position := 20;
    CopyFiles(B,Y);
    progressbar1.Position := B.Length;
    progressbar1.Position := 30;
    progressbar1.Position := 40;
    CopyFiles(C,Y);
    progressbar1.Position := C.Length;
    progressbar1.Position := 60;
    //CopyFiles('I:\test\*.jpg'#0'I:\test\*.pdf'#0'I:\test\*.xls'#0, 'I:\test2');
    //CopyFileWithProgressBar1('I:\test\1.jpg', 'I:\test2\1.jpg');
    //Memo1.Lines.Add(B+'  '+ 'Copié');
    //Memo1.Lines.Add(C+'  '+ 'Copié');
    GetFilenames(A, ListBox1.Items);
    GetFilenames(B, ListBox1.Items);
    GetFilenames(C, ListBox1.Items);
    Label1.Caption:='La copie a été effectué avec succes';
    MessageDlg('Copie De Fichiers Terminé avec Success',mtCustom,[mbOK,mbClose], 0);
    DisconnectShare('X:');
      end;
     
    procedure TForm1.AdvGlowButton2Click(Sender: TObject);
    begin
    Application.Terminate;
    end;

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/02/2015, 09h52
  2. Réponses: 2
    Dernier message: 19/05/2014, 14h39
  3. Copier des fichiers avec reprise
    Par thomas41 dans le forum C++
    Réponses: 2
    Dernier message: 06/02/2012, 11h47
  4. Copier des fichiers avec une contrainte de date
    Par jejeapollo dans le forum VBScript
    Réponses: 1
    Dernier message: 02/07/2009, 09h43
  5. Copier fichier avec progressbar
    Par marcus333 dans le forum Composants VCL
    Réponses: 7
    Dernier message: 13/09/2005, 20h55

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