Plusieurs actions pour un meme bouton

Signaler
Messages postés
18
Date d'inscription
vendredi 15 mai 2015
Statut
Membre
Dernière intervention
25 décembre 2015
-
Messages postés
106
Date d'inscription
mardi 19 mai 2015
Statut
Membre
Dernière intervention
8 mai 2020
-
Bonjour,
j'essai depuis plusieurs jour de trouver une solution à mon problème.
je vous explique

J'ai une forme avec 3 boutons faisant appel à des fichiers excel sur un serveur,
je les copies et les ouvrent en fonction du bouton.
Jusque la pas de problème en revanche ces fichiers étant long à charger et à ouvrir j'aimerai ajouter une barre de chargement qui doit s'activer dès que le click à été fait sur un bouton et la je sèche le timer, ne ce lance pas
Voici un bout de mon code, pourriez vous m'aider
Merci D'avance
*

Imports System.IO.File

Public Class Form2
    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        ProgressBar1.Increment(1)
        If ProgressBar1.Value = ProgressBar1.Maximum Then

        End If
    End Sub


    'BOUTON BLANC
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Timer1.Start()
        System.IO.File.Delete("C:\Temp\BLANC.xlsx")
        My.Computer.FileSystem.CopyFile("\\vol1\PRIVATE\BLANC 2015.xlsx", "C:\Temp\BLANC 2015.xlsx")
        Dim Xl 'as Excel.Application\par
        Dim wk 'as Excel.workbook\par
        Xl = CreateObject("Excel.application")
        Xl.Visible = True
        Xl.enableevents = False
        wk = Xl.workbooks.open("C:\Temp\BLANC 2015.xlsx")
        Me.Close()


EDIT: Ajout de la coloration syntaxique.

11 réponses

Messages postés
15652
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
5 mars 2021
516
Bonsoir, quel est l'intervalle du timer?
Est il enabled?
En mode pas à pas est ce que tu passes dans la méthode liée?
Messages postés
18
Date d'inscription
vendredi 15 mai 2015
Statut
Membre
Dernière intervention
25 décembre 2015

Bonsoir, merci pour ta réponse effectivement il n'était pas enabled mais maintenant la progress bar démarre sans action sur mon bouton, 'interval de 300 est correct
Messages postés
15652
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
5 mars 2021
516
Je viens de relire l'aide en ligne.
Start() met enabled à true.

Donc le problème ne venait pas de là.
Essaye en mettant enabled = true à la place de start(), et exécute en pas à pas.

Modérer m'amène à intervenir dans de nombreux posts, mais les seuls langages que je connaisses sont le C# et un peu de VB. Pour vos codes pensez à la coloration.
Réponse trouvée ->Question Résolue
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Bonjour,
C'est dans la procédure click, qu'il faut mettre la propriété enabled du timer à True (pas avant)
On ne sait pas quelle valeur a été donnée à la propriété Maximum de la propgressbar
Le timer continue-t-il à "vivre" sous VB.Net en dépit du Me.close (à la fin du clic sur le bouton) ?

PS : je ne cesserai jamais d'être étonné de ces constatations de progression qui ne constatent finalement pas la progression d'une tâche, mais celle d'une durée écoulée !

Edit :
1) et pourquoi "tuer" le fichier de destination avant de le recréer par la copie ?
Ceci ne marche pas ? :
My.Computer.FileSystem.CopyFile("\\vol1\PRIVATE\BLANC 2015.xlsx", "C:\Temp\BLANC 2015.xlsx", overwrite:= True)

2) et pourquoi une (fausse, en plus) progressbar et non l'utilisation de ce que je vois ici ===>
https://msdn.microsoft.com/fr-fr/library/microsoft.visualbasic.fileio.uioption%28v=vs.110%29.aspx

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
Messages postés
18
Date d'inscription
vendredi 15 mai 2015
Statut
Membre
Dernière intervention
25 décembre 2015

Bonjour, merci pour ton aide,
J'ai besoin de tuer le fichier avant de commencer car celui-ci étant présent avant dans le répertoire temp (suite à une copie antérieure) la copie ne fonctionne pas, effectivement je n'ai pas essaie ta méthode
par contre je veux bien un exemple sur ton point 2 car l'aide microsoft n'ai pas illustrée
Messages postés
7288
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
5 mars 2021
120
Bonjour a tous,

Pour faire patienter l'utilisateur pour une tache dont on ne connaît pas la durée.

voici un exemple:

Public Class Form1
    'http://plasserre.developpez.com/cours/vb-net/?page=ui-winforms5#LVIII-R-2
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Button1.Text = "Start"
        Button2.Text = "Stop"
        ProgressBar1.Style = ProgressBarStyle.Blocks   'indique d'avancer par block
        ProgressBar1.Style = ProgressBarStyle.Continuous 'indique d'avancer progressivement
    End Sub
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        ProgressBar1.Style = ProgressBarStyle.Marquee
    End Sub
    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        ProgressBar1.Style = ProgressBarStyle.Continuous
    End Sub
End Class

Messages postés
18
Date d'inscription
vendredi 15 mai 2015
Statut
Membre
Dernière intervention
25 décembre 2015

Merci pour ton aide je vais voir si cela fonctionne
Messages postés
7288
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
5 mars 2021
120
Mais je ne pense pas que les 2 actions (copie et progressbar) puissent fonctionner ensemble!

il te faudra utiliser un thread:

http://plasserre.developpez.com/cours/vb-net/?page=windows-forms5#LX-R-1
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
par contre je veux bien un exemple sur ton point 2 car l'aide microsoft n'ai pas illustrée

Je ne suis pas vbnettiste (je n'ai même pas vb.net) et ne sais pas ce que tu veux dire par "n'ai pas illustré".
Je me contente de suggérer ce que je déduis de la lecture de MSDN (sur le Net)
Essaye donc ceci :
My.Computer.FileSystem.CopyFile("\\vol1\PRIVATE\BLANC 2015.xlsx", "C:\Temp\BLANC 2015.xlsx", FileIO.UIOption.AllDialogs) 

Il doit toutefois être clair que si le fichier à copier est petit, il sera copié avant même que la progression de la copie n'ait le temps d'apparaître.
________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
Messages postés
7288
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
5 mars 2021
120
ucfoutu,

FileIO.UIOption.AllDialogs


Veut simplement dire qu'une boite de dialogue s'affiche pour t'indiquer que le fichier est déjà présent, si tu veux l'écraser!

Mais comme tu le dis si justement, si la copie est rapide, la progressBar n'aura même pas le temps de s'afficher.
Messages postés
15652
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
5 mars 2021
516
Bonjour les deux remarques d'Uc et Le Pivert sont justes, chacune dans leur contexte:
  • fichier rapidement copié, pas le temps de voir la progresserbar
  • fichier long, le programme peut figer, et ne lancer le timer qu'après la copie => Thread, le backgroundworker est une piste à suivre. J'en ai utilisé un pour une source issue d'une collaboration avec entre autre Uc, c'est en C#, mais le principe est le même http://codes-sources.commentcamarche.net/source/100423-le-jeu-du-boogle


Modérer m'amène à intervenir dans de nombreux posts, mais les seuls langages que je connaisses sont le C# et un peu de VB. Pour vos codes pensez à la coloration.
Réponse trouvée ->Question Résolue
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Je ne sais pas pourquoi, mais plus je lis ce qu'en dit MSDN, plus je suis persuadé de ce que l'utilisation de FileIO.UIOption est ce qui convient et ne nécessite aucune progressbar (déjà incluse).
Mais bon ...

Pour la petite histoire, voilà ce que je ferais personnellement en VB6 (doit pouvoir être facilement transposé en VB.Net) :
une Hscrollbar hscroll1 (avec un max de 100 et un pas de 1) , un bouton de commande Command1 et un label (optionnel) Label1
Aucun Timer ===>>
Code d'un Form :
Private Sub Form_Activate()
Set F = HScroll1
Set L = Label1
HScroll1.Visible = False
End Sub

Private Sub Command1_Click()
Dim Ret As Long
Me.AutoRedraw = True
HScroll1.Visible = True
Ret = CopyFileEx("d:\ucfoutu.txt", "d:\la_bas.txt", AddressOf allons, ByVal 0&, bCancel, COPY_FILE_RESTARTABLE)
HScroll1.Visible = False
Me.Print "Ayé ===>> " + IIf(Ret = 0, "(E C H E C DE LA C O P I E)", "copie réussie")
End Sub


et dans un module .bas
Public Const PROGRESS_CANCEL = 1
Public Const PROGRESS_CONTINUE = 0
Public Const PROGRESS_QUIET = 3
Public Const PROGRESS_STOP = 2
Public Const COPY_FILE_FAIL_IF_EXISTS = &H1
Public Const COPY_FILE_RESTARTABLE = &H2
Public Declare Function CopyFileEx Lib "kernel32.dll" Alias "CopyFileExA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal lpProgressRoutine As Long, lpData As Any, ByRef pbCancel As Long, ByVal dwCopyFlags As Long) As Long
Public bCancel As Long, F As Control, L As Control
Public Function allons(ByVal TotalFileSize As Currency, ByVal TotalBytesTransferred As Currency, ByVal StreamSize As Currency, ByVal StreamBytesTransferred As Currency, ByVal dwStreamNumber As Long, ByVal dwCallbackReason As Long, ByVal hSourceFile As Long, ByVal hDestinationFile As Long, ByVal lpData As Long) As Long
L.Caption = CStr(Int((TotalBytesTransferred * 10000) / (TotalFileSize * 10000) * 100)) + "% complete..."
F.Value = Int((TotalBytesTransferred * 10000) / (TotalFileSize * 10000) * 100)
DoEvents
allons = PROGRESS_CONTINUE
End Function

Voilà ... (et cela constate la progression de la copie et pas celle de la durée).
Te reste plus qu'à trouver un fichier assez lourd (sinon, tu n'auras même pas le temps de voir la progression).
Messages postés
7288
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
5 mars 2021
120
Erreur de ma part ucfoutu.

Tu as tout à fait raison FileIO.UIOption affiche une barre de progression en plus de t'indiquer que le fichier est déjà présent, si tu veux l'écraser!

je me suis servi souvent de ce code sans voir la barre de progression!

Il a fallu que je fasse un essai avec un fichier de 100Mo pour la voir apparaître une fraction de seconde.

Bonne journée

Messages postés
106
Date d'inscription
mardi 19 mai 2015
Statut
Membre
Dernière intervention
8 mai 2020

Si l'opération est longue à traiter je passerai par un background Worker.
A priori l'idée à déjà été donné par Wishmeri.
Perso j'utilise cela pour le traitement d'opération longue et c'est très simple à mettre en place.